Script changes to support Google Fi lab tests

TelLabProjectFiTest.py -- Modified the TelLiveProjectFiTest.py
from Tel/Live and created a new script in the Tel/Lab to support
the Lab callbox testing.

md8475a.py / anrtisu_utils.py - Has changes to support Google Fi
SIM profiles for TMO / SPR & USCC.

TelLabCmasTest.py / TelLabEtwsTest.py  -- Added methods to
change the SIM profiles between TMO / SPR & USCC.

Bug: 127582302
Test: Locally tested the scripts with the callbox. Ran the scripts to
switch the  profile to TMO > ran CMAS / ETWS tests > switched to
SPR / USCC > ran the CMAS / ETWS tests again.

Change-Id: If4b21e204c4203833d519e456180352e0d89a9fd
diff --git a/acts/framework/acts/controllers/anritsu_lib/md8475a.py b/acts/framework/acts/controllers/anritsu_lib/md8475a.py
index 52d4a65..8aeb153 100644
--- a/acts/framework/acts/controllers/anritsu_lib/md8475a.py
+++ b/acts/framework/acts/controllers/anritsu_lib/md8475a.py
@@ -862,7 +862,7 @@
 
         sleep_interval = 1
         sim_model = (self.get_simulation_model()).split(",")
-        #wait 1 more round for GSM because of PS attach
+        # wait 1 more round for GSM because of PS attach
         registration_check_iterations = 2 if sim_model[bts - 1] == "GSM" else 1
         for _ in range(registration_check_iterations):
             waiting_time = 0
@@ -964,6 +964,7 @@
         """
         return self.send_query("TESTSTAT?")
 
+    # Common Default Gateway:
     @property
     def gateway_ipv4addr(self):
         """ Gets the IPv4 address of the default gateway
@@ -989,6 +990,30 @@
         self.send_command(cmd)
 
     @property
+    def gateway_ipv6addr(self):
+        """ Gets the IPv6 address of the default gateway
+
+        Args:
+          None
+
+        Returns:
+            current UE status
+        """
+        return self.send_query("DGIPV6?")
+
+    @gateway_ipv6addr.setter
+    def gateway_ipv6addr(self, ipv6_addr):
+        """ sets the IPv6 address of the default gateway
+        Args:
+            ipv6_addr: IPv6 address of the default gateway
+
+        Returns:
+            None
+        """
+        cmd = "DGIPV6 " + ipv6_addr
+        self.send_command(cmd)
+
+    @property
     def usim_key(self):
         """ Gets the USIM Security Key
 
@@ -3512,6 +3537,86 @@
         self._anritsu = anritsu
         self.log = anritsu.log
 
+    # Default Gateway Selection
+    @property
+    def pdn_DG_selection(self):
+        """ Gets the default gateway for the PDN
+
+        Args:
+          None
+
+        Returns:
+          Current UE status
+        """
+        cmd = "PDNDEFAULTGATEWAY? " + self._pdn_number
+        return self._anritsu.send_query(cmd)
+
+    @pdn_DG_selection.setter
+    def pdn_DG_selection(self, selection):
+        """ Sets the default gateway selection for the PDN
+
+        Args:
+          Selection: COMMON or USER
+
+        Returns:
+          None
+        """
+        cmd = "PDNDEFAULTGATEWAY {},{}".format(self._pdn_number, selection)
+        self._anritsu.send_command(cmd)
+
+    # PDN specific Default Gateway:
+    @property
+    def pdn_gateway_ipv4addr(self):
+        """ Gets the IPv4 address of the default gateway
+
+        Args:
+          None
+
+        Returns:
+            current UE status
+        """
+        cmd = "PDNDGIPV4? " + self._pdn_number
+        return self._anritsu.send_query(cmd)
+
+    @pdn_gateway_ipv4addr.setter
+    def pdn_gateway_ipv4addr(self, ipv4_addr):
+        """ sets the IPv4 address of the default gateway
+
+        Args:
+            ipv4_addr: IPv4 address of the default gateway
+
+        Returns:
+            None
+        """
+        cmd = "PDNDGIPV4 {},{}".format(self._pdn_number, ipv4_addr)
+        self._anritsu.send_command(cmd)
+
+    @property
+    def pdn_gateway_ipv6addr(self):
+        """ Gets the IPv6 address of the default gateway
+
+        Args:
+          None
+
+        Returns:
+            current UE status
+        """
+        cmd = "PDNDGIPV6? " + self._pdn_number
+        return self._anritsu.send_query(cmd)
+
+    @pdn_gateway_ipv6addr.setter
+    def pdn_gateway_ipv6addr(self, ipv6_addr):
+        """ sets the IPv6 address of the default gateway
+
+        Args:
+            ipv6_addr: IPv6 address of the default gateway
+
+        Returns:
+            None
+        """
+        cmd = "PDNDGIPV6 {},{}".format(self._pdn_number, ipv6_addr)
+        self._anritsu.send_command(cmd)
+
     @property
     def ue_address_iptype(self):
         """ Gets IP type of UE for particular PDN
@@ -4152,6 +4257,37 @@
         self._anritsu.send_command(cmd)
 
     @property
+    def fi_cscf_userslist_add(self):
+        """ Get CSCF USERLIST
+
+        Args:
+            None
+
+        Returns:
+            CSCF USERLIST
+        """
+        cmd = "IMSCSCFUSERSLIST? " + self._vnid
+        return self._anritsu.send_query(cmd)
+
+    @fi_cscf_userslist_add.setter
+    def fi_cscf_userslist_add(self, username):
+        """ Set CSCF USER to USERLIST
+            This is needed if IMS AUTH is enabled
+
+        Args:
+            username: CSCF Username
+
+        Returns:
+            None
+        """
+        cmd = "IMSCSCFUSERSLISTADD {},{},00112233445566778899AABBCCDDEEFF,TS34108,AKAV1_MD5,\
+        OPC,00000000000000000000000000000000,8000,TRUE,FALSE,0123456789ABCDEF0123456789ABCDEF,\
+        54CDFEAB9889000001326754CDFEAB98,6754CDFEAB9889BAEFDC457623100132,\
+        326754CDFEAB9889BAEFDC4576231001,TRUE,TRUE,TRUE".format(
+            self._vnid, username)
+        self._anritsu.send_command(cmd)
+
+    @property
     def vzw_cscf_userslist_add(self):
         """ Get CSCF USERLIST
 
diff --git a/acts/framework/acts/test_utils/tel/anritsu_utils.py b/acts/framework/acts/test_utils/tel/anritsu_utils.py
index ca58f3c..61178b5 100644
--- a/acts/framework/acts/test_utils/tel/anritsu_utils.py
+++ b/acts/framework/acts/test_utils/tel/anritsu_utils.py
@@ -15,9 +15,9 @@
 #   limitations under the License.
 
 import time
+
 from queue import Empty
 from datetime import datetime
-
 from acts.controllers.anritsu_lib._anritsu_utils import AnritsuUtils
 from acts.controllers.anritsu_lib.md8475a import BtsNumber
 from acts.controllers.anritsu_lib.md8475a import BtsNwNameEnable
@@ -70,6 +70,9 @@
 P0250Ax = "P0250Ax"
 VzW12349 = "VzW12349"
 P0135Ax = "P0135Ax"
+FiTMO = "FiTMO"
+FiSPR = "FiSPR"
+FiUSCC = "FiUSCC"
 
 # Test PLMN information
 TEST_PLMN_LTE_NAME = "MD8475A_LTE"
@@ -86,6 +89,12 @@
 VzW_MNC = "480"
 TMO_MCC = "310"
 TMO_MNC = "260"
+Fi_TMO_MCC = "310"
+Fi_TMO_MNC = "260"
+Fi_SPR_MCC = "310"
+Fi_SPR_MNC = "120"
+Fi_USCC_MCC = "311"
+Fi_USCC_MNC = "580"
 
 # IP address information for internet sharing
 #GATEWAY_IPV4_ADDR = "192.168.137.1"
@@ -111,6 +120,31 @@
 CSCF_IPV6_ADDR_2 = "2001:0:0:2::2"
 CSCF_IPV6_ADDR_3 = "2001:0:0:3::2"
 
+# Google Fi IP Config:
+
+Fi_GATEWAY_IPV4_ADDR_Data = "100.107.235.94"
+Fi_GATEWAY_IPV6_ADDR_Data = "fe80::aef2:c5ff:fe71:4b9"
+Fi_GATEWAY_IPV4_ADDR_IMS_911 = "192.168.1.2"
+Fi_GATEWAY_IPV6_ADDR_IMS_911 = "2001:0:0:1::2"
+
+Fi_UE_IPV4_ADDR_Data = "100.107.235.81"
+Fi_UE_IPV4_ADDR_IMS = "192.168.1.1"
+Fi_UE_IPV4_ADDR_911 = "192.168.1.11"
+Fi_UE_IPV6_ADDR_Data = "2620::1000:1551:1140:c0f9:d6a8:44eb"
+Fi_UE_IPV6_ADDR_IMS = "2001:0:0:1::1"
+Fi_UE_IPV6_ADDR_911 = "2001:0:0:2::1"
+
+Fi_DNS_IPV4_ADDR_Pri = "8.8.8.8"
+Fi_DNS_IPV4_ADDR_Sec = "8.8.8.4"
+Fi_DNS_IPV6_ADDR = "2001:4860:4860::8888"
+
+Fi_CSCF_IPV4_ADDR_Data = "192.168.1.2"
+Fi_CSCF_IPV6_ADDR_Data = "2001:0:0:1::2"
+Fi_CSCF_IPV4_ADDR_IMS = "192.168.1.2"
+Fi_CSCF_IPV6_ADDR_IMS = "2001:0:0:1::3"
+Fi_CSCF_IPV4_ADDR_911 = "192.168.1.12"
+Fi_CSCF_IPV6_ADDR_911 = "2001:0:0:2::2"
+
 # GSM BAND constants
 GSM_BAND_GSM450 = "GSM450"
 GSM_BAND_GSM480 = "GSM480"
@@ -132,9 +166,32 @@
 DEFAULT_1X_OUTPUT_LEVEL = -35
 DEFAULT_INPUT_LEVEL = 0
 DEFAULT_LTE_BAND = [2, 4]
+Fi_LTE_TMO_BAND = [4]
+Fi_LTE_SPR_BAND = [25]
+Fi_LTE_USCC_BAND = [12]
+Fi_GSM_TMO_BAND = GSM_BAND_PGSM900
 DEFAULT_WCDMA_BAND = 1
 DEFAULT_WCDMA_PACKET_RATE = BtsPacketRate.WCDMA_DLHSAUTO_REL7_ULHSAUTO
 DEFAULT_GSM_BAND = GSM_BAND_GSM850
+
+#Google Fi CDMA Bands
+
+Fi_USCC1X_MCC = 209
+Fi_USCC1X_BAND = 1
+Fi_USCC1X_CH = 600
+Fi_USCC1X_SID = 5
+Fi_USCC1X_NID = 21
+
+Fi_SPR1X_MCC = 320
+Fi_SPR1X_BAND = 1
+Fi_SPR1X_CH = 600
+Fi_SPR1X_SID = 4183
+Fi_SPR1X_NID = 233
+
+Fi_EVDO_BAND = 1
+Fi_EVDO_CH = 625
+Fi_EVDO_SECTOR_ID = "00000000,00000000,00000000,00000000"
+
 DEFAULT_CDMA1X_BAND = 0
 DEFAULT_CDMA1X_CH = 356
 DEFAULT_CDMA1X_SID = 0
@@ -207,6 +264,8 @@
 PDN_NO_1 = 1
 PDN_NO_2 = 2
 PDN_NO_3 = 3
+PDN_NO_4 = 4
+PDN_NO_5 = 5
 
 # IMS Services parameters
 DEFAULT_VNID = 1
@@ -219,6 +278,12 @@
 TMO_USERLIST_NAME = "310260123456789@msg.lab.t-mobile.com"
 VZW_USERLIST_NAME = "001010123456789@test.3gpp.com"
 
+# Google Fi IMS Services parameters
+Fi_CSCF_Monitoring_UA_URI = '"sip:310260971239432@ims.mnc260.mcc310.3gppnetwork.org"'
+Fi_CSCF_Virtual_UA_URI = '"sip:0123456789@msg.pc.t-mobile.com"'
+Fi_CSCF_HOSTNAME = '"ims.mnc260.mcc310.3gppnetwork.org"'
+Fi_USERLIST_NAME = "310260971239432@msg.pc.t-mobile.com"
+
 #Cell Numbers
 CELL_1 = 1
 CELL_2 = 2
@@ -226,7 +291,6 @@
 # default ims virtual network id for Anritsu ims call test.
 DEFAULT_IMS_VIRTUAL_NETWORK_ID = 1
 
-
 def cb_serial_number():
     """ CMAS/ETWS serial number generator """
     i = 0x3000
@@ -255,6 +319,8 @@
         anritsu_handle.send_command("SECURITY3G MILENAGE")
         anritsu_handle.send_command(
             "MILENAGEOP 5F1D289C5D354D0A140C2548F5F3E3BA")
+    elif sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        anritsu_handle.usim_key = "000102030405060708090A0B0C0D0E0F"
 
 
 def save_anritsu_log_files(anritsu_handle, test_name, user_params):
@@ -312,7 +378,7 @@
     bts.nw_fullname = TEST_PLMN_LTE_NAME
     bts.mcc = get_lte_mcc(user_params, cell_no, sim_card)
     bts.mnc = get_lte_mnc(user_params, cell_no, sim_card)
-    bts.band = get_lte_band(user_params, cell_no)
+    bts.band = get_lte_band(user_params, cell_no, sim_card)
     bts.transmode = get_transmission_mode(user_params, cell_no)
     bts.dl_antenna = get_dl_antenna(user_params, cell_no)
     bts.output_level = DEFAULT_OUTPUT_LEVEL
@@ -361,7 +427,7 @@
     bts.nw_fullname = TEST_PLMN_GSM_NAME
     bts.mcc = get_gsm_mcc(user_params, cell_no, sim_card)
     bts.mnc = get_gsm_mnc(user_params, cell_no, sim_card)
-    bts.band = get_gsm_band(user_params, cell_no)
+    bts.band = get_gsm_band(user_params, cell_no, sim_card)
     bts.rac = get_gsm_rac(user_params, cell_no)
     bts.lac = get_gsm_lac(user_params, cell_no)
     bts.output_level = DEFAULT_OUTPUT_LEVEL
@@ -409,6 +475,7 @@
 
 
 def _init_PDN(anritsu_handle,
+              sim_card,
               pdn,
               ipv4,
               ipv6,
@@ -427,21 +494,43 @@
         None
     """
     # Setting IP address for internet connection sharing
