diff --git a/Fabric/Tests/scalability.py b/Fabric/Tests/scalability.py
index 9292a08..5197446 100755
--- a/Fabric/Tests/scalability.py
+++ b/Fabric/Tests/scalability.py
@@ -13,3 +13,576 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
+
+"""
+Check README file
+"""
+
+from oftest import config
+import logging
+import oftest.base_tests as base_tests
+import ofp
+import os
+import time
+import json
+from oftest.testutils import *
+from accton_util import *
+from oftest.utils import *
+from oftest.ofdpa_utils import *
+from accton_util import *
+
+# Number of xconnections created per port
+xcon_num = 64
+
+# Number of seconds to wait after switch restart
+rest_num = 300
+
+#### Global variable  # defined globally to check whether base_config was executed or not
+BASE_RUN = False
+
+
+#####
+##Test cases assumes the ONOS controller is Running and Fabric SWitch is configured to use ONOS as the SDN Controller
+## Test cases assumes ONOS controller is in a clean state
+## Test cases assumes Fabric switch is in clean state without any flows or group entries from a previous configuration. Its a good idea to reload the Fabric switch before starting the test cases.
+## Refer to the test plan for more details
+
+class FabricSW_Scale_Base_TC_0005(base_tests.SimpleDataPlane):
+    """
+    This Test case defines the base configuration which will serve as a pre-requisite on top of which other test cases are executed.
+    """
+    ### Read config parameters from JSON file 'global_vars.json'
+    ROOT_DIR = os.path.dirname(os.path.realpath(__file__))
+    with open(ROOT_DIR + '/' + 'global_vars.json') as f:
+        data = json.load(f)
+
+    onos_server_ip = data['onos_server_ip']
+    onos_user = data['onos_user']
+    onos_passwd = data['onos_passwd']
+    switch_ip = data['switch_ip']
+    switch_user = data['switch_user']
+    switch_passwd = data['switch_passwd']
+
+    def runTest(self):
+        global BASE_RUN
+        try:
+            if len(config[ "port_map" ]) < 4:
+                logging.info("Port count less than 4, can't run this case")
+                assert False, "Port count less than 4, can't run this case"
+                return
+
+            base_config(self)
+            onos_flow_group_dump(self)
+            switch_flow_group_dump(self)
+            time.sleep(2)
+            verify_traffic(self)
+
+        finally:
+            BASE_RUN = True
+            logging.info("End of Test")
+
+
+class FabricSW_Scale_Base_TC_0010(base_tests.SimpleDataPlane):
+    """
+    Verify that with scaled up flow configurations, rebooting the switch restores all flows and handles traffic as expected.
+    """
+    ### Read config parameters from JSON file 'global_vars.json'
+    ROOT_DIR = os.path.dirname(os.path.realpath(__file__))
+    with open(ROOT_DIR + '/' + 'global_vars.json') as f:
+        data = json.load(f)
+
+    switch_ip = data['switch_ip']
+    switch_user = data['switch_user']
+    switch_passwd = data['switch_passwd']
+
+    def runTest(self):
+        global BASE_RUN
+        try:
+            if len( config[ "port_map" ] ) < 4:
+                logging.info( "Port count less than 4, can't run this case")
+                assert False, "Port count less than 4, can't run this case"
+                return
+
+            if BASE_RUN == False:
+                logging.info("Test FabricSW_Scale_Base_TC_0010 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case,"
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0010")
+                assert False, "Test FabricSW_Scale_Base_TC_0010 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case," \
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0010"
+                return
+
+            # Reboot switch
+            logging.info("Restarting switch")
+            print("Restarting switch")
+            switch_restart(self)
+            logging.info("Switch is restarting, wait for 300 secs")
+            time.sleep(rest_num)
+            logging.info("Switch is restarted")
+
+            #Verify traffic after switch reboot
+            logging.info("Verify traffic")
+            verify_traffic(self)
+            time.sleep(2)
+
+        finally:
+            logging.info("End of Test")
+
+
+class FabricSW_Scale_Base_TC_0015(base_tests.SimpleDataPlane):
+    """
+    Verify that with scaled up flow configurations, after flapping the data port multiple times the switch restores all flows and handles traffic as expected.
+    """
+    ### Read config parameters from JSON file 'global_vars.json'
+    ROOT_DIR = os.path.dirname(os.path.realpath(__file__))
+    with open(ROOT_DIR + '/' + 'global_vars.json') as f:
+        data = json.load(f)
+
+    switch_ip = data['switch_ip']
+    switch_user = data['switch_user']
+    switch_passwd = data['switch_passwd']
+
+    def runTest(self):
+        global BASE_RUN
+        try:
+            if len( config[ "port_map" ] ) < 4:
+                logging.info( "Port count less than 4, can't run this case" )
+                assert False, "Port count less than 4, can't run this case"
+                return
+
+            if BASE_RUN == False:
+                logging.info("Test FabricSW_Scale_Base_TC_0015 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case,"
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0015")
+                assert False, "Test FabricSW_Scale_Base_TC_0015 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case," \
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0015"
+                return
+
+            ports = sorted(config["port_map"].keys())
+            # Flap port1 for 100 iterations
+            logging.info("Flap port1 for 100 iterations with an interval of '2' seconds")
+            for i in range(1, 100):
+                switch_port_enable(self, ports[0], False)
+                time.sleep(2)
+                switch_port_enable(self, ports[0], True)
+                time.sleep(2)
+
+            #Verify traffic after port flapping
+            logging.info("Verify traffic after port flapping")
+            time.sleep(20)
+            verify_traffic(self)
+
+        finally:
+            logging.info("End of Test")
+
+
+class FabricSW_Scale_Base_TC_0020(base_tests.SimpleDataPlane):
+    """
+    Verify that with scaled up flow configurations, after configuring and unconfiguring flows multiple times the switch is stable and handles traffic as expected.
+    """
+
+    ### Read config parameters from JSON file 'global_vars.json'
+    ROOT_DIR = os.path.dirname(os.path.realpath(__file__))
+    with open(ROOT_DIR + '/' + 'global_vars.json') as f:
+        data = json.load(f)
+
+    onos_server_ip = data['onos_server_ip']
+    onos_user = data['onos_user']
+    onos_passwd = data['onos_passwd']
+    onos_port = data['onos_port']
+    switch_ip = data['switch_ip']
+    switch_user = data['switch_user']
+    switch_passwd = data['switch_passwd']
+
+    def runTest(self):
+        global BASE_RUN
+        try:
+            if len( config[ "port_map" ] ) < 4:
+                logging.info( "Port count less than 4, can't run this case")
+                assert False, "Port count less than 4, can't run this case"
+                return
+
+            if BASE_RUN == False:
+                logging.info("Test FabricSW_Scale_Base_TC_0020 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case,"
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0020")
+                assert False, "Test FabricSW_Scale_Base_TC_0020 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case," \
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0020"
+                return
+
+            # Un-configure and re-configure of all 'vlan-cross-connect' pairs for 100 iterations with an interval of 5 seconds.
+            logging.info("Un-configure and re-configure of all 'vlan-cross-connect' pairs for 100 iterations with an interval of 5 seconds")
+            for i in range(1, 100):
+                print("Re-create config iteration: ", i)
+                logging.info("Re-create config iteration: {}".format(i))
+                remove_base_config(self)
+                time.sleep(5)
+                base_config(self)
+
+            #Verify traffic after config re-creation
+            logging.info("Verify traffic after config re-creation")
+            time.sleep(2)
+            verify_traffic(self)
+
+        finally:
+            logging.info("End of Test")
+
+
+class FabricSW_Scale_Base_TC_0025(base_tests.SimpleDataPlane):
+    """
+    Verify that with scaled up flow configurations, sending bursts of control traffic (resulting in "Packet_In" messages from switch to controller) the switch is stable and handles traffic as expected.
+    """
+    ### Read config parameters from JSON file 'global_vars.json'
+    ROOT_DIR = os.path.dirname(os.path.realpath(__file__))
+    with open(ROOT_DIR + '/' + 'global_vars.json') as f:
+        data = json.load(f)
+
+    switch_ip = data['switch_ip']
+    switch_user = data['switch_user']
+    switch_passwd = data['switch_passwd']
+    controller_ip = data['controller_ip']
+    controller_port = data['controller_port']
+    onos_server_ip = data['onos_server_ip']
+    onos_user = data['onos_user']
+    onos_passwd = data['onos_passwd']
+    onos_port = data['onos_port']
+
+    def runTest(self):
+        global BASE_RUN
+        try:
+            if len( config[ "port_map" ] ) < 4:
+                logging.info( "Port count less than 4, can't run this case" )
+                assert False, "Port count less than 4, can't run this case"
+                return
+
+            if BASE_RUN == False:
+                logging.info("Test FabricSW_Scale_Base_TC_0025 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case,"
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0025")
+                assert False, "Test FabricSW_Scale_Base_TC_0025 cannot be executed. FabricSW_Scale_Base_TC_0005 is a pre-requisite to this test case," \
+                              " Please execute FabricSW_Scale_Base_TC_0005 before FabricSW_Scale_Base_TC_0025"
+                return
+
+            # create match
+            match = ofp.match()
+            match.oxm_list.append(ofp.oxm.eth_type(0x0800))
+            match.oxm_list.append(ofp.oxm.ip_proto(1))
+            request = ofp.message.flow_add(table_id=60, cookie=42, match=match, instructions=[
+                ofp.instruction.apply_actions(actions=[
+                    ofp.action.output(port=ofp.OFPP_CONTROLLER, max_len=ofp.OFPCML_NO_BUFFER)]), ],
+                                           buffer_id=ofp.OFP_NO_BUFFER, priority=1)
+            logging.info("Add an ACL table entry to match ICMP packets and send to controller")
+            self.controller.message_send(request)
+
+            # Sent a burst of 64 ICMP packets to data ports 2, 3, and 4.
+            logging.info("Sent a burst of 64 ICMP packets to data ports 2, 3, and 4.")
+            ports = sorted(config["port_map"].keys())
+            # Send ICMP packets to port2
+            pair = [ports[0], ports[1]]
+            tmp_ports = list(pair)
+            tmp_ports.remove(pair[0])
+            logging.info("Creating ICMP packets for port2")
+            # change dest based on port number
+            mac_src = '00:12:34:56:78:%02X' % pair[1]
+            parsed_pkt = simple_icmp_packet(eth_src=mac_src)
+            pkt = str(parsed_pkt)
+
+            for i in range(64):
+                self.dataplane.send(pair[1], pkt)
+                print('ICMP to port1 iteration:', i)
+                verify_packet_in(self, pkt, ports[1], ofp.OFPR_ACTION)
+
+            # Send ICMP packets to port3
+            pair = [ports[0], ports[2]]
+            tmp_ports = list(pair)
+            tmp_ports.remove(pair[0])
+            logging.info("Creating ICMP packets for port3")
+            # change dest based on port number
+            mac_src = '00:12:34:56:78:%02X' % pair[1]
+            parsed_pkt = simple_icmp_packet(eth_src=mac_src)
+            pkt = str(parsed_pkt)
+
+            for i in range(64):
+                self.dataplane.send(pair[1], pkt)
+                print('ICMP to port2 iteration:', i)
+                verify_packet_in(self, pkt, ports[2], ofp.OFPR_ACTION)
+                # time.sleep(2)
+
+            # Send ICMP packets to port4
+            pair = [ports[0], ports[3]]
+            tmp_ports = list(pair)
+            tmp_ports.remove(pair[0])
+            logging.info("Creating ICMP packets for port4")
+            # change dest based on port number
+            mac_src = '00:12:34:56:78:%02X' % pair[1]
+            parsed_pkt = simple_icmp_packet(eth_src=mac_src)
+            pkt = str(parsed_pkt)
+
+            for i in range(64):
+                self.dataplane.send(pair[1], pkt)
+                print('ICMP to port3 iteration: ', i)
+                verify_packet_in(self, pkt, ports[3], ofp.OFPR_ACTION)
+
+        finally:
+            remove_base_config(self)
+            logging.info("End of Test")
+
+def base_config(self):
+    ports = (config["port_map"].keys())
+    datapathid = get_datapathid(self)
+    l = []
+    start, end = 101, (101 + xcon_num)
+    l.extend(range(start, end))
+    # Create flows between port1 and port2
+    logging.info("Configure 64 vlan-cross-connect pair between data ports 1 and 2 for vlan101 to vlan164")
+    for i in l:
+        print('adding xconn port1-2', i)
+        add_onos_xconnect(self, datapathid, i, ports[0], ports[1])
+
+    # Create flows between port1 and port3
+    logging.info("Configure 64 vlan-cross-connect pair between data ports 1 and 3 for vlan201 to vlan264")
+    l = []
+    start, end = 201, (201 + xcon_num)
+    l.extend(range(start, end))
+    for i in l:
+        print('adding xconn port1-3', i)
+        add_onos_xconnect(self, datapathid, i, ports[0], ports[2])
+
+    # Create flows between port1 and port3
+    logging.info("Configure 64 vlan-cross-connect pair between data ports 1 and 4 for vlan301 to vlan364")
+    l = []
+    start, end = 301, (301 + xcon_num)
+    l.extend(range(start, end))
+    for i in l:
+        print('adding xconn port1-4', i)
+        add_onos_xconnect(self, datapathid, i, ports[0], ports[3])
+
+
+def remove_base_config(self):
+    datapathid = get_datapathid(self)
+    l = []
+    start, end = 101, (101 + xcon_num)
+    l.extend(range(start, end))
+    # Remove flows vlan101 - vlan164 between ports 1 and 2
+    logging.info("Remove flows vlan101 - vlan164 between ports 1 and 2")
+    for i in l:
+        remove_onos_xconnect(self, datapathid, i)
+
+    #Removeflows vlan201 - vlan264 between ports 1 and 3
+    logging.info("Remove flows vlan201 - vlan264 between ports 1 and 3")
+    l = []
+    start, end = 201, (201 + xcon_num)
+    l.extend(range(start, end))
+    for i in l:
+        remove_onos_xconnect(self, datapathid, i)
+
+    # Remove flows vlan301 - vlan364 between ports 1 and 4
+    logging.info("Remove flows vlan301 - vlan364 between ports 1 and 4")
+    l = []
+    start, end = 301, (301 + xcon_num)
+    l.extend(range(start, end))
+    for i in l:
+        remove_onos_xconnect(self, datapathid, i)
+
+
+def verify_traffic(self):
+    ports = sorted(config["port_map"].keys())
+
+##### Reverse traffic verification. From BNG to OLT" ########
+    # # Create and send packets between port1 and port2
+    # pair = [ports[0], ports[1]]
+    # packets1 = []
+    # logging.info("Create double tagged vlan packets with outer vlan IDs 101 - 164 between port1 and port2")
+    # # change dest based on port number
+    # mac_src = '00:12:34:56:78:%02X' % ports[0]
+    # l = []
+    # start, end = 101, (101 + xcon_num)
+    # l.extend(range(start, end))
+    # for i in l:
+    #     parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True,
+    #                                             out_vlan_vid=i, in_dl_vlan_enable=True, in_vlan_vid=10,
+    #                                             eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
+    #
+    #     pkt = str(parsed_pkt)
+    #     packets1.append(pkt)
+    #
+    # logging.info("Transmit double tagged vlan packets with outer vlan101 - vlan164 to data port1")
+    # logging.info("Verify packets are flooded out of data port 2")
+    # for i in packets1:
+    #     self.dataplane.send(pair[0], i)
+    #     print('verify port1-2, xcon: ', (packets1.index(i)+101))
+    #     verify_packet(self, i, pair[1])
+    #     verify_no_packet(self, i, pair[0])
+
+
+    # time.sleep(1)
+
+##### Reverse traffic verification. From BNG to OLT" ########
+    # # Create and send packets between port1 and port3
+    # pair = [ports[0], ports[2]]
+    # packets2 = []
+    # logging.info("Create double tagged vlan packets with outer vlan IDs 201 - 264 between port1 and port3")
+    # # change dest based on port number
+    # mac_src = '00:12:34:56:78:%02X' % ports[0]
+    # l = []
+    # start, end = 201, (201 + xcon_num)
+    # l.extend(range(start, end))
+    # for i in l:
+    #     parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True,
+    #                                             out_vlan_vid=i, in_dl_vlan_enable=True, in_vlan_vid=10,
+    #                                             eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
+    #
+    #     pkt = str(parsed_pkt)
+    #     packets2.append(pkt)
+    #
+    # logging.info("Transmit double tagged vlan packets with outer vlan201 - vlan264 to data port1")
+    # logging.info("Verify packets are flooded out of data port 3")
+    # for i in packets2:
+    #     self.dataplane.send(pair[0], i)
+    #     # verify traffic
+    #     print('verify port1-3, xcon: ', packets2.index(i)+201)
+    #     verify_packet(self, i, pair[1])
+    #     verify_no_packet(self, i, pair[0])
+    #
+    # time.sleep(1)
+
+##### Reverse traffic verification. From BNG to OLT" ########
+    # Create and send packets between port1 and port4
+    # pair = [ports[0], ports[3]]
+    # packets3 = []
+    # logging.info(
+    #     "Create double tagged vlan packets with outer vlan IDs 301 - 364 between port1 and port4")
+    # # change dest based on port number
+    # mac_src = '00:12:34:56:78:%02X' % pair[0]
+    # l = []
+    # start, end = 301, (301 + xcon_num)
+    # l.extend(range(start, end))
+    # for i in l:
+    #     parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True,
+    #                                             out_vlan_vid=i, in_dl_vlan_enable=True, in_vlan_vid=10,
+    #                                             eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
+    #
+    #     pkt = str(parsed_pkt)
+    #     packets3.append(pkt)
+    #
+    # logging.info("Transmit double tagged vlan packets with outer vlan301 - vlan364 to data port1")
+    # logging.info("Verify packets are flooded out of data port 4")
+    # for i in packets3:
+    #     self.dataplane.send(pair[0], i)
+    #     # verify traffic
+    #     print('verify port1-4, xcon: ', packets3.index(i)+301)
+    #     verify_packet(self, i, pair[1])
+    #     verify_no_packet(self, i, pair[0])
+    #
+    # time.sleep(1)
+
+    # Create and send packets between port2 and port1
+    pair = [ports[0], ports[1]]
+    packets1 = []
+    logging.info("Create double tagged vlan packets with outer vlan IDs 101 - 164 between port2 and port1")
+    # change dest based on port number
+    mac_src = '00:12:34:56:78:%02X' % ports[1]
+    l = []
+    start, end = 101, (101 + xcon_num)
+    l.extend(range(start, end))
+    for i in l:
+        parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True,
+                                                out_vlan_vid=i, in_dl_vlan_enable=True, in_vlan_vid=10,
+                                                eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
+
+        pkt = str(parsed_pkt)
+        packets1.append(pkt)
+
+    logging.info("Transmit double tagged vlan packets with outer vlan101 - vlan164 to data port2")
+    logging.info("Verify packets are flooded out of data port 1")
+    for i in packets1:
+        logging.info("Transmitting packet {}".format(packets1.index(i) + 1))
+        self.dataplane.send(pair[1], i)
+        # verify traffic
+        print('verify port2-1, xcon: ', packets1.index(i)+101)
+        verify_packet(self, i, pair[0])
+        verify_no_packet(self, i, pair[1])
+
+    time.sleep(1)
+
+# # Create and send packets between port3 and port1
+    pair = [ports[0], ports[2]]
+    packets2 = []
+    logging.info("Create double tagged vlan packets with outer vlan IDs 201 - 264 between port3 and port1")
+    # change dest based on port number
+    mac_src = '00:12:34:56:78:%02X' % ports[2]
+    l = []
+    start, end = 201, (201 + xcon_num)
+    l.extend(range(start, end))
+    for i in l:
+        parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True,
+                                                out_vlan_vid=i, in_dl_vlan_enable=True, in_vlan_vid=10,
+                                                eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
+
+        pkt = str(parsed_pkt)
+        packets2.append(pkt)
+
+    logging.info("Transmit double tagged vlan packets with outer vlan101 - vlan164 to data port3")
+    logging.info("Verify packets are flooded out of data port 1")
+    for i in packets2:
+        logging.info("Transmitting packet {}".format(packets2.index(i) + 1))
+        self.dataplane.send(pair[1], i)
+        # verify traffic
+        print('verify port3-1, xcon: ', packets2.index(i)+201)
+        verify_packet(self, i, pair[0])
+        verify_no_packet(self, i, pair[1])
+
+    time.sleep(1)
+
+    # Create and send packets between port4 and port1
+    pair = [ports[0], ports[3]]
+    packets3 = []
+    logging.info(
+        "Create double tagged vlan packets with outer vlan IDs 301 - 364 between port4 and port1")
+    # change dest based on port number
+    mac_src = '00:12:34:56:78:%02X' % ports[3]
+    l = []
+    start, end = 301, (301 + xcon_num)
+    l.extend(range(start, end))
+    for i in l:
+        parsed_pkt = simple_tcp_packet_two_vlan(pktlen=108, out_dl_vlan_enable=True,
+                                                out_vlan_vid=i, in_dl_vlan_enable=True, in_vlan_vid=10,
+                                                eth_dst='00:12:34:56:78:9a', eth_src=mac_src)
+
+        pkt = str(parsed_pkt)
+        packets3.append(pkt)
+
+    logging.info("Transmit double tagged vlan packets with outer vlan101 - vlan164 to data port4")
+    logging.info("Verify packets are flooded out of data port 1")
+    for i in packets3:
+        logging.info("Transmitting packet {}".format(packets3.index(i) + 1))
+        self.dataplane.send(pair[1], i)
+        # verify traffic
+        print('verify port4-1, xcon: ', packets3.index(i)+301)
+        verify_packet(self, i, pair[0])
+        verify_no_packet(self, i, pair[1])
+
+
+def get_datapathid(self):
+    feature_reply = get_featureReplay(self)
+    str_datapath_id_f = "{:016x}".format(feature_reply.datapath_id)
+    return str_datapath_id_f
+
+def onos_flow_group_dump(self, logfile_name="ONOS_flow_and_groups_dump.log"):
+    # Dump the created flows and groups from ONOS in a separate file
+    datapathid = get_datapathid(self)
+    log_path = (config["log_dir"])
+    log_file = logfile_name
+    logging.info(
+        "The configured flow and group entries from onos are dumped to " + log_path + '/' + log_file)
+    send_command_to_onos_cli(log_file, "flows -s any " + datapathid, self.onos_server_ip, self.onos_user,
+                             self.onos_passwd, regexp='onos>')
+    send_command_to_onos_cli(log_file, "groups", self.onos_server_ip, self.onos_user, self.onos_passwd, regexp='onos>')
+
+
+def switch_flow_group_dump(self, logfile_name="Switch_flow_and_groups_dump.log"):
+    # Dump the created flows and groups from Openflow Switch in a separate file
+    datapathid = get_datapathid(self)
+    log_path = (config["log_dir"])
+    log_file = logfile_name
+    logging.info(
+        "The configured flow and group entries from switch are dumped to " + log_path + '/' + log_file)
+    send_command_to_switch_cli(log_file, "client_flowtable_dump", self.switch_ip,
+                               self.switch_user, self.switch_passwd, regexp='root@localhost:~#')
+    send_command_to_switch_cli(log_file, "client_grouptable_dump", self.switch_ip,
+                               self.switch_user, self.switch_passwd, regexp='root@localhost:~#')
\ No newline at end of file
diff --git a/Fabric/Tests/seba-1.0.0 b/Fabric/Tests/seba1.0
similarity index 87%
rename from Fabric/Tests/seba-1.0.0
rename to Fabric/Tests/seba1.0
index 66a2245..ce647b4 100644
--- a/Fabric/Tests/seba-1.0.0
+++ b/Fabric/Tests/seba1.0
@@ -17,7 +17,7 @@
 
 
 ##########################################################################################
-###########################  CORD CERTIFICATION PROGRAM (CCP)   ########################## 
+###########################  CORD CERTIFICATION PROGRAM (CCP)   ##########################
 ##########################################################################################
 
 ##############   This file lists the mandatory test cases to be executed  ################
@@ -74,8 +74,14 @@
 
 
 
-
-
-
 ### Scalability Test cases ###
-## Total #test cases - 
+## Total #test cases - 5
+
+##################   Scalability tests have to be with both OFTEST and ONOS controller configured  ###########
+
+#scalability.FabricSW_Scale_Base_TC_0005
+#scalability.FabricSW_Scale_Base_TC_0010
+#scalability.FabricSW_Scale_Base_TC_0015
+#scalability.FabricSW_Scale_Base_TC_0020
+#scalability.FabricSW_Scale_Base_TC_0025
+
diff --git a/Fabric/Utilities/accton/accton_util.py b/Fabric/Utilities/accton/accton_util.py
index b0752e6..592265e 100755
--- a/Fabric/Utilities/accton/accton_util.py
+++ b/Fabric/Utilities/accton/accton_util.py
@@ -1880,40 +1880,32 @@
 
 
 def ofagent_restart(self):
-    log_path = (config["log_dir"])
-    log_file = "OF_agent_service_restart.log"
     regexp = 'Setting up OFDPA running environment'
-    output = open(log_path + '/' + log_file, 'w')
     cmd = "service ofagentd restart"
+    logging.info(cmd)
     child = pexpect.spawn('ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + self.switch_user +'@%s' % self.switch_ip)
     child.expect('[pP]assword:')
     child.sendline(self.switch_passwd)
-    child.logfile = output
     child.expect('root@localhost:~#')
     child.sendline(cmd)
     if regexp:
         child.expect(regexp)
 
-    output.close()
     child.close()
 
 
 def switch_restart(self):
-    log_path = (config["log_dir"])
-    log_file = "Switch_restart.log"
     regexp = 'The system is going down for reboot NOW!'
-    output = open(log_path + '/' + log_file, 'w')
     cmd = "reboot"
+    logging.info(cmd)
     child = pexpect.spawn('ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + self.switch_user +'@%s' % self.switch_ip)
     child.expect('[pP]assword:')
     child.sendline(self.switch_passwd)
-    child.logfile = output
     child.expect('root@localhost:~#')
     child.sendline(cmd)
     if regexp:
         child.expect(regexp)
 
-    output.close()
     child.close()
 
 
@@ -1921,10 +1913,7 @@
     # @parameters:
     # port - port number on the switch to admin state Enable or Disable
     # state - admin state "False" - Down or "True" - Up for switch's port
-    log_path = (config["log_dir"])
-    log_file = "Switch_port_" + str(state) + ".log"
     regexp = 'Returned from ofdpaBcmCommand rpc with rc = 0.'
-    output = open(log_path + '/' + log_file, 'w')
     if state == False:
         cmd = "client_drivshell port xe{} enable=false".format(port - 1)
     elif state == True:
@@ -1932,16 +1921,15 @@
     else:
         assert False, "Incorrect port state parameter is given!"
 
+    logging.info(cmd)
     child = pexpect.spawn('ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + self.switch_user +'@%s' % self.switch_ip)
     child.expect('[pP]assword:')
     child.sendline(self.switch_passwd)
-    child.logfile = output
     child.expect('root@localhost:~#')
     child.sendline(cmd)
     if regexp:
         child.expect(regexp)
 
-    output.close()
     child.close()
 
 
@@ -1949,27 +1937,24 @@
     # @parameters:
     # port - port number on the switch to admin state Enable or Disable
     # mtu - size of MTU for switch's port in bytes
-    log_path = (config["log_dir"])
-    log_file = "Switch_port_set_mtu_" + str(mtu) + ".log"
     regexp = 'Returned from ofdpaBcmCommand rpc with rc = 0.'
-    output = open(log_path + '/' + log_file, 'w')
     cmd = ("client_drivshell port xe{} FrameMax=" + str(mtu)).format(port - 1)
+    logging.info(cmd)
     child = pexpect.spawn('ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + self.switch_user +'@%s' % self.switch_ip)
     child.expect('[pP]assword:')
     child.sendline(self.switch_passwd)
-    child.logfile = output
     child.expect('root@localhost:~#')
     child.sendline(cmd)
     if regexp:
         child.expect(regexp)
 
-    output.close()
     child.close()
 
 
 def send_command_to_switch_cli(log_file, cmd, switch_ip, switch_user, switch_passwd, regexp=None):
     log_path = (config["log_dir"])
-    output = open(log_path + '/' + log_file, 'w')
+    output = open(log_path + '/' + log_file, 'a+')
+    logging.info(cmd)
     child = pexpect.spawn('ssh -p 22 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + switch_user +'@%s' % switch_ip)
     child.expect('[pP]assword:')
     child.sendline(switch_passwd)
@@ -1985,7 +1970,8 @@
 
 def send_command_to_onos_cli(log_file, cmd, onos_server, onos_user, onos_passwd, regexp=None):
     log_path = (config["log_dir"])
-    output = open(log_path + '/' + log_file, 'w')
+    output = open(log_path + '/' + log_file, 'a+')
+    logging.info(cmd)
     child = pexpect.spawn('ssh -p 30115 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + onos_user + '@%s' % onos_server)
     child.expect('[pP]assword:')
     child.sendline(onos_passwd)
@@ -1999,47 +1985,40 @@
     child.close()
 
 
-def add_onos_xconnect(self,datapathid, vid, port1, port2):
-    log_path = (config["log_dir"])
+def add_onos_xconnect(self, datapathid, vid, port1, port2):
     cmd = "sr-xconnect-add of:" + datapathid + " " + str(vid) + " " + str(port1) + " " + str(port2)
     regexp = 'onos>'
-    output = open(log_path + '/' + "add_xconnection" + str(vid) + "_" + str(port1) + "_" + str(port2), 'w')
+    logging.info(cmd)
     child = pexpect.spawn(
         'ssh -p 30115 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + self.onos_user + '@%s' % self.onos_server_ip)
     child.expect('[pP]assword:')
     child.sendline(self.onos_passwd)
-    child.logfile = output
     child.expect('onos>')
     child.sendline(cmd)
     if regexp:
         child.expect(regexp)
 
-    output.close()
     child.close()
 
 def remove_onos_xconnect(self,datapathid, vid):
-    log_path = (config["log_dir"])
     cmd = "sr-xconnect-remove of:" + datapathid + " " + str(vid)
     regexp = 'onos>'
-    output = open(log_path + '/' + "remove_xconnection" + str(vid), 'w')
+    logging.info(cmd)
     child = pexpect.spawn(
         'ssh -p 30115 -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ' + self.onos_user + '@%s' % self.onos_server_ip)
     child.expect('[pP]assword:')
     child.sendline(self.onos_passwd)
-    child.logfile = output
     child.expect('onos>')
     child.sendline(cmd)
     if regexp:
         child.expect(regexp)
 
-    output.close()
     child.close()
 
 
 def ofagent_reconfig(self, arg):
     # @parameters:
     # arg - configure switch with both OFTest and ONOS (arg = yes) or only OFTest is required (arg = no)
-    log_path = (config["log_dir"])
     if arg == "yes":
         logging.info("Reconfigure OFAGENT to use both ONOS and OFTEST")
         comd = "sed -i '/^OPT_ARGS=/c\OPT_ARGS=\"-d 2 -c 2 -c 4 -t " + self.controller_ip + ":" + self.controller_port + " -t " + self.onos_server_ip + ":" + self.onos_port + " -i $DPID\"' /etc/ofagent/ofagent.conf"
diff --git a/Fabric/Utilities/src/python/oftest/dataplane.py b/Fabric/Utilities/src/python/oftest/dataplane.py
index 839fe9e..bc36d56 100644
--- a/Fabric/Utilities/src/python/oftest/dataplane.py
+++ b/Fabric/Utilities/src/python/oftest/dataplane.py
@@ -63,11 +63,15 @@
     #return e == p
     #some nic card have capature problem, will have more bytes capatured.
     if pkt.find(exp_pkt) >=0:
+        if self.config["dump_packet"]:
+            self.logger.debug("found pkt->"+(" ".join("{:02x}".format(ord(c)) for c in exp_pkt)))
+
         return True
     else:
         if self.config["dump_packet"]:
-            self.logger.debug("rx pkt    ->"+(" ".join("{:02x}".format(ord(c)) for c in pkt)))
-            self.logger.debug("expect pkt->"+(" ".join("{:02x}".format(ord(c)) for c in exp_pkt)))
+            pass
+            # self.logger.debug("rx pkt    ->"+(" ".join("{:02x}".format(ord(c)) for c in pkt)))
+            # self.logger.debug("expect pkt->"+(" ".join("{:02x}".format(ord(c)) for c in exp_pkt)))
 
         return False
 
@@ -246,15 +250,15 @@
                         # Enqueue packet
                         pkt, timestamp = port.recv()
                         port_number = port._port_number
-                        self.logger.debug("Pkt len %d in on port %d",
-                                          len(pkt), port_number)
+                        # self.logger.debug("Pkt len %d in on port %d",
+                        #                   len(pkt), port_number)
                         if self.pcap_writer:
                             self.pcap_writer.write(pkt, timestamp, port_number)
                         queue = self.packet_queues[port_number]
                         if len(queue) >= self.MAX_QUEUE_LEN:
                             # Queue full, throw away oldest
                             queue.pop(0)
-                            self.logger.debug("Discarding oldest packet to make room")
+                            # self.logger.debug("Discarding oldest packet to make room")
                         queue.append((pkt, timestamp))
                 self.cvar.notify_all()
 