-    anritsu_handle.gateway_ipv4addr = GATEWAY_IPV4_ADDR
-    pdn.ue_address_ipv4 = ipv4
-    pdn.ue_address_ipv6 = ipv6
-    if ims_binding:
-        pdn.pdn_ims = Switch.ENABLE
-        pdn.pdn_vnid = vnid_number
-    else:
-        pdn.primary_dns_address_ipv4 = DNS_IPV4_ADDR
-        pdn.secondary_dns_address_ipv4 = DNS_IPV4_ADDR
-        pdn.cscf_address_ipv4 = CSCF_IPV4_ADDR
+    # Google Fi _init_PDN 
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        pdn.ue_address_ipv4 = ipv4
+        pdn.ue_address_ipv6 = ipv6
+        if ims_binding:
+            pdn.pdn_ims = Switch.ENABLE
+            pdn.pdn_vnid = vnid_number
+            pdn.pdn_DG_selection = 'USER'
+            pdn.pdn_gateway_ipv4addr = Fi_GATEWAY_IPV4_ADDR_IMS_911
+            pdn.pdn_gateway_ipv6addr = Fi_GATEWAY_IPV6_ADDR_IMS_911
+
+        else:
+            anritsu_handle.gateway_ipv4addr = Fi_GATEWAY_IPV4_ADDR_Data
+            anritsu_handle.gateway_ipv6addr = Fi_GATEWAY_IPV6_ADDR_Data
+            pdn.primary_dns_address_ipv4 = Fi_DNS_IPV4_ADDR_Pri
+            pdn.secondary_dns_address_ipv4 = Fi_DNS_IPV4_ADDR_Sec
+            pdn.dns_address_ipv6 = Fi_DNS_IPV6_ADDR
+            pdn.cscf_address_ipv4 = Fi_CSCF_IPV4_ADDR_Data
+            pdn.cscf_address_ipv6 = Fi_CSCF_IPV6_ADDR_Data    
+    # Pixel Lab _init_PDN_
+    else:  
+        anritsu_handle.gateway_ipv4addr = GATEWAY_IPV4_ADDR
+        pdn.ue_address_ipv4 = ipv4
+        pdn.ue_address_ipv6 = ipv6
+        if ims_binding:
+            pdn.pdn_ims = Switch.ENABLE
+            pdn.pdn_vnid = vnid_number
+        else:
+            pdn.primary_dns_address_ipv4 = DNS_IPV4_ADDR
+            pdn.secondary_dns_address_ipv4 = DNS_IPV4_ADDR
+            pdn.cscf_address_ipv4 = CSCF_IPV4_ADDR
 
 
 def _init_IMS(anritsu_handle,
               vnid,
               sim_card=None,
+              ipv4_address=CSCF_IPV4_ADDR,
               ipv6_address=CSCF_IPV6_ADDR,
               ip_type="IPV4V6",
               auth=False):
@@ -456,32 +545,52 @@
         None
     """
     # vnid.sync = Switch.ENABLE # supported in 6.40a release
-    vnid.cscf_address_ipv4 = CSCF_IPV4_ADDR
-    vnid.cscf_address_ipv6 = ipv6_address
-    vnid.imscscf_iptype = ip_type
-    vnid.dns = Switch.DISABLE
-    vnid.ndp_nic = NDP_NIC_NAME
-    vnid.ndp_prefix = ipv6_address
-    if sim_card == P0135Ax:
-        vnid.cscf_monitoring_ua = TMO_CSCF_Monitoring_UA_URI
-        vnid.cscf_virtual_ua = TMO_CSCF_Virtual_UA_URI
-        vnid.cscf_host_name = CSCF_HOSTNAME
-        vnid.cscf_precondition = "ENABLE"
-        vnid.cscf_ims_authentication = "DISABLE"
-        if auth:
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        vnid.cscf_address_ipv4 = ipv4_address
+        vnid.cscf_address_ipv6 = ipv6_address
+        vnid.imscscf_iptype = ip_type
+        vnid.dns = Switch.DISABLE
+        vnid.ndp_nic = NDP_NIC_NAME
+        vnid.ndp_prefix = ipv6_address
+        if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+            vnid.cscf_monitoring_ua = Fi_CSCF_Monitoring_UA_URI
+            vnid.cscf_virtual_ua = Fi_CSCF_Virtual_UA_URI
+            vnid.cscf_host_name = Fi_CSCF_HOSTNAME
             vnid.cscf_ims_authentication = "ENABLE"
-            vnid.tmo_cscf_userslist_add = TMO_USERLIST_NAME
-    elif sim_card == VzW12349:
-        vnid.cscf_monitoring_ua = CSCF_Monitoring_UA_URI
-        vnid.cscf_virtual_ua = CSCF_Virtual_UA_URI
-        vnid.cscf_ims_authentication = "DISABLE"
-        if auth:
-            vnid.cscf_ims_authentication = "ENABLE"
-            vnid.vzw_cscf_userslist_add = VZW_USERLIST_NAME
-    else:
-        vnid.cscf_monitoring_ua = CSCF_Monitoring_UA_URI
-    vnid.psap = Switch.ENABLE
-    vnid.psap_auto_answer = Switch.ENABLE
+            if auth:
+                vnid.cscf_ims_authentication = "ENABLE"
+                vnid.fi_cscf_userslist_add = Fi_USERLIST_NAME
+        else:
+            vnid.cscf_monitoring_ua = CSCF_Monitoring_UA_URI
+        vnid.psap = Switch.ENABLE
+        vnid.psap_auto_answer = Switch.ENABLE
+    else:   
+        vnid.cscf_address_ipv4 = CSCF_IPV4_ADDR
+        vnid.cscf_address_ipv6 = ipv6_address
+        vnid.imscscf_iptype = ip_type
+        vnid.dns = Switch.DISABLE
+        vnid.ndp_nic = NDP_NIC_NAME
+        vnid.ndp_prefix = ipv6_address
+        if sim_card == P0135Ax:
+            vnid.cscf_monitoring_ua = TMO_CSCF_Monitoring_UA_URI
+            vnid.cscf_virtual_ua = TMO_CSCF_Virtual_UA_URI
+            vnid.cscf_host_name = CSCF_HOSTNAME
+            vnid.cscf_precondition = "ENABLE"
+            vnid.cscf_ims_authentication = "DISABLE"
+            if auth:
+                vnid.cscf_ims_authentication = "ENABLE"
+                vnid.tmo_cscf_userslist_add = TMO_USERLIST_NAME
+        elif sim_card == VzW12349:
+            vnid.cscf_monitoring_ua = CSCF_Monitoring_UA_URI
+            vnid.cscf_virtual_ua = CSCF_Virtual_UA_URI
+            vnid.cscf_ims_authentication = "DISABLE"
+            if auth:
+                vnid.cscf_ims_authentication = "ENABLE"
+                vnid.vzw_cscf_userslist_add = VZW_USERLIST_NAME
+        else:
+            vnid.cscf_monitoring_ua = CSCF_Monitoring_UA_URI
+        vnid.psap = Switch.ENABLE
+        vnid.psap_auto_answer = Switch.ENABLE
 
 
 def set_system_model_lte_lte(anritsu_handle, user_params, sim_card):
@@ -494,46 +603,93 @@
     Returns:
         Lte and Wcdma BTS objects
     """
-    anritsu_handle.set_simulation_model(BtsTechnology.LTE, BtsTechnology.LTE)
+    anritsu_handle.set_simulation_model(BtsTechnology.LTE,
+                                        BtsTechnology.LTE)
     # setting BTS parameters
     lte1_bts = anritsu_handle.get_BTS(BtsNumber.BTS1)
     lte2_bts = anritsu_handle.get_BTS(BtsNumber.BTS2)
     _init_lte_bts(lte1_bts, user_params, CELL_1, sim_card)
     _init_lte_bts(lte2_bts, user_params, CELL_2, sim_card)
-    pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
-    pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
-    pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
-    # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
-    _init_PDN(anritsu_handle, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
-    _init_PDN(anritsu_handle, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
-    vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
-    if sim_card == P0135Ax:
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        pdn4 = anritsu_handle.get_PDN(PDN_NO_4)
+        pdn5 = anritsu_handle.get_PDN(PDN_NO_5)
+
+        # Initialize PDN IP address for internet connection sharing
+        _init_PDN(anritsu_handle, sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn2, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn4, Fi_UE_IPV4_ADDR_IMS,
+                  Fi_UE_IPV6_ADDR_IMS,
+                  True)
+        _init_PDN(anritsu_handle, sim_card, pdn5, Fi_UE_IPV4_ADDR_911,
+                  Fi_UE_IPV6_ADDR_911,
+                  True)
+        vnid1 = anritsu_handle.get_IMS(1)
         vnid2 = anritsu_handle.get_IMS(2)
-        vnid3 = anritsu_handle.get_IMS(3)
+        # _init_IMS(
+        #     anritsu_handle,
+        #     vnid1,
+        #     sim_card,
+        #     ipv4_address=CSCF_IPV4_ADDR,
+        #     ipv6_address=CSCF_IPV6_ADDR,
+        #     auth=False)
         _init_IMS(
             anritsu_handle,
             vnid1,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR,
+            ipv4_address=Fi_CSCF_IPV4_ADDR_IMS,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_IMS,
             auth=True)
         _init_IMS(
             anritsu_handle,
             vnid2,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_2,
-            ip_type="IPV6")
-        _init_IMS(
-            anritsu_handle,
-            vnid3,
-            sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_3,
-            ip_type="IPV6")
-    elif sim_card == VzW12349:
-        _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+            ipv4_address=Fi_CSCF_IPV4_ADDR_911,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_911,
+            auth=False)
     else:
-        _init_IMS(anritsu_handle, vnid1, sim_card)
-    return [lte1_bts, lte2_bts]
+        _init_lte_bts(lte1_bts, user_params, CELL_1, sim_card)
+        _init_lte_bts(lte2_bts, user_params, CELL_2, sim_card)
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        # Initialize PDN IP address for internet connection sharing
+        _init_PDN(anritsu_handle, sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
+        _init_PDN(anritsu_handle, sim_card, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
+        vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
+        if sim_card == P0135Ax:
+            vnid2 = anritsu_handle.get_IMS(2)
+            vnid3 = anritsu_handle.get_IMS(3)
+            _init_IMS(
+                anritsu_handle,
+                vnid1,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR,
+                auth=True)
+            _init_IMS(
+                anritsu_handle,
+                vnid2,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_2,
+                ip_type="IPV6")
+            _init_IMS(
+                anritsu_handle,
+                vnid3,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_3,
+                ip_type="IPV6")
+        elif sim_card == VzW12349:
+            _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+        else:
+            _init_IMS(anritsu_handle, vnid1, sim_card)
+        return [lte1_bts, lte2_bts]
 
 
 def set_system_model_wcdma_wcdma(anritsu_handle, user_params, sim_card):
@@ -555,7 +711,11 @@
     _init_wcdma_bts(wcdma2_bts, user_params, CELL_2, sim_card)
     pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        _init_PDN(anritsu_handle, sim_card, pdn1, Fi_UE_IPV4_ADDR_Data, Fi_UE_IPV6_ADDR_Data,
+                  False)
+    else:
+        _init_PDN(anritsu_handle, sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
     return [wcdma1_bts, wcdma2_bts]
 
 
@@ -579,35 +739,72 @@
     pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
     pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
-    _init_PDN(anritsu_handle, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
-    _init_PDN(anritsu_handle, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
-    vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
-    if sim_card == P0135Ax:
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        pdn4 = anritsu_handle.get_PDN(PDN_NO_4)
+        pdn5 = anritsu_handle.get_PDN(PDN_NO_5)
+        # Initialize PDN IP address.
+        _init_PDN(anritsu_handle, sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn2, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn4, Fi_UE_IPV4_ADDR_IMS,
+                  Fi_UE_IPV6_ADDR_IMS,
+                  True)
+        _init_PDN(anritsu_handle, sim_card, pdn5, Fi_UE_IPV4_ADDR_911,
+                  Fi_UE_IPV6_ADDR_911,
+                  True)
+        vnid1 = anritsu_handle.get_IMS(1)
         vnid2 = anritsu_handle.get_IMS(2)
-        vnid3 = anritsu_handle.get_IMS(3)
         _init_IMS(
             anritsu_handle,
             vnid1,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR,
+            ipv4_address=Fi_CSCF_IPV4_ADDR_IMS,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_IMS,
             auth=True)
         _init_IMS(
             anritsu_handle,
             vnid2,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_2,
-            ip_type="IPV6")
-        _init_IMS(
-            anritsu_handle,
-            vnid3,
-            sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_3,
-            ip_type="IPV6")
-    elif sim_card == VzW12349:
-        _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+            ipv4_address=Fi_CSCF_IPV4_ADDR_911,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_911,
+            auth=False)
+        return [lte_bts, wcdma_bts]
     else:
-        _init_IMS(anritsu_handle, vnid1, sim_card)
+        _init_PDN(anritsu_handle, sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
+        _init_PDN(anritsu_handle, sim_card, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
+        vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
+        if sim_card == P0135Ax:
+            vnid2 = anritsu_handle.get_IMS(2)
+            vnid3 = anritsu_handle.get_IMS(3)
+            _init_IMS(
+                anritsu_handle,
+                vnid1,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR,
+                auth=True)
+            _init_IMS(
+                anritsu_handle,
+                vnid2,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_2,
+                ip_type="IPV6")
+            _init_IMS(
+                anritsu_handle,
+                vnid3,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_3,
+                ip_type="IPV6")
+        elif sim_card == VzW12349:
+            _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+        else:
+            _init_IMS(anritsu_handle, vnid1, sim_card)
     return [lte_bts, wcdma_bts]
 
 
@@ -627,39 +824,76 @@
     gsm_bts = anritsu_handle.get_BTS(BtsNumber.BTS2)
     _init_lte_bts(lte_bts, user_params, CELL_1, sim_card)
     _init_gsm_bts(gsm_bts, user_params, CELL_2, sim_card)
-    pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
-    pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
-    pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
-    # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
-    _init_PDN(anritsu_handle, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
-    _init_PDN(anritsu_handle, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
-    vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
-    if sim_card == P0135Ax:
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        pdn4 = anritsu_handle.get_PDN(PDN_NO_4)
+        pdn5 = anritsu_handle.get_PDN(PDN_NO_5)
+        # Initialize PDN IP address.
+        _init_PDN(anritsu_handle, sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn2, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn4, Fi_UE_IPV4_ADDR_IMS,
+                  Fi_UE_IPV6_ADDR_IMS,
+                  True)
+        _init_PDN(anritsu_handle, sim_card, pdn5, Fi_UE_IPV4_ADDR_911,
+                  Fi_UE_IPV6_ADDR_911,
+                  True)
+        vnid1 = anritsu_handle.get_IMS(1)
         vnid2 = anritsu_handle.get_IMS(2)
-        vnid3 = anritsu_handle.get_IMS(3)
         _init_IMS(
             anritsu_handle,
             vnid1,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR,
+            ipv4_address=Fi_CSCF_IPV4_ADDR_IMS,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_IMS,
             auth=True)
         _init_IMS(
             anritsu_handle,
             vnid2,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_2,
-            ip_type="IPV6")
-        _init_IMS(
-            anritsu_handle,
-            vnid3,
-            sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_3,
-            ip_type="IPV6")
-    elif sim_card == VzW12349:
-        _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+            ipv4_address=Fi_CSCF_IPV4_ADDR_911,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_911,
+            auth=False)
+        return [lte_bts, gsm_bts]
     else:
-        _init_IMS(anritsu_handle, vnid1, sim_card)
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        # Initialize PDN IP address for internet connection sharing
+        _init_PDN(anritsu_handle, sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
+        _init_PDN(anritsu_handle, sim_card, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
+        vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
+        if sim_card == P0135Ax:
+            vnid2 = anritsu_handle.get_IMS(2)
+            vnid3 = anritsu_handle.get_IMS(3)
+            _init_IMS(
+                anritsu_handle,
+                vnid1,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR,
+                auth=True)
+            _init_IMS(
+                anritsu_handle,
+                vnid2,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_2,
+                ip_type="IPV6")
+            _init_IMS(
+                anritsu_handle,
+                vnid3,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_3,
+                ip_type="IPV6")
+        elif sim_card == VzW12349:
+            _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+        else:
+            _init_IMS(anritsu_handle, vnid1, sim_card)
     return [lte_bts, gsm_bts]
 
 
@@ -680,39 +914,76 @@
     cdma1x_bts = anritsu_handle.get_BTS(BtsNumber.BTS2)
     _init_lte_bts(lte_bts, user_params, CELL_1, sim_card)
     _init_1x_bts(cdma1x_bts, user_params, CELL_2, sim_card)
-    pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
-    pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
-    pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
-    # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
-    _init_PDN(anritsu_handle, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
-    _init_PDN(anritsu_handle, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
-    vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
-    if sim_card == P0135Ax:
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        pdn4 = anritsu_handle.get_PDN(PDN_NO_4)
+        pdn5 = anritsu_handle.get_PDN(PDN_NO_5)
+        # Initialize PDN IP address.
+        _init_PDN(anritsu_handle, sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn2, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn4, Fi_UE_IPV4_ADDR_IMS,
+                  Fi_UE_IPV6_ADDR_IMS,
+                  True)
+        _init_PDN(anritsu_handle, sim_card, pdn5, Fi_UE_IPV4_ADDR_911,
+                  Fi_UE_IPV6_ADDR_911,
+                  True)
+        vnid1 = anritsu_handle.get_IMS(1)
         vnid2 = anritsu_handle.get_IMS(2)
-        vnid3 = anritsu_handle.get_IMS(3)
         _init_IMS(
             anritsu_handle,
             vnid1,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR,
+            ipv4_address=Fi_CSCF_IPV4_ADDR_IMS,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_IMS,
             auth=True)
         _init_IMS(
             anritsu_handle,
             vnid2,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_2,
-            ip_type="IPV6")
-        _init_IMS(
-            anritsu_handle,
-            vnid3,
-            sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_3,
-            ip_type="IPV6")
-    elif sim_card == VzW12349:
-        _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+            ipv4_address=Fi_CSCF_IPV4_ADDR_911,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_911,
+            auth=False)
+        return [lte_bts, cdma1x_bts]
     else:
-        _init_IMS(anritsu_handle, vnid1, sim_card)
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        # Initialize PDN IP address for internet connection sharing
+        _init_PDN(anritsu_handle, sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
+        _init_PDN(anritsu_handle, sim_card, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
+        vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
+        if sim_card == P0135Ax:
+            vnid2 = anritsu_handle.get_IMS(2)
+            vnid3 = anritsu_handle.get_IMS(3)
+            _init_IMS(
+                anritsu_handle,
+                vnid1,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR,
+                auth=True)
+            _init_IMS(
+                anritsu_handle,
+                vnid2,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_2,
+                ip_type="IPV6")
+            _init_IMS(
+                anritsu_handle,
+                vnid3,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_3,
+                ip_type="IPV6")
+        elif sim_card == VzW12349:
+            _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+        else:
+            _init_IMS(anritsu_handle, vnid1, sim_card)
     return [lte_bts, cdma1x_bts]
 
 
@@ -732,39 +1003,76 @@
     evdo_bts = anritsu_handle.get_BTS(BtsNumber.BTS2)
     _init_lte_bts(lte_bts, user_params, CELL_1, sim_card)
     _init_evdo_bts(evdo_bts, user_params, CELL_2, sim_card)
-    pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
-    pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
-    pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
-    # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
-    _init_PDN(anritsu_handle, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
-    _init_PDN(anritsu_handle, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
-    vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
-    if sim_card == P0135Ax:
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        pdn4 = anritsu_handle.get_PDN(PDN_NO_4)
+        pdn5 = anritsu_handle.get_PDN(PDN_NO_5)
+        # Initialize PDN IP address.
+        _init_PDN(anritsu_handle, sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn2, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn4, Fi_UE_IPV4_ADDR_IMS,
+                  Fi_UE_IPV6_ADDR_IMS,
+                  True)
+        _init_PDN(anritsu_handle, sim_card, pdn5, Fi_UE_IPV4_ADDR_911,
+                  Fi_UE_IPV6_ADDR_911,
+                  True)
+        vnid1 = anritsu_handle.get_IMS(1)
         vnid2 = anritsu_handle.get_IMS(2)
-        vnid3 = anritsu_handle.get_IMS(3)
         _init_IMS(
             anritsu_handle,
             vnid1,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR,
+            ipv4_address=Fi_CSCF_IPV4_ADDR_IMS,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_IMS,
             auth=True)
         _init_IMS(
             anritsu_handle,
             vnid2,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_2,
-            ip_type="IPV6")
-        _init_IMS(
-            anritsu_handle,
-            vnid3,
-            sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_3,
-            ip_type="IPV6")
-    elif sim_card == VzW12349:
-        _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+            ipv4_address=Fi_CSCF_IPV4_ADDR_911,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_911,
+            auth=False)
+        return [lte_bts, evdo_bts]
     else:
-        _init_IMS(anritsu_handle, vnid1, sim_card)
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        # Initialize PDN IP address for internet connection sharing
+        _init_PDN(anritsu_handle, sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
+        _init_PDN(anritsu_handle, sim_card, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
+        _init_PDN(anritsu_handle, sim_card, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
+        vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
+        if sim_card == P0135Ax:
+            vnid2 = anritsu_handle.get_IMS(2)
+            vnid3 = anritsu_handle.get_IMS(3)
+            _init_IMS(
+                anritsu_handle,
+                vnid1,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR,
+                auth=True)
+            _init_IMS(
+                anritsu_handle,
+                vnid2,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_2,
+                ip_type="IPV6")
+            _init_IMS(
+                anritsu_handle,
+                vnid3,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_3,
+                ip_type="IPV6")
+        elif sim_card == VzW12349:
+            _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+        else:
+            _init_IMS(anritsu_handle, vnid1, sim_card)
     return [lte_bts, evdo_bts]
 
 
@@ -786,7 +1094,11 @@
     _init_gsm_bts(gsm_bts, user_params, CELL_2, sim_card)
     pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        _init_PDN(anritsu_handle, sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+    else:
+        _init_PDN(anritsu_handle, sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
     return [wcdma_bts, gsm_bts]
 
 
@@ -808,7 +1120,11 @@
     _init_gsm_bts(gsm2_bts, user_params, CELL_2, sim_card)
     pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        _init_PDN(anritsu_handle,sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+    else:
+        _init_PDN(anritsu_handle,sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
     return [gsm1_bts, gsm2_bts]
 
 
@@ -823,43 +1139,82 @@
         Lte BTS object
     """
     anritsu_handle.set_simulation_model(BtsTechnology.LTE)
-    # setting BTS parameters
+    # setting Fi BTS parameters
     lte_bts = anritsu_handle.get_BTS(BtsNumber.BTS1)
     _init_lte_bts(lte_bts, user_params, CELL_1, sim_card)
-    pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
-    pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
-    pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
-    # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
-    _init_PDN(anritsu_handle, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
-    _init_PDN(anritsu_handle, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
-    vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
-    if sim_card == P0135Ax:
+
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        pdn4 = anritsu_handle.get_PDN(PDN_NO_4)
+        pdn5 = anritsu_handle.get_PDN(PDN_NO_5)
+    # Initialize PDN IP address.
+        _init_PDN(anritsu_handle,sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle,sim_card, pdn2, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle,sim_card, pdn3, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+        _init_PDN(anritsu_handle, sim_card, pdn4, Fi_UE_IPV4_ADDR_IMS,
+                  Fi_UE_IPV6_ADDR_IMS,
+                  True)
+        _init_PDN(anritsu_handle, sim_card, pdn5, Fi_UE_IPV4_ADDR_911,
+                  Fi_UE_IPV6_ADDR_911,
+                  True)
+        vnid1 = anritsu_handle.get_IMS(1)
         vnid2 = anritsu_handle.get_IMS(2)
-        vnid3 = anritsu_handle.get_IMS(3)
         _init_IMS(
             anritsu_handle,
             vnid1,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR,
+            ipv4_address=Fi_CSCF_IPV4_ADDR_IMS,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_IMS,
             auth=True)
         _init_IMS(
             anritsu_handle,
             vnid2,
             sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_2,
-            ip_type="IPV6")
-        _init_IMS(
-            anritsu_handle,
-            vnid3,
-            sim_card,
-            ipv6_address=CSCF_IPV6_ADDR_3,
-            ip_type="IPV6")
-    elif sim_card == VzW12349:
-        _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+            ipv4_address=Fi_CSCF_IPV4_ADDR_911,
+            ipv6_address=Fi_CSCF_IPV6_ADDR_911,
+            auth=False)
+        return [lte_bts]
     else:
-        _init_IMS(anritsu_handle, vnid1, sim_card)
-    return [lte_bts]
+        # setting BTS parameters
+        pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
+        pdn2 = anritsu_handle.get_PDN(PDN_NO_2)
+        pdn3 = anritsu_handle.get_PDN(PDN_NO_3)
+        # Initialize PDN IP address for internet connection sharing
+        _init_PDN(anritsu_handle,sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, True)
+        _init_PDN(anritsu_handle,sim_card, pdn2, UE_IPV4_ADDR_2, UE_IPV6_ADDR_2, False)
+        _init_PDN(anritsu_handle,sim_card, pdn3, UE_IPV4_ADDR_3, UE_IPV6_ADDR_3, True)
+        vnid1 = anritsu_handle.get_IMS(DEFAULT_VNID)
+        if sim_card == P0135Ax:
+            vnid2 = anritsu_handle.get_IMS(2)
+            vnid3 = anritsu_handle.get_IMS(3)
+            _init_IMS(
+                anritsu_handle,
+                vnid1,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR,
+                auth=True)
+            _init_IMS(
+                anritsu_handle,
+                vnid2,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_2,
+                ip_type="IPV6")
+            _init_IMS(
+                anritsu_handle,
+                vnid3,
+                sim_card,
+                ipv6_address=CSCF_IPV6_ADDR_3,
+                ip_type="IPV6")
+        elif sim_card == VzW12349:
+            _init_IMS(anritsu_handle, vnid1, sim_card, auth=True)
+        else:
+            _init_IMS(anritsu_handle, vnid1, sim_card)
+        return [lte_bts]
 
 
 def set_system_model_wcdma(anritsu_handle, user_params, sim_card):
@@ -878,7 +1233,11 @@
     _init_wcdma_bts(wcdma_bts, user_params, CELL_1, sim_card)
     pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        _init_PDN(anritsu_handle,sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+    else:
+        _init_PDN(anritsu_handle,sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
     return [wcdma_bts]
 
 
@@ -898,7 +1257,11 @@
     _init_gsm_bts(gsm_bts, user_params, CELL_1, sim_card)
     pdn1 = anritsu_handle.get_PDN(PDN_NO_1)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        _init_PDN(anritsu_handle,sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+    else:
+        _init_PDN(anritsu_handle,sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
     return [gsm_bts]
 
 
@@ -919,7 +1282,11 @@
     _init_1x_bts(cdma1x_bts, user_params, CELL_1, sim_card)
     pdn1 = anritsu_handle.get_PDN(PDN_ONE)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        _init_PDN(anritsu_handle,sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+    else:
+        _init_PDN(anritsu_handle,sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
     return [cdma1x_bts]
 
 
@@ -943,7 +1310,11 @@
     _init_evdo_bts(evdo_bts, user_params, CELL_2, sim_card)
     pdn1 = anritsu_handle.get_PDN(PDN_ONE)
     # Initialize PDN IP address for internet connection sharing
-    _init_PDN(anritsu_handle, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        _init_PDN(anritsu_handle,sim_card, pdn1, Fi_UE_IPV4_ADDR_Data,
+                  Fi_UE_IPV6_ADDR_Data, False)
+    else:
+        _init_PDN(anritsu_handle,sim_card, pdn1, UE_IPV4_ADDR_1, UE_IPV6_ADDR_1, False)
     return [cdma1x_bts]
 
 
@@ -1792,7 +2163,7 @@
             status = False
 
         if event['data']['cmasSeverity'].lower() != severity.lower():
-            Log.info("Wrong cmasSeverity received")
+            log.info("Wrong cmasSeverity received")
             status = False
     except Empty:
         log.info("Timeout: Expected event is not received.")
@@ -1914,7 +2285,7 @@
     return dl_antenna
 
 
-def get_lte_band(user_params, cell_no):
+def get_lte_band(user_params, cell_no, sim_card):
     """ Returns the LTE BAND to be used from the user specified parameters
         or default value
 
@@ -1927,7 +2298,14 @@
         LTE BAND to be used
     """
     key = "cell{}_lte_band".format(cell_no)
-    band = DEFAULT_LTE_BAND[cell_no - 1]
+    if sim_card == FiTMO:
+        band = Fi_LTE_TMO_BAND[cell_no - 1]
+    elif sim_card == FiSPR:
+        band = Fi_LTE_SPR_BAND[cell_no - 1]
+    elif sim_card == FiUSCC:
+        band = Fi_LTE_USCC_BAND[cell_no - 1]
+    else:
+        band = DEFAULT_LTE_BAND[cell_no - 1]
     return user_params.get(key, band)
 
 
@@ -1948,7 +2326,7 @@
     return wcdma_band
 
 
-def get_gsm_band(user_params, cell_no):
+def get_gsm_band(user_params, cell_no, sim_card):
     """ Returns the GSM BAND to be used from the user specified parameters
         or default value
 
@@ -1961,7 +2339,10 @@
         GSM BAND to be used
     """
     key = "cell{}_gsm_band".format(cell_no)
-    gsm_band = user_params.get(key, DEFAULT_GSM_BAND)
+    if sim_card == FiTMO:
+        gsm_band = Fi_GSM_TMO_BAND
+    else:
+        gsm_band = user_params.get(key, DEFAULT_GSM_BAND)
     return gsm_band
 
 
@@ -1978,7 +2359,14 @@
         1X BAND to be used
     """
     key = "cell{}_1x_band".format(cell_no)
-    band = VzW_CDMA1x_BAND if sim_card == VzW12349 else DEFAULT_CDMA1X_BAND
+    if sim_card == FiSPR:
+        band = Fi_SPR1X_BAND
+    elif sim_card == FiUSCC:
+        band = Fi_USCC1X_BAND
+    elif sim_card == VzW12349:
+        band = VzW_CDMA1x_BAND
+    else:
+        band = DEFAULT_CDMA1X_BAND
     return user_params.get(key, band)
 
 
@@ -1995,7 +2383,12 @@
         EVDO BAND to be used
     """
     key = "cell{}_evdo_band".format(cell_no)
-    band = VzW_EVDO_BAND if sim_card == VzW12349 else DEFAULT_EVDO_BAND
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        band = Fi_EVDO_BAND
+    elif sim_card == VzW12349:
+        band = VzW_EVDO_BAND
+    else:
+         band = DEFAULT_EVDO_BAND
     return user_params.get(key, band)
 
 
@@ -2093,7 +2486,16 @@
     """
 
     key = "cell{}_lte_mcc".format(cell_no)
-    mcc = VzW_MCC if sim_card == VzW12349 else DEFAULT_MCC
+    if sim_card == FiTMO:
+        mcc = Fi_TMO_MCC
+    elif sim_card == FiSPR:
+        mcc = Fi_SPR_MCC
+    elif sim_card == FiUSCC:
+        mcc = Fi_USCC_MCC
+    elif sim_card == VzW12349:
+        mcc = VzW_MCC
+    else:
+        mcc = DEFAULT_MCC
     return user_params.get(key, mcc)
 
 
@@ -2110,7 +2512,16 @@
         LTE MNC to be used
     """
     key = "cell{}_lte_mnc".format(cell_no)
-    mnc = VzW_MNC if sim_card == VzW12349 else DEFAULT_MNC
+    if sim_card == FiTMO:
+        mnc = Fi_TMO_MNC
+    elif sim_card == FiSPR:
+        mnc = Fi_SPR_MNC
+    elif sim_card == FiUSCC:
+        mnc = Fi_USCC_MNC
+    elif sim_card == VzW12349:
+        mnc = VzW_MNC
+    else:
+        mnc = DEFAULT_MNC
     return user_params.get(key, mnc)
 
 
@@ -2195,7 +2606,14 @@
         1X MCC to be used
     """
     key = "cell{}_1x_mcc".format(cell_no)
-    mcc = VzW_MCC if sim_card == VzW12349 else DEFAULT_MCC
+    if sim_card == FiSPR:
+        mcc = Fi_SPR1X_MCC
+    elif sim_card == FiUSCC:
+        mcc = Fi_USCC1X_MCC
+    elif sim_card == VzW12349:
+        mcc = VzW_MCC
+    else:
+        mcc = DEFAULT_MCC
     return user_params.get(key, mcc)
 
 
@@ -2212,7 +2630,14 @@
         1X Channel to be used
     """
     key = "cell{}_1x_channel".format(cell_no)
-    ch = VzW_CDMA1x_CH if sim_card == VzW12349 else DEFAULT_CDMA1X_CH
+    if sim_card == FiSPR:
+        ch = Fi_SPR1X_CH
+    elif sim_card == FiUSCC:
+        ch = Fi_USCC1X_CH
+    elif sim_card == VzW12349:
+        ch = VzW_CDMA1x_CH
+    else:
+        ch = DEFAULT_CDMA1X_CH
     return user_params.get(key, ch)
 
 
@@ -2229,7 +2654,14 @@
         1X SID to be used
     """
     key = "cell{}_1x_sid".format(cell_no)
-    sid = VzW_CDMA1X_SID if sim_card == VzW12349 else DEFAULT_CDMA1X_SID
+    if sim_card == FiSPR:
+        sid = Fi_SPR1X_SID
+    elif sim_card == FiUSCC:
+        sid = Fi_USCC1X_SID
+    elif sim_card == VzW12349:
+        sid = VzW_CDMA1X_SID
+    else:
+        sid = DEFAULT_CDMA1X_SID
     return user_params.get(key, sid)
 
 
@@ -2246,7 +2678,14 @@
         1X NID to be used
     """
     key = "cell{}_1x_nid".format(cell_no)
-    nid = VzW_CDMA1X_NID if sim_card == VzW12349 else DEFAULT_CDMA1X_NID
+    if sim_card == FiSPR:
+        nid = Fi_SPR1X_NID
+    elif sim_card == FiUSCC:
+        nid = Fi_USCC1X_NID
+    elif sim_card == VzW12349:
+        nid = VzW_CDMA1X_NID
+    else:
+        nid = DEFAULT_CDMA1X_NID
     return user_params.get(key, nid)
 
 
@@ -2263,7 +2702,12 @@
         EVDO Channel to be used
     """
     key = "cell{}_evdo_channel".format(cell_no)
-    ch = VzW_EVDO_CH if sim_card == VzW12349 else DEFAULT_EVDO_CH
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        ch = Fi_EVDO_CH
+    elif sim_card == VzW12349:
+        ch = VzW_EVDO_CH
+    else:
+        ch = DEFAULT_EVDO_CH
     return user_params.get(key, ch)
 
 
@@ -2280,8 +2724,12 @@
         EVDO SID to be used
     """
     key = "cell{}_evdo_sid".format(cell_no)
-    return user_params.get(key, DEFAULT_EVDO_SECTOR_ID)
-    sid = VzW_EVDO_SECTOR_ID if sim_card == VzW12349 else DEFAULT_EVDO_SECTOR_ID
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        sid = Fi_EVDO_SECTOR_ID
+    elif sim_card == VzW12349:
+        sid = VzW_EVDO_SECTOR_ID
+    else:
+        sid = DEFAULT_EVDO_SECTOR_ID
     return user_params.get(key, sid)
 
 
@@ -2305,6 +2753,19 @@
 
 
 def set_post_sim_params(anritsu_handle, user_params, sim_card):
+    if sim_card == FiTMO or sim_card == FiSPR or sim_card == FiUSCC:
+        anritsu_handle.send_command("PDNCHECKAPN 1,h2g2")
+        anritsu_handle.send_command("PDNCHECKAPN 2,n.nv.ispsn")
+        anritsu_handle.send_command("PDNCHECKAPN 3,fast.t-mobile.com")
+        anritsu_handle.send_command("PDNCHECKAPN 4,ims")
+        anritsu_handle.send_command("PDNCHECKAPN 5,*")
+        anritsu_handle.send_command("PDNIMS 1,DISABLE")
+        anritsu_handle.send_command("PDNIMS 2,DISABLE")
+        anritsu_handle.send_command("PDNIMS 3,DISABLE")
+        anritsu_handle.send_command("PDNIMS 4,ENABLE")
+        anritsu_handle.send_command("PDNVNID 4,1")
+        anritsu_handle.send_command("PDNIMS 5,ENABLE")
+        anritsu_handle.send_command("PDNVNID 5,2")
     if sim_card == P0135Ax:
         anritsu_handle.send_command("PDNCHECKAPN 1,ims")
         anritsu_handle.send_command("PDNCHECKAPN 2,fast.t-mobile.com")
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 0c0b5a7..038ed00 100644
--- a/acts/framework/acts/test_utils/tel/tel_test_utils.py
+++ b/acts/framework/acts/test_utils/tel/tel_test_utils.py
@@ -4747,6 +4747,18 @@
     return True
 
 
+def ensure_preferred_network_type_for_subscription(
+        ad,
+        network_preference
+        ):
+    sub_id = ad.droid.subscriptionGetDefaultSubId()
+    if not ad.droid.telephonySetPreferredNetworkTypesForSubscription(
+            network_preference, sub_id):
+        ad.log.error("Set sub_id %s Preferred Networks Type %s failed.",
+                     sub_id, network_preference)
+    return True
+
+
 def ensure_network_rat(log,
                        ad,
                        network_preference,
diff --git a/acts/tests/google/tel/lab/TelLabCmasTest.py b/acts/tests/google/tel/lab/TelLabCmasTest.py
index dc1d666..8a48c64 100644
--- a/acts/tests/google/tel/lab/TelLabCmasTest.py
+++ b/acts/tests/google/tel/lab/TelLabCmasTest.py
@@ -197,6 +197,24 @@
             return False
         return True
 
+    def test_carrier_tmobile(self):
+        """ Sets the Carrier to TMO.
+        Returns: None
+        """
+        setattr(self.ad, "sim_card", "FiTMO")
+
+    def test_carrier_sprint(self):
+        """ Sets the Carrier to SPR.
+        Returns: None
+        """
+        setattr(self.ad, "sim_card", "FiSPR")
+
+    def test_carrier_uscc(self):
+        """ Sets the Carrier to USCC.
+        Returns: None
+        """
+        setattr(self.ad, "sim_card", "FiUSCC")
+
     """ Tests Begin """
 
     @test_tracker_info(uuid="e5ddf562-e94b-4b58-bc7d-6635c01f290e")
diff --git a/acts/tests/google/tel/lab/TelLabEtwsTest.py b/acts/tests/google/tel/lab/TelLabEtwsTest.py
index 59e12a0..5eff288 100644
--- a/acts/tests/google/tel/lab/TelLabEtwsTest.py
+++ b/acts/tests/google/tel/lab/TelLabEtwsTest.py
@@ -153,6 +153,24 @@
             return False
         return True
 
+    def test_carrier_tmobile(self):
+        """ Sets the Carrier to TMO.
+        Returns: None
+        """
+        setattr(self.ad, "sim_card", "FiTMO")
+
+    def test_carrier_sprint(self):
+        """ Sets the Carrier to SPR.
+        Returns: None
+        """
+        setattr(self.ad, "sim_card", "FiSPR")
+
+    def test_carrier_uscc(self):
+        """ Sets the Carrier to USCC.
+        Returns: None
+        """
+        setattr(self.ad, "sim_card", "FiUSCC")
+
     """ Tests Begin """
 
     @test_tracker_info(uuid="af4a00d0-9a91-45d5-9f65-9541e64a57f2")
diff --git a/acts/tests/google/tel/lab/TelLabProjectFiTest.py b/acts/tests/google/tel/lab/TelLabProjectFiTest.py
new file mode 100644
index 0000000..6a3a979
--- /dev/null
+++ b/acts/tests/google/tel/lab/TelLabProjectFiTest.py
@@ -0,0 +1,704 @@
+#!/usr/bin/env python3
+#
+#   Copyright 2016 - 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.
+"""
+Fi Switching Methods 
+"""
+import time
+from acts.controllers.anritsu_lib._anritsu_utils import AnritsuError
+from acts.controllers.anritsu_lib.md8475a import CBCHSetup
+from acts.controllers.anritsu_lib.md8475a import CTCHSetup
+from acts.controllers.anritsu_lib.md8475a import MD8475A
+from acts.test_utils.tel.anritsu_utils import cb_serial_number
+from acts.test_utils.tel.anritsu_utils import set_system_model_lte
+from acts.test_utils.tel.anritsu_utils import set_usim_parameters
+from acts.test_utils.tel.anritsu_utils import set_post_sim_params
+from acts.test_utils.tel.tel_test_utils import \
+    ensure_preferred_network_type_for_subscription
+from acts.test_utils.tel.tel_test_utils import ensure_phones_idle
+from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode
+from acts.test_utils.tel.tel_test_utils import start_qxdm_loggers
+from acts.test_utils.tel.TelephonyBaseTest import TelephonyBaseTest
+from acts.test_utils.tel.tel_defines import NETWORK_MODE_LTE_GSM_WCDMA
+from acts.test_utils.tel.tel_defines import RAT_FAMILY_LTE
+from acts.test_decorators import test_tracker_info
+from acts.test_utils.tel.tel_defines import RAT_LTE
+from acts.test_utils.tel.tel_defines import CARRIER_SPT
+from acts.test_utils.tel.tel_defines import CARRIER_TMO
+from acts.test_utils.tel.tel_defines import CARRIER_USCC
+from acts.test_utils.tel.tel_lookup_tables import operator_name_from_plmn_id
+from acts.test_utils.tel.tel_test_utils import abort_all_tests
+from acts.test_utils.tel.tel_test_utils import ensure_phone_subscription
+from acts.test_utils.tel.tel_test_utils import ensure_wifi_connected
+from acts.test_utils.tel.tel_test_utils import is_sim_ready
+from acts.test_utils.tel.tel_test_utils import log_screen_shot
+from acts.test_utils.tel.tel_test_utils import multithread_func
+from acts.test_utils.tel.tel_test_utils import reboot_device
+from acts.test_utils.tel.tel_test_utils import refresh_droid_config
+from acts.test_utils.tel.tel_test_utils import send_dialer_secret_code
+from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode_by_adb
+from acts.test_utils.tel.tel_test_utils import wait_for_state
+from acts.test_utils.tel.tel_test_utils import add_google_account
+from acts.test_utils.tel.tel_test_utils import remove_google_account
+
+WAIT_TIME_BETWEEN_REG_AND_MSG = 15  # default 15 sec
+CARRIER = None
+CARRIER_AUTO = "auto"
+
+_CARRIER_DIALER_CODE_LOOKUP = {
+    CARRIER_AUTO: '342886',
+    CARRIER_SPT: '34777',
+    CARRIER_TMO: '34866',
+    CARRIER_USCC: '34872'
+}
+
+_SWITCHING_PREF_FILE = (
+    '/data/data/com.google.android.apps.tycho/shared_prefs/switching.xml')
+
+_INTENT_FLAGS = int(0x00008000 | 0x10000000 | 0x00080000 | 0x00020000)
+_TYCHO_PKG = 'com.google.android.apps.tycho'
+_MAX_WAIT_TIME = 120
+_TYCHO_VERBOSE_LOGGING_CMDS = [
+    "setprop log.tag.Tycho VERBOSE",
+    "CLASSPATH=/system/framework/am.jar su root app_process "
+    "/system/bin com.android.commands.am.Am broadcast -a "
+    "com.google.gservices.intent.action.GSERVICES_OVERRIDE "
+    "-e tycho.enable_request_logging true",
+    "CLASSPATH=/system/framework/am.jar su root app_process "
+    "/system/bin com.android.commands.am.Am broadcast -a "
+    "com.google.gservices.intent.action.GSERVICES_OVERRIDE "
+    "-e tycho.enable_sensitive_logging true",
+    "CLASSPATH=/system/framework/am.jar su root app_process "
+    "/system/bin com.android.commands.am.Am broadcast -a "
+    "com.google.gservices.intent.action.GSERVICES_OVERRIDE "
+    "-e tycho.enable_ample_logging true"
+]
+
+_TYCHO_SERVER_LAB_OVERRIDE_CMD = (
+    "am broadcast -a com.google.gservices.intent.action.GSERVICES_OVERRIDE -e "
+    "url:tycho_server_endpoint https://android.googleapis.com/nova/nfe/ rewrite"
+    " https://android.googleapis.com/lab/nova/nfe/")
+
+
+class TychoClassId(object):
+    """Tycho Activity/Service Classnames."""
+    # Activities
+    CARRIER_SETUP = 'CarrierSetupEntryPointTrampoline'
+    INIT_ACTIVITY = 'InitActivity'
+    # Services
+    SYNC_SERVICE = 'services.SyncService'
+    ACTIVATE_SUPER_NETWORK_SERVICE = 'services.SuperNetworkConfigurationService'
+
+
+class ActionTypeId(object):
+    """Andorid Action Type to trigger events."""
+    MAIN = 'android.intent.action.MAIN'
+    MASTER_CLEAR_NOTIFICATION = 'android.intent.action.MASTER_CLEAR_NOTIFICATION'
+    TYCHO_ACTIVATE_SUPER_NETWORK = (
+        'com.google.android.apps.tycho.ActionType.ACTIVATE_SUPER_NETWORK')
+
+
+class TelLabProjectFiTest(TelephonyBaseTest):
+    SERIAL_NO = cb_serial_number()
+
+    def __init__(self, controllers):
+        TelephonyBaseTest.__init__(self, controllers)
+        self.ad = self.android_devices[0]
+        self.ad.sim_card = getattr(self.ad, "sim_card", None)
+        self.md8475a_ip_address = self.user_params[
+            "anritsu_md8475a_ip_address"]
+        self.wlan_option = self.user_params.get("anritsu_wlan_option", False)
+        self.md8475_version = self.user_params.get("md8475", "A")
+        self.ad.adb.shell("settings put secure cmas_additional_broadcast_pkg "
+                          "com.googlecode.android_scripting")
+        self.wait_time_between_reg_and_msg = self.user_params.get(
+            "wait_time_between_reg_and_msg", WAIT_TIME_BETWEEN_REG_AND_MSG)
+
+    def setup_class(self):
+        try:
+            self.anritsu = MD8475A(self.md8475a_ip_address, self.log,
+                                   self.wlan_option, self.md8475_version)
+        except AnritsuError:
+            self.log.error("Error in connecting to Anritsu Simulator")
+            return False
+        self.activation_attemps = self.user_params.get("activation_attemps", 3)
+        return True
+
+    def setup_test(self):
+        if getattr(self, "qxdm_log", True):
+            start_qxdm_loggers(self.log, self.android_devices)
+        ensure_phones_idle(self.log, self.android_devices)
+        toggle_airplane_mode(self.log, self.ad, True)
+        return True
+
+    def teardown_test(self):
+        self.log.info("Stopping Simulation")
+        self.anritsu.stop_simulation()
+        toggle_airplane_mode(self.log, self.ad, True)
+
+    def teardown_class(self):
+        self.anritsu.disconnect()
+        return True
+
+    def _bring_up_callbox(
+            self,
+            set_simulation_func,
+            rat):
+        try:
+            [self.bts1] = set_simulation_func(self.anritsu, self.user_params,
+                                              self.ad.sim_card)
+            set_usim_parameters(self.anritsu, self.ad.sim_card)
+            if rat == RAT_LTE:
+                set_post_sim_params(self.anritsu, self.user_params,
+                                    self.ad.sim_card)
+            self.anritsu.start_simulation()
+
+            if rat == RAT_LTE:
+                preferred_network_setting = NETWORK_MODE_LTE_GSM_WCDMA
+                rat_family = RAT_FAMILY_LTE
+            else:
+                self.log.error("No valid RAT provided to bring up callbox.")
+                return False
+
+            if not ensure_preferred_network_type_for_subscription(
+                    self.ad,
+                    preferred_network_setting):
+                self.log.error(
+                    "Failed to set rat family {}, preferred network:{}".format(
+                        rat_family, preferred_network_setting))
+                return False
+
+            if self.ad.droid.connectivityCheckAirplaneMode():
+                toggle_airplane_mode(self.log, self.ad, False)
+        except AnritsuError as e:
+            self.log.error("Error in connection with Anritsu Simulator: " +
+                           str(e))
+            return False
+        return True
+
+    def pre_switching_callbox_setup(self):
+        """ Setup environment to enable carrier switching
+        Returns:
+            True if pass; False if fail
+        """
+        return self._bring_up_callbox(set_system_model_lte, RAT_LTE)
+
+    def _install_account_util(self, ad):
+        account_util = self.user_params["account_util"]
+        if isinstance(account_util, list):
+            account_util = account_util[0]
+        ad.log.info("Install account_util %s", account_util)
+        ad.ensure_screen_on()
+        ad.adb.install("-r %s" % account_util, timeout=300, ignore_status=True)
+        time.sleep(3)
+        if not ad.is_apk_installed("com.google.android.tradefed.account"):
+            ad.log.info("com.google.android.tradefed.account is not installed")
+            return False
+        return True
+
+    def _account_registration(self, ad):
+        toggle_airplane_mode_by_adb(self.log, ad, new_state=False)
+        for cmd in _TYCHO_VERBOSE_LOGGING_CMDS:
+            ad.adb.shell(cmd)
+        if hasattr(ad, "user_account"):
+            ad.exit_setup_wizard()
+            if not ad.is_apk_installed("com.google.android.tradefed.account"
+                                       ) and \
+                    self.user_params.get("account_util"):
+                for _ in range(2):
+                    if self._install_account_util(ad):
+                        break
+                else:
+                    ad.log.error(
+                        "Fail to install com.google.android.tradefed.account")
+                    return False
+            ad.force_stop_apk(_TYCHO_PKG)
+            if not ensure_wifi_connected(self.log, ad, self.wifi_network_ssid,
+                                         self.wifi_network_pass):
+                ad.log.error("Failed to connect to wifi")
+                return False
+            ad.log.info("Add google account")
+            if not add_google_account(ad):
+                ad.log.error("Failed to add google account")
+                return False
+            ad.adb.shell(
+                'am instrument -w -e account "%s@gmail.com" -e password '
+                '"%s" -e sync true -e wait-for-checkin false '
+                'com.google.android.tradefed.account/.AddAccount' %
+                (ad.user_account, ad.user_password))
+            ad.log.info("Enable and activate tycho apk")
+            if not ad.is_apk_installed(_TYCHO_PKG):
+                ad.log.info("%s is not installed", _TYCHO_PKG)
+                return False
+            ad.adb.shell('pm enable %s' % _TYCHO_PKG)
+            # ad.adb.shell(_TYCHO_SERVER_LAB_OVERRIDE_CMD)
+            for i in range(1, self.activation_attemps + 1):
+                if i == self.activation_attemps:
+                    ad.log.info("Reboot and try Fi activation again")
+                    reboot_device(ad)
+                self.activate_fi_account(ad)
+                if not self.check_project_fi_activated(ad):
+                    ad.log.error("Fail to activate Fi account on attempt-%s",
+                                 i)
+                    if i == self.activation_attemps:
+                        return False
+                else:
+                    ad.log.info("Fi account is activated successfully")
+                    break
+        elif "Fi Network" in ad.adb.getprop("gsm.sim.operator.alpha"):
+            ad.log.error("Google account is not provided for Fi Network")
+            return False
+        if not ensure_phone_subscription(self.log, ad):
+            ad.log.error("Unable to find a valid subscription!")
+            return False
+        refresh_droid_config(self.log, ad)
+        return True
+
+    def start_service(self, ad, package, service_id, extras, action_type):
+        """Starts the specified service.
+
+        Args:
+          ad: (android_device.AndroidDevice) device to start activity on
+          package: (str) the package to start the service from
+          service_id: (str) service to start
+          extras: (dict) extras needed to specify with the activity id
+          action_type: The action type id to create the intent
+        """
+        ad.log.info('Starting service %s/.%s.', package, service_id)
+        intent = ad.droid.makeIntent(action_type, None, None, extras,
+                                     ['android.intent.category.DEFAULT'],
+                                     package, package + '.' + service_id,
+                                     _INTENT_FLAGS)
+        ad.droid.startServiceIntent(intent)
+
+    def start_activity(self, ad, package, activity_id, extras=None):
+        """Starts the specified activity.
+
+        Args:
+          ad: (android_device.AndroidDevice) device to start activity on
+          package: (str) the package to start
+          activity_id: (str) activity to start
+          extras: (dict) extras needed to specify with the activity id
+        """
+        ad.log.info('Starting activity %s/.%s.', package, activity_id)
+        intent = ad.droid.makeIntent(ActionTypeId.MAIN, None, None, extras,
+                                     ['android.intent.category.LAUNCHER'],
+                                     package, package + '.' + activity_id,
+                                     _INTENT_FLAGS)
+        ad.droid.startActivityIntent(intent, False)
+
+    def activate_fi_account(self, ad):
+        """Start Tycho InitActivity.
+
+        For in-app Tycho activition (post-SUW tests), Tycho does not
+        automatically trigger OMADM process. This method is used to start
+        Tycho InitActivity before launching super network activation.
+
+        The device will finally stay on Sprint network if everything goes well.
+
+        Args:
+          ad: Android device need to start Tycho InitActivity.
+        """
+        ad.force_stop_apk(_TYCHO_PKG)
+        ad.send_keycode("HOME")
+        extra = {'in_setup_wizard': False, 'force_show_account_chooser': False}
+        self.start_activity(ad, _TYCHO_PKG, TychoClassId.INIT_ACTIVITY, extra)
+        for _ in range(30):
+            ad.send_keycode("WAKEUP")
+            time.sleep(1)
+            current_window = ad.get_my_current_focus_window()
+            log_screen_shot(ad, self.test_name)
+            if ad.adb.shell(
+                    "settings get global device_provisioning_mobile_data"
+            ) != "1":
+                ad.adb.shell(
+                    "settings put global device_provisioning_mobile_data 1")
+            if 'SwitchConfirmDialogActivity' in current_window:
+                ad.log.info("In Switch Confirmation Dialog")
+                if ad.adb.getprop("ro.build.version.release")[0] not in ("8",
+                                                                         "O"):
+                    ad.send_keycode("TAB")
+                ad.send_keycode("TAB")
+                ad.send_keycode("ENTER")
+                time.sleep(10)
+            elif 'tycho.InitActivity' in current_window:
+                ad.log.info("In Tycho InitActivity")
+                ad.send_keycode("TAB")
+                ad.send_keycode("TAB")
+                ad.send_keycode("ENTER")
+                time.sleep(10)
+
+            elif 'tycho.AccountChooserActivity' in current_window:
+                ad.send_keycode("ENTER")
+            else:
+                ad.log.info("Finished activation process")
+                return
+
+    def check_project_fi_activated(self, ad, retries=20):
+        for _ in range(retries):
+            if is_sim_ready(self.log, ad) and (
+                    ad.droid.telephonyGetSimOperatorName() == "Fi Network"):
+                ad.log.info("SIM state is READY, SIM operator is Fi")
+                return True
+            time.sleep(5)
+
+    def start_tycho_activation(self, ad):
+        """Start the Tycho client and register to cellular network.
+
+        Starts Tycho within SUW:
+         - Tycho is expected to follow the in-SUW work flow:
+          - Tycho will perform TychoInit, handshake to server,
+            account configuration, etc
+          - If successful, Tycho will trigger a switch to Sprint Network
+          - If successful, Tycho will start OMA-DM activation sessions
+
+        The device will finally stay on Sprint network if everything goes well.
+
+        Args:
+          ad: Android device need to start Tycho activation.
+        """
+        extra = {'device_setup': True, 'has_account': True}
+        self.start_activity(ad, _TYCHO_PKG, TychoClassId.CARRIER_SETUP, extra)
+
+    def start_super_network_activation(self, ad):
+        """Start the Super-Network activation.
+
+        For in-app Tycho activition (post-SUW tests), this method starts
+        super-network activation after Tycho is initialized.
+
+        The device will finally stay on Sprint network if everything goes well.
+
+        Args:
+          ad: Android device need to start Tycho super network activation.
+        """
+        extra = {'in_setup_wizard': False, 'is_interactive': True}
+        self.start_service(ad, _TYCHO_PKG,
+                           TychoClassId.ACTIVATE_SUPER_NETWORK_SERVICE, extra,
+                           ActionTypeId.TYCHO_ACTIVATE_SUPER_NETWORK)
+
+    def get_active_carrier(self, ad):
+        """Gets the active carrier profile value from the device.
+
+        Args:
+            ad: An AndroidDevice Object.
+
+        Returns:
+            (string) A key from the CARRIER_TO_MCC_MNC map representing the
+            active carrier.
+
+        Raises:
+            KeyError: when an mcc_mnc code reported by the device is not a
+            recognized Fi partner carrier.
+        """
+        mcc_mnc = ad.droid.telephonyGetSimOperator()
+        if not mcc_mnc:
+            return "UNKNOWN"
+        try:
+            return operator_name_from_plmn_id(mcc_mnc)
+        except KeyError:
+            ad.log.error('Unknown Mobile Country Code/Mobile Network Code %s',
+                         mcc_mnc)
+            raise
+
+    def switch_sim(self, ad):
+        """Requests switch between physical sim and esim.
+
+        Args:
+            ad: An AndroidDevice Object.
+            timeout: (optional -- integer) the number of seconds in which a
+                     switch should be completed.
+
+        Raises:
+            Error: whenever a device is not set to the desired carrier within
+                   the timeout window.
+        """
+        old_sim_operator = ad.droid.telephonyGetSimOperatorName()
+        ad.log.info("Before SIM switch, SIM operator = %s", old_sim_operator)
+        send_dialer_secret_code(ad, "794824746")
+        time.sleep(10)
+        new_sim_operator = ad.droid.telephonyGetSimOperatorName()
+        ad.log.info("After SIM switch, SIM operator = %s", new_sim_operator)
+        refresh_droid_config(self.log, ad)
+        return old_sim_operator != new_sim_operator
+
+    def set_active_carrier(self,
+                           ad,
+                           carrier,
+                           timeout=_MAX_WAIT_TIME,
+                           check_interval=10):
+        """Requests an active carrier to be set on the device sim.
+
+        If switching to a different carrier, after the switch is completed
+        auto-switching will be disabled. To re-enable, call
+        enable_auto_switching.
+
+        Args:
+            ad: An AndroidDevice Object.
+            carrier: (carrier_constants.Carrier) Which carrier to switch to.
+            timeout: (optional -- integer) the number of seconds in which a
+                     switch should be completed.
+
+        Raises:
+            Error: whenever a device is not set to the desired carrier within
+                   the timeout window.
+        """
+        # If there's no need to switch, then don't.
+
+        if self.pre_switching_callbox_setup():
+            self.log.info("Turned ON Anritsu for Switching")
+            pass
+        else:
+            self.log.error("Failed to Camp to Anritsu")
+            return False
+
+        max_time = timeout
+        while max_time >= 0:
+            if self.is_ready_to_make_carrier_switch(ad):
+                break
+            time.sleep(check_interval)
+            max_time -= check_interval
+        else:
+            ad.log.error("Device stays in carrier switch lock state")
+            return False
+        if carrier == CARRIER_AUTO:
+            send_dialer_secret_code(ad, _CARRIER_DIALER_CODE_LOOKUP[carrier])
+            return True
+        old_carrier = self.get_active_carrier(ad)
+        if carrier == old_carrier:
+            ad.log.info('Already on %s, so no need to switch', carrier)
+            return True
+
+        # Start switch on device, using events to verify that the switch starts.
+        ad.log.info('Initiating unsolicited switch from %s to %s.',
+                    old_carrier, carrier)
+        send_dialer_secret_code(ad, _CARRIER_DIALER_CODE_LOOKUP[carrier])
+        return self.wait_for_carrier_switch_completed(
+            ad, carrier, timeout=timeout, check_interval=check_interval)
+
+    def is_switching_silent(self, ad):
+        """Checks if Tycho switching controller is in silent mode.
+
+        Note that silent mode is a sign of airplane mode, not of a switching \
+        lock.
+
+        Args: ad: An AndroidDevice Object.
+
+        Returns:
+            A Boolean True if the preferences file reports True, False
+            otherwise.
+        """
+        return "isInSilentMode\" value=\"true" in ad.adb.shell(
+            "cat %s | grep isInSilentMode" % _SWITCHING_PREF_FILE,
+            ignore_status=True)
+
+    def is_switching_locked(self, ad):
+        """Checks if Tycho switching controller is locked.
+
+        Args: ad: An AndroidDevice Object.
+
+        Returns:
+            A Boolean True if the switching controller is locked for any reason,
+            False otherwise.
+        """
+        return "switchingInProgress\" value=\"true" in ad.adb.shell(
+            "cat %s | grep switchingInProgress" % _SWITCHING_PREF_FILE)
+
+    def is_ready_to_make_carrier_switch(self, ad):
+        """Checks if device is ready to make carrier switch.
+
+        Args:
+            ad: An AndroidDevice Object.
+
+        Returns:
+             A Boolean True if it is ready to make switch, False otherwise.
+        """
+        # Check Tycho switching controller states.
+        if self.is_switching_silent(ad):
+            ad.log.info(
+                "Cannot make carrier switch: SwitchingController is in silent "
+                "mode!")
+            return False
+        if self.is_switching_locked(ad):
+            ad.log.info(
+                "Cannot make carrier switch: SwitchingController is locked!")
+            return False
+        if self.is_carrier_switch_in_progress(ad):
+            ad.log.info("Cannot make carrier switch: Switch in progress!")
+            return False
+        return True
+
+    def is_carrier_switch_in_progress(self, ad):
+        """Checks if Tycho says that a switch is currently in progress.
+
+        Args:
+            ad: An AndroidDevice Object.
+
+        Returns:
+             A Boolean True if the preferences file reports True, False
+             otherwise.
+        """
+        switching_preferences = ad.adb.shell("cat %s" % _SWITCHING_PREF_FILE)
+        return 'InProgress\" value=\"true' in switching_preferences
+
+    def check_network_carrier(self, ad, carrier):
+        current_carrier = self.get_active_carrier(ad)
+        ad.log.info("Current network carrier is %s", current_carrier)
+        is_in_switch = self.is_carrier_switch_in_progress(ad)
+        ad.log.info("Device in carrier switch progress mode")
+        return current_carrier == carrier and is_in_switch
+
+    def wait_for_carrier_switch_completed(self,
+                                          ad,
+                                          carrier,
+                                          timeout=_MAX_WAIT_TIME,
+                                          check_interval=10):
+        """Wait for carrier switch to complete.
+
+        This function waits for a carrier switch to complete by monitoring the
+        Tycho switching controller preference file.
+
+        Args:
+            ad: An Android device object.
+            carrier: The target carrier network to switch to.
+            timeout: (integer) Time wait for switch to complete.
+
+        Return:
+            True or False for successful/unsuccessful switch.
+        """
+        check_args = [ad, carrier]
+        if wait_for_state(self.check_network_carrier, True, check_interval,
+                          timeout, *check_args):
+            ad.log.info("Switched to %s successfully", carrier)
+            ad.send_keycode("ENTER")
+            return True
+        else:
+            active_carrier = self.get_active_carrier(ad)
+            if active_carrier == carrier:
+                ad.log.info("Switched to %s successfully", carrier)
+                return True
+            ad.log.error("Carrier is %s. Fail to switch to %s", active_carrier,
+                         carrier)
+            return False
+
+    def operator_network_switch(self, ad, carrier):
+        if ad.droid.telephonyGetSimOperatorName() == "Google Fi":
+            for i in range(3):
+                if self.set_active_carrier(ad, carrier):
+                    break
+                elif i == 2:
+                    ad.log.error("Failed to switch to %s", carrier)
+                    return False
+        if not ensure_phone_subscription(self.log, ad):
+            ad.log.error("Unable to find a valid subscription!")
+            return False
+        refresh_droid_config(self.log, ad)
+        return True
+
+    def network_switch_test(self, carrier):
+        tasks = [(self.operator_network_switch, [ad, carrier])
+                 for ad in self.android_devices]
+        if not multithread_func(self.log, tasks):
+            abort_all_tests(self.log,
+                            "Unable to switch to network %s" % carrier)
+        return True
+
+    """ Tests Begin """
+
+    @test_tracker_info(uuid="4d92318e-4980-471a-882b-3136c5dda384")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_project_fi_account_activation(self):
+        """Test activate Fi account.
+
+        Returns:
+            True if success.
+            False if failed.
+        """
+        tasks = [(self._account_registration, [ad])
+                 for ad in self.android_devices]
+        try:
+            if not multithread_func(self.log, tasks):
+                abort_all_tests(self.log, "Unable to activate Fi account!")
+        except Exception as e:
+            self.log.error(e)
+            abort_all_tests(self.log, "Unable to activate Fi account!")
+        return True
+
+    @test_tracker_info(uuid="6bfbcc1d-e318-4964-bf36-5b82f086860d")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_switch_to_tmobile_network(self):
+        """Test switch to tmobile network.
+
+        Returns:
+            True if success.
+            False if failed.
+        """
+        setattr(self.ad, "sim_card", "FiTMO")
+        return self.network_switch_test(CARRIER_TMO)
+
+    @test_tracker_info(uuid="4f27944d-f3c5-423d-b0c5-5c66dbb98376")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_switch_to_sprint_network(self):
+        """Test switch to sprint network.
+
+        Returns:
+            True if success.
+            False if failed.
+        """
+        setattr(self.ad, "sim_card", "FiSPR")
+        return self.network_switch_test(CARRIER_SPT)
+
+    @test_tracker_info(uuid="5f30c9bd-b79e-4805-aa46-7855ed9023f0")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_switch_to_uscc_network(self):
+        """Test switch to uscc network.
+
+        Returns:
+            True if success.
+            False if failed.
+        """
+        setattr(self.ad, "sim_card", "FiUSCC")
+        return self.network_switch_test(CARRIER_USCC)
+
+    @test_tracker_info(uuid="0b062751-d59d-420e-941e-3ffa02aea0d5")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_switch_to_auto_network(self):
+        """Test switch to auto network selection.
+
+        Returns:
+            True if success.
+            False if failed.
+        """
+        return self.network_switch_test(CARRIER_AUTO)
+
+    @test_tracker_info(uuid="13c5f080-69bf-42fd-86ed-c67b1984c347")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_switch_between_sim(self):
+        """Test switch between physical sim and esim.
+
+        Returns:
+            True if success.
+            False if failed.
+        """
+        for ad in self.android_devices:
+            self.switch_sim(ad)
+
+    @test_tracker_info(uuid="")
+    @TelephonyBaseTest.tel_test_wrap
+    def test_remove_google_account(self):
+        for ad in self.android_devices:
+            remove_google_account(ad)
+
+
+""" Tests End """
diff --git a/acts/tests/google/tel/live/TelLiveProjectFiTest.py b/acts/tests/google/tel/live/TelLiveProjectFiTest.py
index b5a60f4..a86939c 100644
--- a/acts/tests/google/tel/live/TelLiveProjectFiTest.py
+++ b/acts/tests/google/tel/live/TelLiveProjectFiTest.py
@@ -36,6 +36,8 @@
 from acts.test_utils.tel.tel_test_utils import send_dialer_secret_code
 from acts.test_utils.tel.tel_test_utils import toggle_airplane_mode_by_adb
 from acts.test_utils.tel.tel_test_utils import wait_for_state
+from acts.test_utils.tel.tel_test_utils import add_google_account
+from acts.test_utils.tel.tel_test_utils import remove_google_account
 
 CARRIER_AUTO = "auto"
 
@@ -96,44 +98,6 @@
     def setup_class(self):
         self.activation_attemps = self.user_params.get("activation_attemps", 3)
 
-    def _add_google_account(self, ad, retries=3):
-        for _ in range(3):
-            ad.ensure_screen_on()
-            output = ad.adb.shell(
-                'am instrument -w -e account "%s@gmail.com" -e password '
-                '"%s" -e sync true -e wait-for-checkin false '
-                'com.google.android.tradefed.account/.AddAccount' %
-                (ad.user_account, ad.user_password))
-            if "result=SUCCESS" in output:
-                ad.log.info("google account is added successfully")
-                return True
-        ad.log.error("Fail to add google account due to %s", output)
-        return False
-
-    def _remove_google_account(self, ad, retries=3):
-        if not ad.is_apk_installed("com.google.android.tradefed.account"
-                                   ) and self.user_params.get("account_util"):
-            account_util = self.user_params["account_util"]
-            if isinstance(account_util, list):
-                account_util = account_util[0]
-            ad.log.info("Install account_util %s", account_util)
-            ad.ensure_screen_on()
-            ad.adb.install("-r %s" % account_util, timeout=180)
-        if not ad.is_apk_installed("com.google.android.tradefed.account"):
-            ad.log.error(
-                "com.google.android.tradefed.account is not installed")
-            return False
-        for _ in range(retries):
-            ad.ensure_screen_on()
-            output = ad.adb.shell(
-                'am instrument -w '
-                'com.google.android.tradefed.account/.RemoveAccounts')
-            if "result=SUCCESS" in output:
-                ad.log.info("google account is removed successfully")
-                return True
-        ad.log.error("Fail to remove google account due to %s", output)
-        return False
-
     def _install_account_util(self, ad):
         account_util = self.user_params["account_util"]
         if isinstance(account_util, list):
@@ -169,7 +133,7 @@
                 ad.log.error("Failed to connect to wifi")
                 return False
             ad.log.info("Add google account")
-            if not self._add_google_account(ad):
+            if not add_google_account(ad):
                 ad.log.error("Failed to add google account")
                 return False
             ad.adb.shell(
@@ -182,7 +146,7 @@
                 ad.log.info("%s is not installed", _TYCHO_PKG)
                 return False
             ad.adb.shell('pm enable %s' % _TYCHO_PKG)
-            #ad.adb.shell(_TYCHO_SERVER_LAB_OVERRIDE_CMD)
+            # ad.adb.shell(_TYCHO_SERVER_LAB_OVERRIDE_CMD)
             for i in range(1, self.activation_attemps + 1):
                 if i == self.activation_attemps:
                     ad.log.info("Reboot and try Fi activation again")
@@ -622,7 +586,7 @@
     @TelephonyBaseTest.tel_test_wrap
     def test_remove_google_account(self):
         for ad in self.android_devices:
-            self._remove_google_account(ad)
+            remove_google_account(ad)
 
 
 """ Tests End """