[v1] python: standard project structure

Message ID 1629804878-11074-1-git-send-email-juraj.linkes@pantheon.tech (mailing list archive)
State Superseded
Headers
Series [v1] python: standard project structure |

Commit Message

Juraj Linkeš Aug. 24, 2021, 11:34 a.m. UTC
DTS does not use the standard project structure and has therefore add
paths to python interpreter search paths. Move to a standard structure:
* Move main.py to the root directory (and consequently remove the
redundant dts shell script).
* Add __init__.py to directories from which python modules are imported.
* Adjust import paths to account for this new structure.

Moving to a standard structure has a host of positives, such as:
* No need to study any non-standard approaches. This removes any
bewilderment the developers may feel when encountering something
non-standard without proper justification (as is the case with DTS).
* Better integration with IDEs which rely on the standard structure.
* More accurate results from automated tools.

In addition to this, not only adjust the import paths but make then
explicit for modules imported from the same level, e.g. instead of using
from foo import, use from .foo import (and import bar.foo as foo, where
foo if on the same level as the importing module). This allows
developers to separate DTS modules from third party modules at a glance.

Signed-off-by: Juraj Linkeš <juraj.linkes@pantheon.tech>
---
There a number of question/notes I have about this patch:
1. Should we do the explicit import paths?
2. If so, do we want to enforce it (for new patches)? How (is there a
tool that check that or just manually in review)?
3. Some paths might not have been moved to the explicit format, as I may
have missed them.
4. I did not test the patch as I don't have access to an environment in
which I could do so. Is there a way to test it locally (i.e. without any
hw dependencies)?
5. Do we want to sort imports?
6. If so, how? Do we want to do it in this patch?
---
 dep/__init__.py                               | 30 ++++++++++++++++
 dep/scapy_modules/__init__.py                 | 30 ++++++++++++++++
 dts                                           |  7 ----
 framework/__init__.py                         | 30 ++++++++++++++++
 framework/checkCase.py                        |  4 +--
 framework/config.py                           |  6 ++--
 framework/crb.py                              | 12 +++----
 framework/crbs.py                             |  2 +-
 framework/debugger.py                         | 10 +++---
 framework/dts.py                              | 36 +++++++++----------
 framework/dut.py                              | 16 ++++-----
 framework/etgen.py                            | 12 +++----
 framework/flow/flow.py                        | 10 +++---
 framework/flow/flow_action_items.py           |  4 +--
 framework/flow/flow_items.py                  | 10 +++---
 framework/flow/flow_pattern_items.py          |  8 ++---
 framework/flow/flow_rule.py                   |  6 ++--
 framework/flow/generator.py                   |  6 ++--
 framework/ixia_network/ixnet_stream.py        |  2 +-
 framework/logger.py                           |  4 +--
 framework/multiple_vm.py                      |  8 ++---
 framework/packet.py                           | 26 ++++----------
 framework/pktgen.py                           | 12 +++----
 framework/pktgen_base.py                      |  6 ++--
 framework/pktgen_ixia.py                      |  8 ++---
 framework/pktgen_ixia_network.py              |  2 +-
 framework/pktgen_trex.py                      |  2 +-
 framework/plotting.py                         | 10 +++---
 framework/pmd_output.py                       |  4 +--
 framework/project_dpdk.py                     | 20 +++++------
 framework/qemu_kvm.py                         | 10 +++---
 framework/qemu_libvirt.py                     | 18 +++++-----
 framework/rst.py                              |  4 +--
 framework/ssh_connection.py                   |  2 +-
 framework/ssh_pexpect.py                      |  6 ++--
 framework/test_case.py                        | 22 ++++++------
 framework/test_result.py                      |  2 +-
 framework/tester.py                           | 20 +++++------
 framework/virt_base.py                        | 16 ++++-----
 framework/virt_common.py                      |  8 ++---
 framework/virt_dut.py                         | 16 ++++-----
 framework/virt_resource.py                    |  2 +-
 framework/virt_scene.py                       | 18 +++++-----
 framework/main.py => main.py                  |  7 +---
 nics/__init__.py                              | 30 ++++++++++++++++
 nics/net_device.py                            |  8 ++---
 nics/perf_report.py                           | 10 +++---
 tests/TestSuite_ABI_stable.py                 |  8 ++---
 tests/TestSuite_acl.py                        |  2 +-
 tests/TestSuite_af_xdp_2.py                   |  8 ++---
 tests/TestSuite_blocklist.py                  |  8 ++---
 tests/TestSuite_cbdma.py                      | 10 +++---
 tests/TestSuite_checksum_offload.py           | 24 ++++++-------
 tests/TestSuite_cloud_filter_with_l4_port.py  | 16 ++++-----
 tests/TestSuite_cmdline.py                    |  4 +--
 tests/TestSuite_compressdev_isal_pmd.py       |  4 +--
 tests/TestSuite_compressdev_qat_pmd.py        |  4 +--
 tests/TestSuite_compressdev_zlib_pmd.py       |  4 +--
 tests/TestSuite_coremask.py                   |  6 ++--
 tests/TestSuite_crypto_perf_cryptodev_perf.py |  4 +--
 tests/TestSuite_cvl_advanced_iavf_rss.py      |  8 ++---
 ...TestSuite_cvl_advanced_iavf_rss_gtpogre.py |  8 ++---
 tests/TestSuite_cvl_advanced_iavf_rss_gtpu.py |  8 ++---
 ...advanced_iavf_rss_vlan_esp_ah_l2tp_pfcp.py | 10 +++---
 tests/TestSuite_cvl_advanced_rss.py           |  8 ++---
 tests/TestSuite_cvl_advanced_rss_gtpogre.py   |  8 ++---
 tests/TestSuite_cvl_advanced_rss_gtpu.py      |  8 ++---
 tests/TestSuite_cvl_advanced_rss_pppoe.py     |  8 ++---
 ..._cvl_advanced_rss_vlan_esp_ah_l2tp_pfcp.py | 10 +++---
 tests/TestSuite_cvl_dcf_acl_filter.py         | 10 +++---
 tests/TestSuite_cvl_dcf_date_path.py          |  6 ++--
 tests/TestSuite_cvl_dcf_flow_priority.py      | 10 +++---
 tests/TestSuite_cvl_dcf_switch_filter.py      | 10 +++---
 tests/TestSuite_cvl_dcf_switch_filter_gtpu.py | 10 +++---
 .../TestSuite_cvl_dcf_switch_filter_pppoe.py  | 10 +++---
 tests/TestSuite_cvl_ecpri.py                  | 12 +++----
 tests/TestSuite_cvl_fdir.py                   | 12 +++----
 ...TestSuite_cvl_iavf_ip_fragment_rte_flow.py | 10 +++---
 tests/TestSuite_cvl_iavf_rss_configure.py     |  8 ++---
 tests/TestSuite_cvl_ip_fragment_rte_flow.py   | 10 +++---
 tests/TestSuite_cvl_limit_value_test.py       | 12 +++----
 tests/TestSuite_cvl_qinq.py                   | 10 +++---
 tests/TestSuite_cvl_rss_configure.py          | 12 +++----
 tests/TestSuite_cvl_switch_filter.py          | 10 +++---
 tests/TestSuite_cvl_switch_filter_pppoe.py    | 10 +++---
 ...tSuite_cvl_vf_support_multicast_address.py |  6 ++--
 tests/TestSuite_dcf_lifecycle.py              | 12 +++----
 tests/TestSuite_ddp_gtp.py                    | 10 +++---
 tests/TestSuite_ddp_gtp_qregion.py            | 10 +++---
 tests/TestSuite_ddp_l2tpv3.py                 |  4 +--
 tests/TestSuite_ddp_mpls.py                   | 10 +++---
 tests/TestSuite_ddp_ppp_l2tp.py               |  8 ++---
 tests/TestSuite_distributor.py                |  6 ++--
 tests/TestSuite_dpdk_gro_lib.py               |  8 ++---
 tests/TestSuite_dpdk_gso_lib.py               | 10 +++---
 tests/TestSuite_dpdk_hugetlbfs_mount_size.py  |  4 +--
 tests/TestSuite_dual_vlan.py                  |  6 ++--
 tests/TestSuite_dynamic_config.py             |  6 ++--
 tests/TestSuite_dynamic_flowtype.py           |  8 ++---
 tests/TestSuite_dynamic_queue.py              | 10 +++---
 tests/TestSuite_eeprom_dump.py                |  6 ++--
 tests/TestSuite_efd.py                        |  6 ++--
 ...e_enable_package_download_in_ice_driver.py |  4 +--
 tests/TestSuite_etag.py                       | 12 +++----
 tests/TestSuite_ethtool_stats.py              | 12 +++----
 tests/TestSuite_eventdev_perf.py              | 16 ++++-----
 tests/TestSuite_eventdev_pipeline.py          |  6 ++--
 tests/TestSuite_eventdev_pipeline_perf.py     | 16 ++++-----
 tests/TestSuite_example_build.py              |  2 +-
 tests/TestSuite_external_memory.py            |  4 +--
 tests/TestSuite_external_mempool_handler.py   |  6 ++--
 tests/TestSuite_fdir.py                       | 10 +++---
 tests/TestSuite_fips_cryptodev.py             |  6 ++--
 tests/TestSuite_firmware_version.py           |  4 +--
 tests/TestSuite_flexible_rxd.py               |  6 ++--
 tests/TestSuite_floating_veb.py               | 16 ++++-----
 tests/TestSuite_flow_classify.py              | 10 +++---
 tests/TestSuite_flow_classify_softnic.py      | 22 ++++++------
 tests/TestSuite_flow_filtering.py             |  8 ++---
 ...tSuite_fortville_rss_granularity_config.py |  8 ++---
 tests/TestSuite_fortville_rss_input.py        |  8 ++---
 tests/TestSuite_generic_filter.py             | 10 +++---
 tests/TestSuite_generic_flow_api.py           | 22 ++++++------
 tests/TestSuite_hello_world.py                |  4 +--
 tests/TestSuite_hotplug.py                    |  6 ++--
 tests/TestSuite_hotplug_mp.py                 |  4 +--
 tests/TestSuite_iavf.py                       | 12 +++----
 tests/TestSuite_iavf_fdir.py                  | 14 ++++----
 tests/TestSuite_iavf_flexible_descriptor.py   |  4 +--
 ...tSuite_iavf_package_driver_error_handle.py |  6 ++--
 tests/TestSuite_ieee1588.py                   |  8 ++---
 tests/TestSuite_inline_ipsec.py               |  4 +--
 tests/TestSuite_interrupt_pmd.py              |  4 +--
 tests/TestSuite_ip_pipeline.py                | 22 ++++++------
 tests/TestSuite_ipfrag.py                     | 10 +++---
 tests/TestSuite_ipgre.py                      | 10 +++---
 tests/TestSuite_ipsec_gw_cryptodev_func.py    |  8 ++---
 tests/TestSuite_ipv4_reassembly.py            |  4 +--
 ...te_ixgbe_vf_get_extra_queue_information.py | 10 +++---
 tests/TestSuite_jumboframes.py                |  8 ++---
 tests/TestSuite_keep_alive.py                 |  4 +--
 tests/TestSuite_kernelpf_iavf.py              | 14 ++++----
 tests/TestSuite_kni.py                        |  8 ++---
 tests/TestSuite_l2fwd.py                      |  8 ++---
 tests/TestSuite_l2fwd_cryptodev_func.py       |  8 ++---
 tests/TestSuite_l2fwd_jobstats.py             |  4 +--
 tests/TestSuite_l2tp_esp_coverage.py          |  8 ++---
 tests/TestSuite_l3fwd.py                      |  4 +--
 tests/TestSuite_l3fwd_em.py                   |  4 +--
 tests/TestSuite_l3fwd_lpm_ipv4.py             |  4 +--
 tests/TestSuite_l3fwd_lpm_ipv4_rfc2544.py     |  4 +--
 tests/TestSuite_l3fwd_lpm_ipv6.py             |  4 +--
 tests/TestSuite_l3fwdacl.py                   |  6 ++--
 tests/TestSuite_large_vf.py                   |  8 ++---
 tests/TestSuite_link_flowctrl.py              | 10 +++---
 tests/TestSuite_link_status_interrupt.py      |  6 ++--
 tests/TestSuite_linux_modules.py              |  4 +--
 tests/TestSuite_loadbalancer.py               |  8 ++---
 ...Suite_loopback_multi_paths_port_restart.py |  6 ++--
 tests/TestSuite_loopback_multi_queues.py      |  6 ++--
 ...tSuite_loopback_virtio_user_server_mode.py |  6 ++--
 tests/TestSuite_mac_filter.py                 |  8 ++---
 tests/TestSuite_macsec_for_ixgbe.py           |  8 ++---
 ...Suite_malicious_driver_event_indication.py |  8 ++---
 tests/TestSuite_mdd.py                        |  8 ++---
 tests/TestSuite_metering_and_policing.py      | 12 +++----
 tests/TestSuite_metrics.py                    | 14 ++++----
 tests/TestSuite_mtu_update.py                 | 18 +++++-----
 tests/TestSuite_multicast.py                  |  4 +--
 tests/TestSuite_multiple_pthread.py           |  6 ++--
 tests/TestSuite_multiprocess.py               |  6 ++--
 tests/TestSuite_netmap_compat.py              |  4 +--
 tests/TestSuite_nic_single_core_perf.py       | 14 ++++----
 tests/TestSuite_ntb.py                        | 10 +++---
 tests/TestSuite_nvgre.py                      | 10 +++---
 tests/TestSuite_packet_capture.py             |  8 ++---
 tests/TestSuite_packet_ordering.py            |  6 ++--
 tests/TestSuite_perf_virtio_user_loopback.py  | 10 +++---
 tests/TestSuite_perf_virtio_user_pvp.py       | 10 +++---
 tests/TestSuite_perf_vm2vm_virtio_net_perf.py | 10 +++---
 tests/TestSuite_performance_thread.py         |  8 ++---
 tests/TestSuite_pf_smoke.py                   | 16 ++++-----
 tests/TestSuite_pipeline.py                   | 22 ++++++------
 tests/TestSuite_pmd.py                        | 16 ++++-----
 tests/TestSuite_pmd_bonded.py                 | 10 +++---
 tests/TestSuite_pmd_bonded_8023ad.py          |  8 ++---
 tests/TestSuite_pmd_stacked_bonded.py         | 10 +++---
 tests/TestSuite_pmdpcap.py                    |  4 +--
 tests/TestSuite_pmdrss_hash.py                |  4 +--
 tests/TestSuite_pmdrssreta.py                 |  6 ++--
 tests/TestSuite_port_control.py               | 10 +++---
 tests/TestSuite_port_representor.py           |  8 ++---
 tests/TestSuite_power_bidirection_channel.py  |  8 ++---
 tests/TestSuite_power_branch_ratio.py         | 18 +++++-----
 tests/TestSuite_power_empty_poll.py           | 12 +++----
 tests/TestSuite_power_negative.py             |  8 ++---
 tests/TestSuite_power_pbf.py                  | 12 +++----
 tests/TestSuite_power_pstate.py               |  8 ++---
 tests/TestSuite_power_telemetry.py            | 18 +++++-----
 tests/TestSuite_ptpclient.py                  |  4 +--
 tests/TestSuite_ptype_mapping.py              | 10 +++---
 tests/TestSuite_pvp_diff_qemu_version.py      | 10 +++---
 .../TestSuite_pvp_multi_paths_performance.py  | 14 ++++----
 ...lti_paths_vhost_single_core_performance.py | 14 ++++----
 ...ti_paths_virtio_single_core_performance.py | 14 ++++----
 ...Suite_pvp_qemu_multi_paths_port_restart.py | 10 +++---
 tests/TestSuite_pvp_share_lib.py              |  8 ++---
 ...uite_pvp_vhost_user_built_in_net_driver.py | 10 +++---
 tests/TestSuite_pvp_vhost_user_reconnect.py   | 10 +++---
 tests/TestSuite_pvp_virtio_bonding.py         | 12 +++----
 .../TestSuite_pvp_virtio_user_2M_hugepages.py |  8 ++---
 tests/TestSuite_pvp_virtio_user_4k_pages.py   |  8 ++---
 ...p_virtio_user_multi_queues_port_restart.py |  8 ++---
 tests/TestSuite_qinq_filter.py                |  6 ++--
 tests/TestSuite_qos_api.py                    |  8 ++---
 tests/TestSuite_qos_meter.py                  | 10 +++---
 tests/TestSuite_queue_region.py               | 16 ++++-----
 tests/TestSuite_queue_start_stop.py           |  8 ++---
 tests/TestSuite_rss_key_update.py             |  6 ++--
 tests/TestSuite_rss_to_rte_flow.py            |  6 ++--
 tests/TestSuite_rte_flow.py                   |  8 ++---
 tests/TestSuite_rteflow_priority.py           | 10 +++---
 tests/TestSuite_runtime_vf_queue_number.py    |  8 ++---
 ...estSuite_runtime_vf_queue_number_kernel.py | 10 +++---
 ...stSuite_runtime_vf_queue_number_maxinum.py |  4 +--
 tests/TestSuite_rxtx_callbacks.py             |  4 +--
 tests/TestSuite_rxtx_offload.py               | 16 ++++-----
 tests/TestSuite_scatter.py                    |  6 ++--
 tests/TestSuite_short_live.py                 |  6 ++--
 tests/TestSuite_shutdown_api.py               | 16 ++++-----
 tests/TestSuite_skeleton.py                   |  4 +--
 tests/TestSuite_softnic.py                    | 10 +++---
 tests/TestSuite_speed_capabilities.py         |  6 ++--
 tests/TestSuite_sriov_kvm.py                  |  8 ++---
 tests/TestSuite_stats_checks.py               |  8 ++---
 tests/TestSuite_telemetry.py                  |  6 ++--
 tests/TestSuite_testpmd_perf.py               |  4 +--
 tests/TestSuite_timer.py                      |  4 +--
 tests/TestSuite_tso.py                        | 10 +++---
 tests/TestSuite_tx_preparation.py             | 12 +++----
 tests/TestSuite_uni_pkt.py                    | 10 +++---
 tests/TestSuite_unit_tests_cmdline.py         |  4 +--
 tests/TestSuite_unit_tests_crc.py             |  4 +--
 tests/TestSuite_unit_tests_cryptodev_func.py  |  6 ++--
 tests/TestSuite_unit_tests_dump.py            |  4 +--
 tests/TestSuite_unit_tests_eal.py             |  4 +--
 tests/TestSuite_unit_tests_event_timer.py     |  4 +--
 tests/TestSuite_unit_tests_kni.py             |  4 +--
 tests/TestSuite_unit_tests_loopback.py        |  4 +--
 tests/TestSuite_unit_tests_lpm.py             |  4 +--
 tests/TestSuite_unit_tests_mbuf.py            |  4 +--
 tests/TestSuite_unit_tests_mempool.py         |  4 +--
 tests/TestSuite_unit_tests_pmd_perf.py        |  2 +-
 tests/TestSuite_unit_tests_power.py           |  4 +--
 tests/TestSuite_unit_tests_qos.py             |  4 +--
 tests/TestSuite_unit_tests_ring.py            |  4 +--
 tests/TestSuite_unit_tests_ringpmd.py         |  4 +--
 tests/TestSuite_unit_tests_timer.py           |  4 +--
 tests/TestSuite_userspace_ethtool.py          | 16 ++++-----
 tests/TestSuite_vdev_primary_secondary.py     |  6 ++--
 tests/TestSuite_veb_switch.py                 | 20 +++++------
 tests/TestSuite_vf_daemon.py                  | 12 +++----
 tests/TestSuite_vf_interrupt_pmd.py           |  8 ++---
 tests/TestSuite_vf_jumboframe.py              | 14 ++++----
 tests/TestSuite_vf_kernel.py                  | 12 +++----
 tests/TestSuite_vf_l3fwd.py                   | 10 +++---
 tests/TestSuite_vf_l3fwd_em_kernelpf.py       |  4 +--
 tests/TestSuite_vf_l3fwd_kernelpf.py          |  4 +--
 tests/TestSuite_vf_l3fwd_lpm_ipv4_kernelpf.py |  4 +--
 ...uite_vf_l3fwd_lpm_ipv4_rfc2544_kernelpf.py |  4 +--
 tests/TestSuite_vf_l3fwd_lpm_ipv6_kernelpf.py |  4 +--
 tests/TestSuite_vf_macfilter.py               |  6 ++--
 tests/TestSuite_vf_offload.py                 | 16 ++++-----
 tests/TestSuite_vf_packet_rxtx.py             |  8 ++---
 tests/TestSuite_vf_port_start_stop.py         |  8 ++---
 tests/TestSuite_vf_rss.py                     |  6 ++--
 tests/TestSuite_vf_single_core_perf.py        | 12 +++----
 tests/TestSuite_vf_smoke.py                   | 16 ++++-----
 tests/TestSuite_vf_to_vf_nic_bridge.py        |  8 ++---
 tests/TestSuite_vf_vlan.py                    | 10 +++---
 tests/TestSuite_vhost_1024_ethports.py        |  4 +--
 tests/TestSuite_vhost_cbdma.py                | 14 ++++----
 tests/TestSuite_vhost_event_idx_interrupt.py  |  6 ++--
 tests/TestSuite_vhost_multi_queue_qemu.py     | 14 ++++----
 tests/TestSuite_vhost_pmd_xstats.py           | 12 +++----
 tests/TestSuite_vhost_user_interrupt.py       |  4 +--
 tests/TestSuite_vhost_user_live_migration.py  | 10 +++---
 tests/TestSuite_vhost_virtio_pmd_interrupt.py | 10 +++---
 .../TestSuite_vhost_virtio_user_interrupt.py  |  4 +--
 tests/TestSuite_virtio_event_idx_interrupt.py |  8 ++---
 .../TestSuite_virtio_ipsec_cryptodev_func.py  | 10 +++---
 tests/TestSuite_virtio_perf_cryptodev_func.py |  8 ++---
 tests/TestSuite_virtio_pvp_regression.py      | 10 +++---
 tests/TestSuite_virtio_smoke.py               |  4 +--
 tests/TestSuite_virtio_unit_cryptodev_func.py |  8 ++---
 ...stSuite_virtio_user_as_exceptional_path.py | 10 +++---
 ...te_virtio_user_for_container_networking.py |  8 ++---
 tests/TestSuite_vlan.py                       |  8 ++---
 tests/TestSuite_vlan_ethertype_config.py      | 12 +++----
 tests/TestSuite_vm2vm_virtio_net_perf.py      |  8 ++---
 tests/TestSuite_vm2vm_virtio_pmd.py           | 10 +++---
 tests/TestSuite_vm2vm_virtio_user.py          |  8 ++---
 tests/TestSuite_vm_hotplug.py                 |  6 ++--
 tests/TestSuite_vm_power_manager.py           | 10 +++---
 tests/TestSuite_vm_pw_mgmt_policy.py          | 14 ++++----
 tests/TestSuite_vmdq.py                       |  8 ++---
 tests/TestSuite_vmdq_dcb.py                   |  8 ++---
 tests/TestSuite_vswitch_sample_cbdma.py       | 14 ++++----
 tests/TestSuite_vxlan.py                      | 14 ++++----
 tests/TestSuite_vxlan_gpe_support_in_i40e.py  |  8 ++---
 tests/__init__.py                             | 30 ++++++++++++++++
 tests/bonding.py                              | 10 +++---
 tests/compress_common.py                      |  4 +--
 tests/cryptodev_common.py                     |  4 +--
 tests/flexible_common.py                      |  4 +--
 tests/perf_test_base.py                       | 14 ++++----
 tests/rte_flow_common.py                      |  4 +--
 tests/smoke_base.py                           |  2 +-
 tests/vhost_peer_conf.py                      |  2 +-
 tools/__init__.py                             | 30 ++++++++++++++++
 tools/dump_case.py                            |  6 ++--
 tools/setup.py                                |  8 ++---
 322 files changed, 1532 insertions(+), 1376 deletions(-)
 create mode 100644 dep/__init__.py
 create mode 100644 dep/scapy_modules/__init__.py
 delete mode 100755 dts
 create mode 100644 framework/__init__.py
 rename framework/main.py => main.py (96%)
 create mode 100644 nics/__init__.py
 create mode 100644 tests/__init__.py
 create mode 100644 tools/__init__.py
  

Comments

Owen Hilyard Aug. 24, 2021, 1:46 p.m. UTC | #1
>
> (and consequently remove the redundant dts shell script).


I don't think we should be making a breaking change to the external
interface right now. It may be worth it to discuss adding a deprecation
warning to the script, but we should give time for anyone who is using DTS
to using python directly. This includes the Community CI Lab, since this
change would break our current approach to updating DTS, which is to have a
"canary" system updated and running for a bit to find potential issues
before everything else gets updated.

1. Should we do the explicit import paths?


It may be easier to force absolute import paths since I know some older
automated tooling might now handle relative imports correctly. They also
make refactoring much easier if we ever need to move files around again.


> 2. If so, do we want to enforce it (for new patches)? How (is there a tool
> that check that or just manually in review)?


I think we should just to keep everything consistent throughout the
codebase. I don't know if there is a tool, but it should be easy to look at
the top of files in a patch and check for relative imports.


> 3. Some paths might not have been moved to the explicit format, as I
> may have missed them.
> 4. I did not test the patch as I don't have access to an environment
> in which I could do so. Is there a way to test it locally (i.e. without
> any hw dependencies)?


The easiest way would probably be to put something like this in main to
test:

from framework import *
from framework.flow import *
from framework.ixia_network import *
from tests import *
from nics import *

This should import every single file in the project, which will cause every
file to evaluate its own imports. As long as nothing imports main, that
should work.

5. Do we want to sort imports?


I think that we should ask that imports are logically grouped, but not
prescribe any particular method unless we start to have issues.


> 6. If so, how? Do we want to do it in this patch?


It might make sense to do a single pass now using isort (
https://github.com/PyCQA/isort). We can discuss adding that as a tool
later, but unless there's an easy way to add it as a commit hook, it might
make sense to do it once and leave it be. DTS has a lot of other stuff to
work on, and I think that this is something we can discuss once we've fixed
some of the bigger issues.
  
Juraj Linkeš Aug. 27, 2021, 9:19 a.m. UTC | #2
From: Owen Hilyard <ohilyard@iol.unh.edu>
Sent: Tuesday, August 24, 2021 3:47 PM
To: Juraj Linkeš <juraj.linkes@pantheon.tech>
Cc: Tu, Lijuan <lijuan.tu@intel.com>; dts@dpdk.org
Subject: Re: [PATCH v1] python: standard project structure

(and consequently remove the redundant dts shell script).

I don't think we should be making a breaking change to the external interface right now. It may be worth it to discuss adding a deprecation warning to the script, but we should give time for anyone who is using DTS to using python directly. This includes the Community CI Lab, since this change would break our current approach to updating DTS, which is to have a "canary" system updated and running for a bit to find potential issues before everything else gets updated.

Good point, changing the API should definitely not be done in this patch. I'll revert this.

1. Should we do the explicit import paths?

It may be easier to force absolute import paths since I know some older automated tooling might now handle relative imports correctly. They also make refactoring much easier if we ever need to move files around again.

2. If so, do we want to enforce it (for new patches)? How (is there a tool that check that or just manually in review)?

I think we should just to keep everything consistent throughout the codebase. I don't know if there is a tool, but it should be easy to look at the top of files in a patch and check for relative imports.

This is what I was also thinking - there's value in using them and manual reviews should be sufficient.

3. Some paths might not have been moved to the explicit format, as I may have missed them.
4. I did not test the patch as I don't have access to an environment in which I could do so. Is there a way to test it locally (i.e. without any hw dependencies)?

The easiest way would probably be to put something like this in main to test:

from framework import *
from framework.flow import *
from framework.ixia_network import *
from tests import *
from nics import *

This should import every single file in the project, which will cause every file to evaluate its own imports. As long as nothing imports main, that should work.

Ok, I'll try this.

5. Do we want to sort imports?

I think that we should ask that imports are logically grouped, but not prescribe any particular method unless we start to have issues.

6. If so, how? Do we want to do it in this patch?

It might make sense to do a single pass now using isort (https://github.com/PyCQA/isort). We can discuss adding that as a tool later, but unless there's an easy way to add it as a commit hook, it might make sense to do it once and leave it be. DTS has a lot of other stuff to work on, and I think that this is something we can discuss once we've fixed some of the bigger issues.

I'll do the sort now then.
For now, we could add this to the "reviewed by DTS workgroup" requirements (along with the relative imports) and just check it manually during review. In the future, we could just add a check to a syntax checking job.
  

Patch

diff --git a/dep/__init__.py b/dep/__init__.py
new file mode 100644
index 00000000..ae0043b7
--- /dev/null
+++ b/dep/__init__.py
@@ -0,0 +1,30 @@ 
+#!/usr/bin/python3
+# BSD LICENSE
+#
+# Copyright (c) 2021 PANTHEON.tech s.r.o.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of PANTHEON.tech s.r.o. nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/dep/scapy_modules/__init__.py b/dep/scapy_modules/__init__.py
new file mode 100644
index 00000000..ae0043b7
--- /dev/null
+++ b/dep/scapy_modules/__init__.py
@@ -0,0 +1,30 @@ 
+#!/usr/bin/python3
+# BSD LICENSE
+#
+# Copyright (c) 2021 PANTHEON.tech s.r.o.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of PANTHEON.tech s.r.o. nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/dts b/dts
deleted file mode 100755
index f408e5b9..00000000
--- a/dts
+++ /dev/null
@@ -1,7 +0,0 @@ 
-#!/bin/bash
-
-# <COPYRIGHT_TAG>
-
-PWD=`dirname $0`
-
-(cd $PWD/framework; ./main.py $@)
diff --git a/framework/__init__.py b/framework/__init__.py
new file mode 100644
index 00000000..ae0043b7
--- /dev/null
+++ b/framework/__init__.py
@@ -0,0 +1,30 @@ 
+#!/usr/bin/python3
+# BSD LICENSE
+#
+# Copyright (c) 2021 PANTHEON.tech s.r.o.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of PANTHEON.tech s.r.o. nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/framework/checkCase.py b/framework/checkCase.py
index 3c1db994..10410f49 100644
--- a/framework/checkCase.py
+++ b/framework/checkCase.py
@@ -2,8 +2,8 @@  import xlrd
 import collections
 import json
 
-from settings import get_nic_name, load_global_setting, HOST_DRIVER_SETTING
-from utils import RED
+from .settings import get_nic_name, load_global_setting, HOST_DRIVER_SETTING
+from .utils import RED
 
 filter_json_file = './conf/test_case_checklist.json'
 support_json_file = './conf/test_case_supportlist.json'
diff --git a/framework/config.py b/framework/config.py
index 88ae8ea5..00b96cb6 100644
--- a/framework/config.py
+++ b/framework/config.py
@@ -36,10 +36,10 @@  import os
 import re
 import configparser  # config parse module
 import argparse      # parse arguments module
-from settings import (IXIA, PKTGEN, PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK,
+from .settings import (IXIA, PKTGEN, PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK,
                       CONFIG_ROOT_PATH, SUITE_SECTION_NAME)
-from settings import load_global_setting, DTS_CFG_FOLDER
-from exception import ConfigParseException, VirtConfigParseException, PortConfigParseException
+from .settings import load_global_setting, DTS_CFG_FOLDER
+from .exception import ConfigParseException, VirtConfigParseException, PortConfigParseException
 
 PORTCONF = "%s/ports.cfg" % CONFIG_ROOT_PATH
 CRBCONF = "%s/crbs.cfg" % CONFIG_ROOT_PATH
diff --git a/framework/crb.py b/framework/crb.py
index 3964e213..5d37bc08 100644
--- a/framework/crb.py
+++ b/framework/crb.py
@@ -32,10 +32,10 @@ 
 import time
 import re
 import os
-from settings import TIMEOUT, IXIA
-from ssh_connection import SSHConnection
-from logger import getLogger
-from config import PortConf, PORTCONF, PktgenConf
+from .settings import TIMEOUT, IXIA
+from .ssh_connection import SSHConnection
+from .logger import getLogger
+from .config import PortConf, PORTCONF, PktgenConf
 
 """
 CRB (customer reference board) basic functions and handlers
@@ -578,7 +578,7 @@  class Crb(object):
         """
         Get OS type from execution configuration file.
         """
-        from dut import Dut
+        from .dut import Dut
         if isinstance(self, Dut) and 'OS' in self.crb:
             return str(self.crb['OS']).lower()
 
@@ -588,7 +588,7 @@  class Crb(object):
         """
         Check real OS type whether match configured type.
         """
-        from dut import Dut
+        from .dut import Dut
         expected = 'Linux.*#'
         if isinstance(self, Dut) and self.get_os_type() == 'freebsd':
             expected = 'FreeBSD.*#'
diff --git a/framework/crbs.py b/framework/crbs.py
index 2ff937ac..40587fcb 100644
--- a/framework/crbs.py
+++ b/framework/crbs.py
@@ -1,7 +1,7 @@ 
 """
 Static configuration data for any CRBs that can be used.
 """
-from settings import IXIA
+from .settings import IXIA
 
 crbs_desc = {
     'CrownPassCRB1':
diff --git a/framework/debugger.py b/framework/debugger.py
index 0eaf7377..3c9989eb 100644
--- a/framework/debugger.py
+++ b/framework/debugger.py
@@ -28,10 +28,10 @@  import signal
 import code
 import time
 import imp
-from settings import load_global_setting, DEBUG_SETTING, DTS_PARALLEL_SETTING
-from utils import get_subclasses, copy_instance_attr, GREEN
+from .settings import load_global_setting, DEBUG_SETTING, DTS_PARALLEL_SETTING
+from .utils import get_subclasses, copy_instance_attr, GREEN
 
-from test_case import TestCase
+from .test_case import TestCase
 
 console = None      # global console object
 debug_cmd = ''      # global debug state
@@ -59,7 +59,7 @@  def list_command():
     List all connection sessions and can be reference of connect command.
     """
     index = 0
-    from ssh_connection import CONNECTIONS
+    from .ssh_connection import CONNECTIONS
     for connection in CONNECTIONS:
         for name, session in list(connection.items()):
             console.push('print \'connect %d: %10s\'' % (index, name))
@@ -70,7 +70,7 @@  def connect_command(connect):
     """
     Connect to ssh session and give control to user.
     """
-    from ssh_connection import CONNECTIONS
+    from .ssh_connection import CONNECTIONS
     if type(connect) == int:
         name, session = list(CONNECTIONS[connect].items())[0]
         print(GREEN("Connecting to session[%s]" % name))
diff --git a/framework/dts.py b/framework/dts.py
index 6f621a51..cedcff72 100644
--- a/framework/dts.py
+++ b/framework/dts.py
@@ -32,7 +32,7 @@ 
 import re           # regular expressions module
 import configparser  # config parse module
 import os           # operation system module
-import texttable    # text format
+import framework.texttable as texttable    # text format
 import traceback    # exception traceback
 import inspect      # load attribute
 import atexit       # register callback when exit
@@ -41,24 +41,24 @@  import signal       # signal module for debug mode
 import time         # time module for unique output folder
 import copy         # copy module for duplicate variable
 
-import rst          # rst file support
+import framework.rst as rst          # rst file support
 import sys          # system module
-import settings     # dts settings
-from tester import Tester
-from dut import Dut
-from serializer import Serializer
-from test_case import TestCase
-from test_result import Result
-from stats_reporter import StatsReporter
-from excel_reporter import ExcelReporter
-from json_reporter import JSONReporter
-from exception import TimeoutException, ConfigParseException, VerifyFailure
-from logger import getLogger
-import logger
-import debugger
-from config import CrbsConf
-from checkCase import CheckCase
-from utils import (get_subclasses, copy_instance_attr, create_parallel_locks,
+import framework.settings as settings     # dts settings
+from .tester import Tester
+from .dut import Dut
+from .serializer import Serializer
+from .test_case import TestCase
+from .test_result import Result
+from .stats_reporter import StatsReporter
+from .excel_reporter import ExcelReporter
+from .json_reporter import JSONReporter
+from .exception import TimeoutException, ConfigParseException, VerifyFailure
+from .logger import getLogger
+import framework.logger as logger
+import framework.debugger as debugger
+from .config import CrbsConf
+from .checkCase import CheckCase
+from .utils import (get_subclasses, copy_instance_attr, create_parallel_locks,
                    check_dts_python_version)
 import sys
 import imp
diff --git a/framework/dut.py b/framework/dut.py
index f5481d06..80d76a85 100644
--- a/framework/dut.py
+++ b/framework/dut.py
@@ -32,14 +32,14 @@ 
 import os
 import re
 import time
-import settings
-from config import PortConf,AppNameConf
-from settings import NICS, LOG_NAME_SEP
-from ssh_connection import SSHConnection
-from crb import Crb
-from net_device import GetNicObj
-from virt_resource import VirtResource
-from utils import RED, remove_old_rsa_key
+import framework.settings as settings
+from .config import PortConf,AppNameConf
+from .settings import NICS, LOG_NAME_SEP
+from .ssh_connection import SSHConnection
+from .crb import Crb
+from nics.net_device import GetNicObj
+from .virt_resource import VirtResource
+from .utils import RED, remove_old_rsa_key
 from uuid import uuid4
 
 
diff --git a/framework/etgen.py b/framework/etgen.py
index acfa2960..b4025055 100644
--- a/framework/etgen.py
+++ b/framework/etgen.py
@@ -32,12 +32,12 @@ 
 import re
 import string
 import time
-from config import IxiaConf
-from ssh_connection import SSHConnection
-from settings import SCAPY2IXIA
-from logger import getLogger
-from exception import VerifyFailure
-from utils import create_mask
+from .config import IxiaConf
+from .ssh_connection import SSHConnection
+from .settings import SCAPY2IXIA
+from .logger import getLogger
+from .exception import VerifyFailure
+from .utils import create_mask
 
 
 class SoftwarePacketGenerator():
diff --git a/framework/flow/flow.py b/framework/flow/flow.py
index 2cce0796..233a7e8c 100644
--- a/framework/flow/flow.py
+++ b/framework/flow/flow.py
@@ -40,11 +40,11 @@  from typing import List, FrozenSet, Union, Iterable, Tuple
 
 from scapy.layers.l2 import Ether
 
-from flow.enums import FlowItemType, FlowActionType
-from flow.exceptions import InvalidFlowItemException
-from flow.flow_action_items import ActionFlowItem
-from flow.flow_items import FlowItem
-from flow.flow_pattern_items import PatternFlowItem, TUNNELING_PROTOCOLS
+from .enums import FlowItemType, FlowActionType
+from .exceptions import InvalidFlowItemException
+from .flow_action_items import ActionFlowItem
+from .flow_items import FlowItem
+from .flow_pattern_items import PatternFlowItem, TUNNELING_PROTOCOLS
 
 # Get reserved mac addresses
 NEVER_MATCH_PACKET = Ether(src="", dst="") / ('\x00' * 64)
diff --git a/framework/flow/flow_action_items.py b/framework/flow/flow_action_items.py
index b08272f9..5416f9ab 100644
--- a/framework/flow/flow_action_items.py
+++ b/framework/flow/flow_action_items.py
@@ -32,8 +32,8 @@ 
 
 from typing import FrozenSet, Dict, Tuple
 
-from flow.enums import FlowActionType
-from flow.flow_pattern_items import FlowItem
+from .enums import FlowActionType
+from .flow_items import FlowItem
 
 ALWAYS_ALLOWED_ACTIONS = {FlowActionType.VOID}
 
diff --git a/framework/flow/flow_items.py b/framework/flow/flow_items.py
index d7be3456..33e6a906 100644
--- a/framework/flow/flow_items.py
+++ b/framework/flow/flow_items.py
@@ -37,10 +37,10 @@  import itertools
 from functools import reduce
 from typing import FrozenSet, Union, Any, Set, Dict, Tuple, Iterable, Hashable
 
-from flow.enums import FlowItemType, FlowActionType
-from flow.exceptions import InvalidFlowItemException
-from flow import flow_action_items
-from flow import flow_pattern_items
+from .enums import FlowItemType, FlowActionType
+from .exceptions import InvalidFlowItemException
+import framework.flow.flow_action_items as flow_action_items
+import framework.flow.flow_pattern_items as flow_pattern_items
 
 PATTERN_ACTION_ITEMS = {FlowItemType.INVERT, FlowItemType.VOID, FlowItemType.MARK, FlowItemType.META}
 
@@ -90,7 +90,7 @@  class FlowItem(object):
             raise InvalidFlowItemException(self, other)
         elif other.type in self.valid_next_items:
             # This import is in here so there is no circular import
-            from flow.flow import Flow
+            from .flow import Flow
             if isinstance(self, flow_pattern_items.PatternFlowItem):
                 return Flow(pattern_items=[self, other])
             elif isinstance(self, flow_action_items.ActionFlowItem):
diff --git a/framework/flow/flow_pattern_items.py b/framework/flow/flow_pattern_items.py
index bb143067..934efa7e 100644
--- a/framework/flow/flow_pattern_items.py
+++ b/framework/flow/flow_pattern_items.py
@@ -40,9 +40,9 @@  from scapy.layers.sctp import SCTP
 from scapy.layers.vxlan import VXLAN
 from scapy.packet import Packet
 
-from flow.enums import FlowItemType
-from flow.exceptions import InvalidFlowItemException
-from flow.flow_items import FlowItem
+from .enums import FlowItemType
+from .exceptions import InvalidFlowItemException
+from .flow_items import FlowItem
 
 ALWAYS_ALLOWED_ITEMS = {
     FlowItemType.RAW,
@@ -89,7 +89,7 @@  class PatternFlowItem(FlowItem):
         if other.type in self.valid_next_items or \
                 other.type == FlowItemType.END:
             # This import is in here so there is no circular import
-            from flow.flow import Flow
+            from flow import Flow
             return Flow(pattern_items=[self, other])
         else:
             raise InvalidFlowItemException(self, other)
diff --git a/framework/flow/flow_rule.py b/framework/flow/flow_rule.py
index 361afae3..e1a21a2f 100644
--- a/framework/flow/flow_rule.py
+++ b/framework/flow/flow_rule.py
@@ -32,9 +32,9 @@ 
 
 from typing import Union
 
-from flow.enums import *
-from flow.flow import Flow
-import flow.flow_action_items as flow_action_items
+from .enums import *
+from .flow import Flow
+import framework.flow.flow_action_items as flow_action_items
 
 
 class FlowPattern(Flow):
diff --git a/framework/flow/generator.py b/framework/flow/generator.py
index 0fe52b2b..4133b75c 100644
--- a/framework/flow/generator.py
+++ b/framework/flow/generator.py
@@ -40,11 +40,11 @@  from typing import List, Set, Generator, Iterable, FrozenSet, Tuple
 
 import numpy as np
 
-from flow.flow import Flow
-from flow.flow_pattern_items import PATTERN_ITEMS_TYPE_CLASS_MAPPING, PatternFlowItem, \
+from .flow import Flow
+from .flow_pattern_items import PATTERN_ITEMS_TYPE_CLASS_MAPPING, PatternFlowItem, \
     PATTERN_OPERATION_TYPES, TUNNELING_PROTOCOL_TYPES, ALWAYS_ALLOWED_ITEMS, FlowItemEnd, FlowItemVxlan, FlowItemIpv4, \
     FlowItemEth, FlowItemGre, L3_FLOW_TYPES, FlowItemVlan, FlowItemUdp
-from flow.flow_rule import FlowItemType
+from .flow_rule import FlowItemType
 
 
 def get_valid_next_protocols(current_protocol, protocol_stack, type_denylist):
diff --git a/framework/ixia_network/ixnet_stream.py b/framework/ixia_network/ixnet_stream.py
index 56cd53b6..52a447ed 100644
--- a/framework/ixia_network/ixnet_stream.py
+++ b/framework/ixia_network/ixnet_stream.py
@@ -31,7 +31,7 @@ 
 import os
 import json
 
-from utils import convert_int2ip, convert_ip2int
+from framework.utils import convert_int2ip, convert_ip2int
 
 
 class IxnetConfigStream(object):
diff --git a/framework/logger.py b/framework/logger.py
index 63e1d831..445f40a9 100644
--- a/framework/logger.py
+++ b/framework/logger.py
@@ -35,8 +35,8 @@  import sys
 import inspect
 import re
 
-from settings import LOG_NAME_SEP, FOLDERS, load_global_setting, DTS_PARALLEL_SETTING
-from utils import RED
+from .settings import LOG_NAME_SEP, FOLDERS, load_global_setting, DTS_PARALLEL_SETTING
+from .utils import RED
 
 """
 DTS logger module with several log level. DTS framework and TestSuite log
diff --git a/framework/multiple_vm.py b/framework/multiple_vm.py
index 68d2f5ec..75cf1ce6 100644
--- a/framework/multiple_vm.py
+++ b/framework/multiple_vm.py
@@ -3,9 +3,9 @@  import re
 import threadpool
 import traceback
 import threading
-from settings import DTS_ERR_TBL, save_global_setting, DTS_PARALLEL_SETTING
-from utils import RED
-from logger import getLogger
+from .settings import DTS_ERR_TBL, save_global_setting, DTS_PARALLEL_SETTING
+from .utils import RED
+from .logger import getLogger
 
 
 class MultipleVM(object):
@@ -74,7 +74,7 @@  class MultipleVM(object):
         self.logger.info("Parallel task start for DUT%d %s" % (dut_id, vm_name))
         threading.current_thread().name = vm_name
 
-        from qemu_kvm import QEMUKvm
+        from .qemu_kvm import QEMUKvm
         # VM configured by configuration file 
         if 'virt_config' in args:
             suite_name = args['virt_config']['suite_name']
diff --git a/framework/packet.py b/framework/packet.py
index 6d9bf246..700fd731 100644
--- a/framework/packet.py
+++ b/framework/packet.py
@@ -36,6 +36,7 @@  Base on scapy(python program for packet manipulation)
 from socket import AF_INET6
 from importlib import import_module
 from scapy.all import *
+from dep.scapy_modules.Dot1BR import Dot1BR
 # load extension layers
 exec_file = os.path.realpath(__file__)
 DTS_PATH = exec_file.replace('/framework/packet.py', '')
@@ -44,43 +45,30 @@  TMP_PATH = DTS_PATH[:-1] + '/output/tmp/pcap/' if exec_file.endswith('.pyc') els
 if not os.path.exists(TMP_PATH):
     os.system('mkdir -p %s' % TMP_PATH)
 
-DEP_FOLDER = DTS_PATH + '/dep'
-sys.path.append(DEP_FOLDER)
-sys.path.append(DEP_FOLDER + '/scapy_modules')
 
-from utils import convert_ip2int
-from utils import convert_int2ip
+from .utils import convert_ip2int
+from .utils import convert_int2ip
 
 scapy_modules_required = {'gtp': ['GTP_U_Header', 'GTPPDUSessionContainer'],
                           'lldp': ['LLDPDU', 'LLDPDUManagementAddress'],
-                          'Dot1BR': ['Dot1BR'],
                           'pfcp': ['PFCP'],
                           'nsh': ['NSH'],
                           'igmp': ['IGMP'],
                           'mpls': ['MPLS'],
                           }
-local_modules = [m[:-3] for m in os.listdir(DEP_FOLDER + '/scapy_modules') if (m.endswith('.py') and not m.startswith('__'))]
 
 for m in scapy_modules_required:
     try:
-        if m in local_modules:
-            module = import_module(m)
-            for clazz in scapy_modules_required[m]:
-                locals().update({clazz: getattr(module, clazz)})
-        else:
-            module = import_module(f'scapy.contrib.{m}')
-            for clazz in scapy_modules_required[m]:
-                locals().update({clazz: getattr(module, clazz)})
+        module = import_module(f'scapy.contrib.{m}')
+        for clazz in scapy_modules_required[m]:
+            locals().update({clazz: getattr(module, clazz)})
     except Exception as e:
         print(e)
 
 def get_scapy_module_impcmd():
     cmd_li = list()
     for m in scapy_modules_required:
-        if m in local_modules:
-            cmd_li.append(f'from {m} import {",".join(scapy_modules_required[m])}')
-        else:
-            cmd_li.append(f'from scapy.contrib.{m} import {",".join(scapy_modules_required[m])}')
+        cmd_li.append(f'from scapy.contrib.{m} import {",".join(scapy_modules_required[m])}')
     return ';'.join(cmd_li)
 
 SCAPY_IMP_CMD = get_scapy_module_impcmd()
diff --git a/framework/pktgen.py b/framework/pktgen.py
index a00bc090..f6bece56 100644
--- a/framework/pktgen.py
+++ b/framework/pktgen.py
@@ -39,15 +39,15 @@  from scapy.fields import ConditionalField
 from scapy.utils import rdpcap
 
 # dts libs
-from utils import (convert_int2ip, convert_ip2int,
+from .utils import (convert_int2ip, convert_ip2int,
                    convert_mac2long, convert_mac2str)
 
-from pktgen_base import (PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK, STAT_TYPE,
+from .pktgen_base import (PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK, STAT_TYPE,
                          TRANSMIT_CONT, TRANSMIT_M_BURST, TRANSMIT_S_BURST)
-from pktgen_base import DpdkPacketGenerator
-from pktgen_ixia import IxiaPacketGenerator
-from pktgen_ixia_network import IxNetworkPacketGenerator
-from pktgen_trex import TrexPacketGenerator
+from .pktgen_base import DpdkPacketGenerator
+from .pktgen_ixia import IxiaPacketGenerator
+from .pktgen_ixia_network import IxNetworkPacketGenerator
+from .pktgen_trex import TrexPacketGenerator
 
 
 class PacketGeneratorHelper(object):
diff --git a/framework/pktgen_base.py b/framework/pktgen_base.py
index f30785d0..88d053c1 100644
--- a/framework/pktgen_base.py
+++ b/framework/pktgen_base.py
@@ -33,13 +33,13 @@  import time
 import logging
 from abc import abstractmethod
 from copy import deepcopy
-from logger import getLogger
+from .logger import getLogger
 from pprint import pformat
 from enum import Enum, unique
 
-from config import PktgenConf
+from .config import PktgenConf
 # packet generator name
-from settings import PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK, PKTGEN
+from .settings import PKTGEN_DPDK, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK, PKTGEN
 
 # macro definition
 TRANSMIT_CONT = 'continuous'
diff --git a/framework/pktgen_ixia.py b/framework/pktgen_ixia.py
index 0273f3ad..fbb55943 100644
--- a/framework/pktgen_ixia.py
+++ b/framework/pktgen_ixia.py
@@ -34,12 +34,12 @@  import string
 import time
 from pprint import pformat
 
-from ssh_connection import SSHConnection
-from settings import SCAPY2IXIA
-from utils import (convert_int2ip, convert_ip2int,
+from .ssh_connection import SSHConnection
+from .settings import SCAPY2IXIA
+from .utils import (convert_int2ip, convert_ip2int,
                    convert_mac2long, convert_mac2str)
 
-from pktgen_base import (PacketGenerator, PKTGEN_IXIA,
+from .pktgen_base import (PacketGenerator, PKTGEN_IXIA,
                          TRANSMIT_CONT, TRANSMIT_M_BURST, TRANSMIT_S_BURST)
 
 from scapy.packet import Packet
diff --git a/framework/pktgen_ixia_network.py b/framework/pktgen_ixia_network.py
index 3cca2578..c9800e9f 100644
--- a/framework/pktgen_ixia_network.py
+++ b/framework/pktgen_ixia_network.py
@@ -33,7 +33,7 @@  import time
 import traceback
 from pprint import pformat
 
-from pktgen_base import PacketGenerator, PKTGEN_IXIA_NETWORK
+from .pktgen_base import PacketGenerator, PKTGEN_IXIA_NETWORK
 
 
 class IxNetworkPacketGenerator(PacketGenerator):
diff --git a/framework/pktgen_trex.py b/framework/pktgen_trex.py
index c0b13428..59f11754 100644
--- a/framework/pktgen_trex.py
+++ b/framework/pktgen_trex.py
@@ -35,7 +35,7 @@  import time
 import logging
 from pprint import pformat
 
-from pktgen_base import (PacketGenerator, PKTGEN_TREX, PKTGEN,
+from .pktgen_base import (PacketGenerator, PKTGEN_TREX, PKTGEN,
                          TRANSMIT_CONT, TRANSMIT_M_BURST, TRANSMIT_S_BURST)
 
 
diff --git a/framework/plotting.py b/framework/plotting.py
index 7d036fe4..ecae9607 100644
--- a/framework/plotting.py
+++ b/framework/plotting.py
@@ -31,12 +31,12 @@ 
 
 import os
 import shutil
-from plotgraph import Plot2DGraph
+from .plotgraph import Plot2DGraph
 from docutils.parsers.rst.directives import path
-from rst import path2Result
-import plotgraph
-import utils
-from exception import VerifyFailure
+from .rst import path2Result
+import framework.plotgraph as plotgraph
+import framework.utils as utils
+from .exception import VerifyFailure
 
 
 """
diff --git a/framework/pmd_output.py b/framework/pmd_output.py
index 838fa0bd..4161f4ad 100644
--- a/framework/pmd_output.py
+++ b/framework/pmd_output.py
@@ -32,8 +32,8 @@ 
 import os
 import re
 from time import sleep
-from settings import TIMEOUT, PROTOCOL_PACKET_SIZE, get_nic_driver
-from utils import create_mask
+from .settings import TIMEOUT, PROTOCOL_PACKET_SIZE, get_nic_driver
+from .utils import create_mask
 
 
 class PmdOutput():
diff --git a/framework/project_dpdk.py b/framework/project_dpdk.py
index d96f8d63..0d52dadd 100644
--- a/framework/project_dpdk.py
+++ b/framework/project_dpdk.py
@@ -32,16 +32,16 @@ 
 import os
 import re
 
-from settings import NICS, load_global_setting, save_global_setting, accepted_nic
-from settings import DPDK_RXMODE_SETTING, HOST_DRIVER_SETTING, HOST_DRIVER_MODE_SETTING, HOST_BUILD_TYPE_SETTING
-from settings import HOST_SHARED_LIB_SETTING, HOST_SHARED_LIB_PATH
-from ssh_connection import SSHConnection
-from crb import Crb
-from dut import Dut
-from tester import Tester
-from logger import getLogger
-from settings import IXIA, DRIVERS
-from utils import RED
+from .settings import NICS, load_global_setting, save_global_setting, accepted_nic
+from .settings import DPDK_RXMODE_SETTING, HOST_DRIVER_SETTING, HOST_DRIVER_MODE_SETTING, HOST_BUILD_TYPE_SETTING
+from .settings import HOST_SHARED_LIB_SETTING, HOST_SHARED_LIB_PATH
+from .ssh_connection import SSHConnection
+from .crb import Crb
+from .dut import Dut
+from .tester import Tester
+from .logger import getLogger
+from .settings import IXIA, DRIVERS
+from .utils import RED
 
 
 class DPDKdut(Dut):
diff --git a/framework/qemu_kvm.py b/framework/qemu_kvm.py
index 757737ec..e35d7499 100644
--- a/framework/qemu_kvm.py
+++ b/framework/qemu_kvm.py
@@ -34,11 +34,11 @@  import time
 import re
 import os
 
-from virt_base import VirtBase
-from virt_base import ST_NOTSTART, ST_PAUSE, ST_RUNNING, ST_UNKNOWN
-from exception import StartVMFailedException
-from settings import get_host_ip, load_global_setting, DTS_PARALLEL_SETTING
-from utils import parallel_lock, RED
+from .virt_base import VirtBase
+from .virt_base import ST_NOTSTART, ST_PAUSE, ST_RUNNING, ST_UNKNOWN
+from .exception import StartVMFailedException
+from .settings import get_host_ip, load_global_setting, DTS_PARALLEL_SETTING
+from .utils import parallel_lock, RED
 
 # This name is directly defined in the qemu guest service
 # So you can not change it except it is changed by the service
diff --git a/framework/qemu_libvirt.py b/framework/qemu_libvirt.py
index e0aeb6c6..3f014ce3 100644
--- a/framework/qemu_libvirt.py
+++ b/framework/qemu_libvirt.py
@@ -33,15 +33,15 @@  import time
 import re
 import os
 
-import utils
-from dut import Dut
-from ssh_connection import SSHConnection
-from virt_base import VirtBase
-from virt_resource import VirtResource
-from logger import getLogger
-from config import VirtConf
-from config import VIRTCONF
-from exception import StartVMFailedException
+import framework.utils as utils
+from .dut import Dut
+from .ssh_connection import SSHConnection
+from .virt_base import VirtBase
+from .virt_resource import VirtResource
+from .logger import getLogger
+from .config import VirtConf
+from .config import VIRTCONF
+from .exception import StartVMFailedException
 import xml.etree.ElementTree as ET
 from xml.etree.ElementTree import ElementTree
 from xml.dom import minidom
diff --git a/framework/rst.py b/framework/rst.py
index 2b8e6132..bd36a015 100644
--- a/framework/rst.py
+++ b/framework/rst.py
@@ -32,13 +32,13 @@ 
 import os
 import shutil
 import re
-from exception import VerifyFailure
+from .exception import VerifyFailure
 
 """
 Generate Rst Test Result Report
 
 Example:
-    import rst
+    import framework.rst as rst
     rst.write_title("Test Case: " + test_case.__name__)
     out = table.draw()
     rst.write_text('\n' + out + '\n\n')
diff --git a/framework/ssh_connection.py b/framework/ssh_connection.py
index c9886b2b..a3be06c2 100644
--- a/framework/ssh_connection.py
+++ b/framework/ssh_connection.py
@@ -30,7 +30,7 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 from ssh_pexpect import SSHPexpect
-from settings import USERNAME
+from .settings import USERNAME
 
 """
 Global structure for saving connections
diff --git a/framework/ssh_pexpect.py b/framework/ssh_pexpect.py
index fbc7dd4a..d81ae98b 100644
--- a/framework/ssh_pexpect.py
+++ b/framework/ssh_pexpect.py
@@ -1,9 +1,9 @@ 
 import time
 import pexpect
 from pexpect import pxssh
-from debugger import ignore_keyintr, aware_keyintr
-from exception import TimeoutException, SSHConnectionException, SSHSessionDeadException
-from utils import RED, GREEN, parallel_lock
+from .debugger import ignore_keyintr, aware_keyintr
+from .exception import TimeoutException, SSHConnectionException, SSHSessionDeadException
+from .utils import RED, GREEN, parallel_lock
 
 """
 Module handle ssh sessions between tester and DUT.
diff --git a/framework/test_case.py b/framework/test_case.py
index 98b716b9..650f9f05 100644
--- a/framework/test_case.py
+++ b/framework/test_case.py
@@ -33,21 +33,21 @@ 
 A base class for creating DTF test cases.
 """
 import re
-import debugger
+import framework.debugger as debugger
 import traceback
 import signal
 import time
 
-from exception import VerifyFailure, VerifySkip, TimeoutException
-from settings import DRIVERS, NICS, get_nic_name, load_global_setting
-from settings import PERF_SETTING, FUNC_SETTING, DEBUG_SETTING
-from settings import DEBUG_CASE_SETTING, HOST_DRIVER_SETTING
-from settings import UPDATE_EXPECTED, SUITE_SECTION_NAME
-from rst import RstReport
-from test_result import ResultTable, Result
-from logger import getLogger
-from config import SuiteConf
-from utils import BLUE, RED
+from .exception import VerifyFailure, VerifySkip, TimeoutException
+from .settings import DRIVERS, NICS, get_nic_name, load_global_setting
+from .settings import PERF_SETTING, FUNC_SETTING, DEBUG_SETTING
+from .settings import DEBUG_CASE_SETTING, HOST_DRIVER_SETTING
+from .settings import UPDATE_EXPECTED, SUITE_SECTION_NAME
+from .rst import RstReport
+from .test_result import ResultTable, Result
+from .logger import getLogger
+from .config import SuiteConf
+from .utils import BLUE, RED
 from functools import wraps
 
 class TestCase(object):
diff --git a/framework/test_result.py b/framework/test_result.py
index a718034d..a5b8e88a 100644
--- a/framework/test_result.py
+++ b/framework/test_result.py
@@ -32,7 +32,7 @@ 
 """
 Generic result container and reporters
 """
-import texttable    # text format
+import framework.texttable as texttable    # text format
 
 
 class Result(object):
diff --git a/framework/tester.py b/framework/tester.py
index ec233b8a..17c0f5cc 100644
--- a/framework/tester.py
+++ b/framework/tester.py
@@ -37,19 +37,19 @@  import re
 import subprocess
 import os
 from time import sleep
-from settings import NICS, load_global_setting, PERF_SETTING
-from settings import IXIA, USERNAME, PKTGEN, PKTGEN_GRP
-from crb import Crb
-from net_device import GetNicObj
-from etgen import IxiaPacketGenerator, SoftwarePacketGenerator
+from .settings import NICS, load_global_setting, PERF_SETTING
+from .settings import IXIA, USERNAME, PKTGEN, PKTGEN_GRP
+from .crb import Crb
+from nics.net_device import GetNicObj
+from .etgen import IxiaPacketGenerator, SoftwarePacketGenerator
 import random
-from utils import (GREEN, convert_int2ip, convert_ip2int,
+from .utils import (GREEN, convert_int2ip, convert_ip2int,
                    check_crb_python_version)
-from exception import ParameterInvalidException
+from .exception import ParameterInvalidException
 from multiprocessing import Process
-from pktgen import getPacketGenerator
-from config import PktgenConf
-from packet import SCAPY_IMP_CMD
+from .pktgen import getPacketGenerator
+from .config import PktgenConf
+from .packet import SCAPY_IMP_CMD
 
 class Tester(Crb):
 
diff --git a/framework/virt_base.py b/framework/virt_base.py
index f19cbc4b..b991fb3c 100644
--- a/framework/virt_base.py
+++ b/framework/virt_base.py
@@ -35,14 +35,14 @@  import threading
 from random import randint
 
 
-import utils
-import exception
-from dut import Dut
-from config import VirtConf
-from config import VIRTCONF
-from logger import getLogger
-from settings import CONFIG_ROOT_PATH
-from virt_dut import VirtDut
+import framework.utils as utils
+import framework.exception as exception
+from .dut import Dut
+from .config import VirtConf
+from .config import VIRTCONF
+from .logger import getLogger
+from .settings import CONFIG_ROOT_PATH
+from .virt_dut import VirtDut
 
 ST_NOTSTART = "NOTSTART"
 ST_PAUSE = "PAUSE"
diff --git a/framework/virt_common.py b/framework/virt_common.py
index 628cadf7..6708315a 100644
--- a/framework/virt_common.py
+++ b/framework/virt_common.py
@@ -30,11 +30,11 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 import os
 
-from config import VirtConf
-from settings import CONFIG_ROOT_PATH
+from .config import VirtConf
+from .settings import CONFIG_ROOT_PATH
 
-from qemu_kvm import QEMUKvm
-from qemu_libvirt import LibvirtKvm
+from .qemu_kvm import QEMUKvm
+from .qemu_libvirt import LibvirtKvm
 
 def VM(dut, vm_name, suite_name):
     conf = VirtConf(CONFIG_ROOT_PATH + os.sep + suite_name + '.cfg')
diff --git a/framework/virt_dut.py b/framework/virt_dut.py
index 9b0126b3..2aceab24 100644
--- a/framework/virt_dut.py
+++ b/framework/virt_dut.py
@@ -32,14 +32,14 @@ 
 import os
 import re
 import time
-import settings
-from utils import RED, parallel_lock
-from config import PortConf, AppNameConf
-from settings import NICS, LOG_NAME_SEP, get_netdev, load_global_setting, HOST_BUILD_TYPE_SETTING
-from project_dpdk import DPDKdut
-from dut import Dut
-from net_device import GetNicObj
-from net_device import RemoveNicObj
+import framework.settings as settings
+from .utils import RED, parallel_lock
+from .config import PortConf, AppNameConf
+from .settings import NICS, LOG_NAME_SEP, get_netdev, load_global_setting, HOST_BUILD_TYPE_SETTING
+from .project_dpdk import DPDKdut
+from .dut import Dut
+from nics.net_device import GetNicObj
+from nics.net_device import RemoveNicObj
 
 
 class VirtDut(DPDKdut):
diff --git a/framework/virt_resource.py b/framework/virt_resource.py
index 6ae2a28b..2bed1157 100644
--- a/framework/virt_resource.py
+++ b/framework/virt_resource.py
@@ -30,7 +30,7 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 from random import randint
 
-from utils import get_obj_funcs, parallel_lock, RED
+from .utils import get_obj_funcs, parallel_lock, RED
 
 INIT_FREE_PORT = 6000
 INIT_SERIAL_PORT = 7000
diff --git a/framework/virt_scene.py b/framework/virt_scene.py
index e67b3b6b..95350b1c 100644
--- a/framework/virt_scene.py
+++ b/framework/virt_scene.py
@@ -29,15 +29,15 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 import time
-import utils
-
-from settings import CONFIG_ROOT_PATH, get_netdev
-from config import VirtConf
-from config import VIRTCONF
-from exception import *
-from qemu_kvm import QEMUKvm
-from pmd_output import PmdOutput
-from utils import create_mask
+import framework.utils as utils
+
+from .settings import CONFIG_ROOT_PATH, get_netdev
+from .config import VirtConf
+from .config import VIRTCONF
+from .exception import *
+from .qemu_kvm import QEMUKvm
+from .pmd_output import PmdOutput
+from .utils import create_mask
 
 # scenario module for handling scenario
 # 1. load configurations
diff --git a/framework/main.py b/main.py
similarity index 96%
rename from framework/main.py
rename to main.py
index a081b85d..46f3d0ec 100755
--- a/framework/main.py
+++ b/main.py
@@ -38,16 +38,11 @@  import os
 import sys
 import argparse
 import subprocess
+from framework import dts
 
 # change operation directory
-os.chdir("../")
 cwd = os.getcwd()
-sys.path.append(cwd + '/nics')
-sys.path.append(cwd + '/framework')
-#sys.path.append(cwd + '/tests') # suites module path should be loaded in dts/run_all, not here
-sys.path.append(cwd + '/dep')
 
-import dts
 
 def git_build_package(gitLabel, pkgName):
     """
diff --git a/nics/__init__.py b/nics/__init__.py
new file mode 100644
index 00000000..ae0043b7
--- /dev/null
+++ b/nics/__init__.py
@@ -0,0 +1,30 @@ 
+#!/usr/bin/python3
+# BSD LICENSE
+#
+# Copyright (c) 2021 PANTHEON.tech s.r.o.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of PANTHEON.tech s.r.o. nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/nics/net_device.py b/nics/net_device.py
index 3ddfc4eb..38888e44 100644
--- a/nics/net_device.py
+++ b/nics/net_device.py
@@ -36,10 +36,10 @@  from functools import wraps
 import time
 
 
-import settings
-from crb import Crb
-from settings import TIMEOUT, HEADER_SIZE
-from utils import RED
+import framework.settings as settings
+from framework.crb import Crb
+from framework.settings import TIMEOUT, HEADER_SIZE
+from framework.utils import RED
 
 NICS_LIST = []      # global list for save nic objects
 
diff --git a/nics/perf_report.py b/nics/perf_report.py
index b80067ba..41161f46 100644
--- a/nics/perf_report.py
+++ b/nics/perf_report.py
@@ -41,8 +41,8 @@  from email.mime.multipart import MIMEMultipart
 from collections import OrderedDict
 #install GitPython
 from git import Repo
-from system_info import SystemInfo
-import utils
+from .system_info import SystemInfo
+import framework.utils as utils
 
 def get_dpdk_git_info(repo_dir="/root/dpdk"):
 
@@ -63,14 +63,14 @@  def get_dpdk_git_info(repo_dir="/root/dpdk"):
     return commit
 
 def generate_html_report(file_tpl, perf_data, git_info, nic_info, system_info):
-   
+
     if not os.path.exists(file_tpl):
         return None
 
     templateLoader = jinja2.FileSystemLoader(searchpath = "/")
     templateEnv = jinja2.Environment(loader=templateLoader)
     template = templateEnv.get_template(file_tpl)
- 
+
     templateVars = { "title" : "Daily Performance Test Report", \
                      "test_results" : perf_data, \
                      "system_infos" : system_info, \
@@ -106,6 +106,6 @@  def send_email(sender, mailto, message, smtp_server):
         print(utils.RED("Failed to send email " + str(e)))
 
 def send_html_report(sender, mailto, subject, html_msg, smtp_server):
-    
+
     message = html_message(sender, mailto, subject, html_msg)
     send_email(sender, mailto, message, smtp_server)
diff --git a/tests/TestSuite_ABI_stable.py b/tests/TestSuite_ABI_stable.py
index 522296ad..c24bb1c6 100644
--- a/tests/TestSuite_ABI_stable.py
+++ b/tests/TestSuite_ABI_stable.py
@@ -51,12 +51,12 @@  DPDK Test suite.
 Test support of ABI .
 
 """
-import utils
+import framework.utils as utils
 import time
 
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import load_global_setting, HOST_SHARED_LIB_SETTING, HOST_SHARED_LIB_PATH
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import load_global_setting, HOST_SHARED_LIB_SETTING, HOST_SHARED_LIB_PATH
 
 
 class TestABIStable(TestCase):
diff --git a/tests/TestSuite_acl.py b/tests/TestSuite_acl.py
index 963f3fb5..e713ed0d 100644
--- a/tests/TestSuite_acl.py
+++ b/tests/TestSuite_acl.py
@@ -30,7 +30,7 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-from test_case import TestCase
+from framework.test_case import TestCase
 
 
 class TestACL(TestCase):
diff --git a/tests/TestSuite_af_xdp_2.py b/tests/TestSuite_af_xdp_2.py
index 40a3d416..fffd991b 100644
--- a/tests/TestSuite_af_xdp_2.py
+++ b/tests/TestSuite_af_xdp_2.py
@@ -32,10 +32,10 @@ 
 import os
 import re
 import time
-from settings import HEADER_SIZE
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
+from framework.settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestAfXdp(TestCase):
diff --git a/tests/TestSuite_blocklist.py b/tests/TestSuite_blocklist.py
index 3692dfbb..c64c9c98 100644
--- a/tests/TestSuite_blocklist.py
+++ b/tests/TestSuite_blocklist.py
@@ -33,10 +33,10 @@ 
 DPDK Test suite.
 Test device blocklisting.
 """
-import utils
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import DRIVERS
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
 
 class TestBlockList(TestCase):
     def set_up_all(self):
diff --git a/tests/TestSuite_cbdma.py b/tests/TestSuite_cbdma.py
index 0cf598dc..ba553f05 100644
--- a/tests/TestSuite_cbdma.py
+++ b/tests/TestSuite_cbdma.py
@@ -33,13 +33,13 @@ 
 DPDK Test suite.
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
-from test_case import TestCase
-from packet import Packet
-from pktgen import TRANSMIT_CONT
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import TRANSMIT_CONT
+from framework.pmd_output import PmdOutput
 
 
 class TestCBDMA(TestCase):
diff --git a/tests/TestSuite_checksum_offload.py b/tests/TestSuite_checksum_offload.py
index eee09105..37eea232 100644
--- a/tests/TestSuite_checksum_offload.py
+++ b/tests/TestSuite_checksum_offload.py
@@ -45,10 +45,10 @@  from typing import List, Union, Tuple, Pattern
 
 import time
 
-from rst import RstReport
-import utils
-from exception import VerifyFailure
-from pktgen import PacketGeneratorHelper
+from framework.rst import RstReport
+import framework.utils as utils
+from framework.exception import VerifyFailure
+from framework.pktgen import PacketGeneratorHelper
 from scapy.layers.inet import UDP, TCP, IP
 from scapy.layers.inet6 import IPv6
 from scapy.layers.l2 import Ether, GRE
@@ -56,16 +56,16 @@  from scapy.layers.sctp import SCTP
 from scapy.layers.vxlan import VXLAN
 from scapy.packet import Raw
 from scapy.utils import wrpcap, rdpcap
-from test_capabilities import DRIVER_TEST_LACK_CAPA
-from test_case import TestCase
+from framework.test_capabilities import DRIVER_TEST_LACK_CAPA
+from framework.test_case import TestCase
 
-from pmd_output import PmdOutput
-from test_capabilities import DRIVER_TEST_LACK_CAPA
-from pktgen import PacketGeneratorHelper
-from exception import VerifyFailure
-import packet
+from framework.pmd_output import PmdOutput
+from framework.test_capabilities import DRIVER_TEST_LACK_CAPA
+from framework.pktgen import PacketGeneratorHelper
+from framework.exception import VerifyFailure
+import framework.packet as packet
 
-from settings import FOLDERS
+from framework.settings import FOLDERS
 
 l3_proto_classes = [
     IP,
diff --git a/tests/TestSuite_cloud_filter_with_l4_port.py b/tests/TestSuite_cloud_filter_with_l4_port.py
index 272b86cb..bff2fb7a 100644
--- a/tests/TestSuite_cloud_filter_with_l4_port.py
+++ b/tests/TestSuite_cloud_filter_with_l4_port.py
@@ -36,17 +36,17 @@  Test the support of generic flow API by Poll Mode Drivers.
 
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import DRIVERS
-from crb import Crb
-from dut import Dut
-import packet
-from exception import VerifyFailure
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
+from framework.crb import Crb
+from framework.dut import Dut
+import framework.packet as packet
+from framework.exception import VerifyFailure
 import scapy.layers.inet
 from scapy.utils import rdpcap
 
diff --git a/tests/TestSuite_cmdline.py b/tests/TestSuite_cmdline.py
index c189934f..e88be9df 100644
--- a/tests/TestSuite_cmdline.py
+++ b/tests/TestSuite_cmdline.py
@@ -34,9 +34,9 @@  DPDK Test suite.
 Test cmdline.
 """
 
-import utils
+import framework.utils as utils
 
-from test_case import TestCase
+from framework.test_case import TestCase
 
 
 class TestCmdline(TestCase):
diff --git a/tests/TestSuite_compressdev_isal_pmd.py b/tests/TestSuite_compressdev_isal_pmd.py
index 1c2b7775..4155a1cf 100644
--- a/tests/TestSuite_compressdev_isal_pmd.py
+++ b/tests/TestSuite_compressdev_isal_pmd.py
@@ -31,10 +31,10 @@ 
 
 
 import os
-from test_case import TestCase
+from framework.test_case import TestCase
 import json
 import copy
-import compress_common as cc
+import tests.compress_common as cc
 
 class TestCompressdevIsalPmd(TestCase):
 
diff --git a/tests/TestSuite_compressdev_qat_pmd.py b/tests/TestSuite_compressdev_qat_pmd.py
index 4ac45938..b8ad0724 100644
--- a/tests/TestSuite_compressdev_qat_pmd.py
+++ b/tests/TestSuite_compressdev_qat_pmd.py
@@ -31,10 +31,10 @@ 
 
 
 import os
-from test_case import TestCase
+from framework.test_case import TestCase
 import json
 import copy
-import compress_common as cc
+import tests.compress_common as cc
 
 
 class TestCompressdevQatPmd(TestCase):
diff --git a/tests/TestSuite_compressdev_zlib_pmd.py b/tests/TestSuite_compressdev_zlib_pmd.py
index 35a7502b..7e1d13c0 100644
--- a/tests/TestSuite_compressdev_zlib_pmd.py
+++ b/tests/TestSuite_compressdev_zlib_pmd.py
@@ -31,10 +31,10 @@ 
 
 
 import os
-from test_case import TestCase
+from framework.test_case import TestCase
 import json
 import copy
-import compress_common as cc
+import tests.compress_common as cc
 
 class TestCompressdevZlibPmd(TestCase):
 
diff --git a/tests/TestSuite_coremask.py b/tests/TestSuite_coremask.py
index 43c68e9d..286dd0ae 100644
--- a/tests/TestSuite_coremask.py
+++ b/tests/TestSuite_coremask.py
@@ -36,10 +36,10 @@  Test coremask parsing in DPDK.
 
 """
 
-import utils
+import framework.utils as utils
 
-from exception import VerifyFailure
-from test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.test_case import TestCase
 
 #
 #
diff --git a/tests/TestSuite_crypto_perf_cryptodev_perf.py b/tests/TestSuite_crypto_perf_cryptodev_perf.py
index d1f104e2..d8bfff97 100644
--- a/tests/TestSuite_crypto_perf_cryptodev_perf.py
+++ b/tests/TestSuite_crypto_perf_cryptodev_perf.py
@@ -31,8 +31,8 @@ 
 
 import re
 import json
-from test_case import TestCase
-import cryptodev_common as cc
+from framework.test_case import TestCase
+import tests.cryptodev_common as cc
 
 
 class PerfTestsCryptodev(TestCase):
diff --git a/tests/TestSuite_cvl_advanced_iavf_rss.py b/tests/TestSuite_cvl_advanced_iavf_rss.py
index a7003b38..bd0e8708 100644
--- a/tests/TestSuite_cvl_advanced_iavf_rss.py
+++ b/tests/TestSuite_cvl_advanced_iavf_rss.py
@@ -32,10 +32,10 @@ 
 
 import re
 import random
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-from rte_flow_common import RssProcessing
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from .rte_flow_common import RssProcessing
 
 vf0_mac = "00:11:22:33:44:55"
 
diff --git a/tests/TestSuite_cvl_advanced_iavf_rss_gtpogre.py b/tests/TestSuite_cvl_advanced_iavf_rss_gtpogre.py
index 5d5d7eea..0a61e119 100755
--- a/tests/TestSuite_cvl_advanced_iavf_rss_gtpogre.py
+++ b/tests/TestSuite_cvl_advanced_iavf_rss_gtpogre.py
@@ -33,10 +33,10 @@ 
 import re
 import random
 import time
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-from rte_flow_common import RssProcessing
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from .rte_flow_common import RssProcessing
 
 mac_ipv4_gtpu_ipv4_basic = {
     'gtpogre-ipv4-nonfrag': 'Ether(dst="00:11:22:33:44:55")/IP(proto=0x2F)/GRE(proto=0x0800)/IP()/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x123456)/IP(dst="192.168.0.1",src="192.168.0.2")/("X"*480)',
diff --git a/tests/TestSuite_cvl_advanced_iavf_rss_gtpu.py b/tests/TestSuite_cvl_advanced_iavf_rss_gtpu.py
index d19ddbf0..c329e62f 100644
--- a/tests/TestSuite_cvl_advanced_iavf_rss_gtpu.py
+++ b/tests/TestSuite_cvl_advanced_iavf_rss_gtpu.py
@@ -33,10 +33,10 @@ 
 import re
 import random
 import time
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from rte_flow_common import RssProcessing
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from .rte_flow_common import RssProcessing
 
 mac_ipv4_gtpu_ipv4_basic = {
     'ipv4-nonfrag': 'Ether(dst="00:11:22:33:44:55")/IP()/UDP(dport=2152)/GTP_U_Header(gtp_type=255, teid=0x123456)/IP(dst="192.168.0.1", src="192.168.0.2")/("X"*480)',
diff --git a/tests/TestSuite_cvl_advanced_iavf_rss_vlan_esp_ah_l2tp_pfcp.py b/tests/TestSuite_cvl_advanced_iavf_rss_vlan_esp_ah_l2tp_pfcp.py
index f7236eec..068731d9 100644
--- a/tests/TestSuite_cvl_advanced_iavf_rss_vlan_esp_ah_l2tp_pfcp.py
+++ b/tests/TestSuite_cvl_advanced_iavf_rss_vlan_esp_ah_l2tp_pfcp.py
@@ -32,11 +32,11 @@  import re
 import random
 import string
 import time
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from pmd_output import PmdOutput
-from packet import Packet
-from rte_flow_common import RssProcessing
-from config import UserConf
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from .rte_flow_common import RssProcessing
+from framework.config import UserConf
 
 vf0_mac = '00:11:22:33:44:55'
 
diff --git a/tests/TestSuite_cvl_advanced_rss.py b/tests/TestSuite_cvl_advanced_rss.py
index da756ac1..09e5c7be 100644
--- a/tests/TestSuite_cvl_advanced_rss.py
+++ b/tests/TestSuite_cvl_advanced_rss.py
@@ -32,10 +32,10 @@ 
 
 import re
 import random
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-from rte_flow_common import RssProcessing
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from .rte_flow_common import RssProcessing
 
 # toeplitz related data start
 mac_ipv4_toeplitz_basic_pkt = {
diff --git a/tests/TestSuite_cvl_advanced_rss_gtpogre.py b/tests/TestSuite_cvl_advanced_rss_gtpogre.py
index 4a889ead..4f5eb359 100755
--- a/tests/TestSuite_cvl_advanced_rss_gtpogre.py
+++ b/tests/TestSuite_cvl_advanced_rss_gtpogre.py
@@ -32,10 +32,10 @@ 
 
 import re
 import time
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-from rte_flow_common import RssProcessing
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from .rte_flow_common import RssProcessing
 
 
 mac_ipv4_gtpu_ipv4_basic = {
diff --git a/tests/TestSuite_cvl_advanced_rss_gtpu.py b/tests/TestSuite_cvl_advanced_rss_gtpu.py
index f1f4fe43..dc0f6130 100755
--- a/tests/TestSuite_cvl_advanced_rss_gtpu.py
+++ b/tests/TestSuite_cvl_advanced_rss_gtpu.py
@@ -32,10 +32,10 @@ 
 
 import re
 import time
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from rte_flow_common import RssProcessing
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from .rte_flow_common import RssProcessing
 
 
 mac_ipv4_gtpu_ipv4_basic = {
diff --git a/tests/TestSuite_cvl_advanced_rss_pppoe.py b/tests/TestSuite_cvl_advanced_rss_pppoe.py
index 2d3e226e..bcff298e 100644
--- a/tests/TestSuite_cvl_advanced_rss_pppoe.py
+++ b/tests/TestSuite_cvl_advanced_rss_pppoe.py
@@ -32,10 +32,10 @@ 
 import re
 import random
 import string
-from test_case import TestCase, skip_unsupported_pkg
-from pmd_output import PmdOutput
-from packet import Packet
-from rte_flow_common import RssProcessing
+from framework.test_case import TestCase, skip_unsupported_pkg
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from .rte_flow_common import RssProcessing
 
 mac_pppoe_pay_packets = {
     'mismatch': [
diff --git a/tests/TestSuite_cvl_advanced_rss_vlan_esp_ah_l2tp_pfcp.py b/tests/TestSuite_cvl_advanced_rss_vlan_esp_ah_l2tp_pfcp.py
index df071e91..115a97e0 100644
--- a/tests/TestSuite_cvl_advanced_rss_vlan_esp_ah_l2tp_pfcp.py
+++ b/tests/TestSuite_cvl_advanced_rss_vlan_esp_ah_l2tp_pfcp.py
@@ -31,11 +31,11 @@ 
 import re
 import random
 import string
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from pmd_output import PmdOutput
-from packet import Packet
-from rte_flow_common import RssProcessing
-from config import UserConf
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from .rte_flow_common import RssProcessing
+from framework.config import UserConf
 
 mac_ipv4_pfcp_session_packets = {
     'match': [
diff --git a/tests/TestSuite_cvl_dcf_acl_filter.py b/tests/TestSuite_cvl_dcf_acl_filter.py
index 1d516fcf..1a2d4c42 100644
--- a/tests/TestSuite_cvl_dcf_acl_filter.py
+++ b/tests/TestSuite_cvl_dcf_acl_filter.py
@@ -34,11 +34,11 @@  import time
 import re
 import copy
 
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
-from utils import BLUE, RED, GREEN
-import rte_flow_common as rfc
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.utils import BLUE, RED, GREEN
+import tests.rte_flow_common as rfc
 
 import os
 
diff --git a/tests/TestSuite_cvl_dcf_date_path.py b/tests/TestSuite_cvl_dcf_date_path.py
index 04ac5de6..71b42a8f 100644
--- a/tests/TestSuite_cvl_dcf_date_path.py
+++ b/tests/TestSuite_cvl_dcf_date_path.py
@@ -32,9 +32,9 @@ 
 
 import re
 import time
-from pmd_output import PmdOutput
-from test_case import TestCase
-from packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.packet import Packet
 
 
 class DcfDatePathTest(TestCase):
diff --git a/tests/TestSuite_cvl_dcf_flow_priority.py b/tests/TestSuite_cvl_dcf_flow_priority.py
index 07d99d2c..cc95dcb1 100644
--- a/tests/TestSuite_cvl_dcf_flow_priority.py
+++ b/tests/TestSuite_cvl_dcf_flow_priority.py
@@ -34,11 +34,11 @@  import time
 import re
 import copy
 
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from pmd_output import PmdOutput
-from packet import Packet
-from utils import BLUE, RED, GREEN
-import rte_flow_common as rfc
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.utils import BLUE, RED, GREEN
+import tests.rte_flow_common as rfc
 
 import os
 
diff --git a/tests/TestSuite_cvl_dcf_switch_filter.py b/tests/TestSuite_cvl_dcf_switch_filter.py
index dd7e0109..a13b47b1 100644
--- a/tests/TestSuite_cvl_dcf_switch_filter.py
+++ b/tests/TestSuite_cvl_dcf_switch_filter.py
@@ -34,11 +34,11 @@  import time
 import re
 import copy
 
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from pmd_output import PmdOutput
-from packet import Packet
-from utils import BLUE, RED, GREEN
-import rte_flow_common as rfc
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.utils import BLUE, RED, GREEN
+import tests.rte_flow_common as rfc
 
 import os
 
diff --git a/tests/TestSuite_cvl_dcf_switch_filter_gtpu.py b/tests/TestSuite_cvl_dcf_switch_filter_gtpu.py
index 052e97b7..d357c239 100644
--- a/tests/TestSuite_cvl_dcf_switch_filter_gtpu.py
+++ b/tests/TestSuite_cvl_dcf_switch_filter_gtpu.py
@@ -34,11 +34,11 @@  import time
 import re
 import copy
 
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from pmd_output import PmdOutput
-from packet import Packet
-from utils import BLUE, RED, GREEN
-import rte_flow_common as rfc
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.utils import BLUE, RED, GREEN
+import tests.rte_flow_common as rfc
 
 import os
 
diff --git a/tests/TestSuite_cvl_dcf_switch_filter_pppoe.py b/tests/TestSuite_cvl_dcf_switch_filter_pppoe.py
index c51d14b1..32235be4 100644
--- a/tests/TestSuite_cvl_dcf_switch_filter_pppoe.py
+++ b/tests/TestSuite_cvl_dcf_switch_filter_pppoe.py
@@ -34,11 +34,11 @@  import time
 import re
 import copy
 
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from pmd_output import PmdOutput
-from packet import Packet
-from utils import BLUE, RED, GREEN
-import rte_flow_common as rfc
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.utils import BLUE, RED, GREEN
+import tests.rte_flow_common as rfc
 
 import os
 
diff --git a/tests/TestSuite_cvl_ecpri.py b/tests/TestSuite_cvl_ecpri.py
index 357e7fa9..3fec3c00 100644
--- a/tests/TestSuite_cvl_ecpri.py
+++ b/tests/TestSuite_cvl_ecpri.py
@@ -1,10 +1,10 @@ 
 import re
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-import rte_flow_common as rfc
-import utils
-from utils import GREEN, RED
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+import tests.rte_flow_common as rfc
+import framework.utils as utils
+from framework.utils import GREEN, RED
 import time
 
 Mac_list = ['00:11:22:33:44:55', '00:11:22:33:44:11', '00:11:22:33:44:22', '00:11:22:33:44:33']
diff --git a/tests/TestSuite_cvl_fdir.py b/tests/TestSuite_cvl_fdir.py
index 0c3a1917..e1c033c8 100644
--- a/tests/TestSuite_cvl_fdir.py
+++ b/tests/TestSuite_cvl_fdir.py
@@ -35,13 +35,13 @@  import time
 import copy
 import os
 
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase, skip_unsupported_pkg
-import rte_flow_common as rfc
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase, skip_unsupported_pkg
+import tests.rte_flow_common as rfc
 
-from utils import GREEN, RED
-import utils
+from framework.utils import GREEN, RED
+import framework.utils as utils
 
 MAC_IPV4_PAY = {
     "match": [
diff --git a/tests/TestSuite_cvl_iavf_ip_fragment_rte_flow.py b/tests/TestSuite_cvl_iavf_ip_fragment_rte_flow.py
index b0e41a1b..575f0b0d 100644
--- a/tests/TestSuite_cvl_iavf_ip_fragment_rte_flow.py
+++ b/tests/TestSuite_cvl_iavf_ip_fragment_rte_flow.py
@@ -30,14 +30,14 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 import re
-from utils import GREEN, RED
+from framework.utils import GREEN, RED
 import time
 from scapy.all import *
-import rte_flow_common as rfc
+import tests.rte_flow_common as rfc
 
 LAUNCH_QUEUE = 16
 
diff --git a/tests/TestSuite_cvl_iavf_rss_configure.py b/tests/TestSuite_cvl_iavf_rss_configure.py
index 86b2819e..e94809a3 100755
--- a/tests/TestSuite_cvl_iavf_rss_configure.py
+++ b/tests/TestSuite_cvl_iavf_rss_configure.py
@@ -32,12 +32,12 @@ 
 import json
 import time
 import re
-import packet
+import framework.packet as packet
 import os
 from scapy.contrib.gtp import *
-from test_case import TestCase
-from pmd_output import PmdOutput
-from rte_flow_common import RssProcessing
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from .rte_flow_common import RssProcessing
 
 tv_packets_basic = {
     'tv_mac_ipv4': 'Ether(dst="00:11:22:33:44:55")/IP(src="192.168.0.2",dst="192.168.0.3")/("X"*40)',
diff --git a/tests/TestSuite_cvl_ip_fragment_rte_flow.py b/tests/TestSuite_cvl_ip_fragment_rte_flow.py
index acf8e78e..b396ee72 100644
--- a/tests/TestSuite_cvl_ip_fragment_rte_flow.py
+++ b/tests/TestSuite_cvl_ip_fragment_rte_flow.py
@@ -30,13 +30,13 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-from utils import GREEN, RED
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.utils import GREEN, RED
 import time
 from scapy.all import *
-import rte_flow_common as rfc
+import tests.rte_flow_common as rfc
 
 LAUNCH_QUEUE = 16
 
diff --git a/tests/TestSuite_cvl_limit_value_test.py b/tests/TestSuite_cvl_limit_value_test.py
index f8224258..4e97bd36 100644
--- a/tests/TestSuite_cvl_limit_value_test.py
+++ b/tests/TestSuite_cvl_limit_value_test.py
@@ -34,12 +34,12 @@  import re
 import time
 import os
 import copy
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-import rte_flow_common as rfc
-from rte_flow_common import CVL_TXQ_RXQ_NUMBER
-import utils
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+import tests.rte_flow_common as rfc
+from .rte_flow_common import CVL_TXQ_RXQ_NUMBER
+import framework.utils as utils
 
 # max rule number case: rte_flow_pattern and matched packets will be generated by code, and rte_flow_pattern will be writed to file.
 tv_max_rule_number = {
diff --git a/tests/TestSuite_cvl_qinq.py b/tests/TestSuite_cvl_qinq.py
index 0c950b03..d066d42b 100644
--- a/tests/TestSuite_cvl_qinq.py
+++ b/tests/TestSuite_cvl_qinq.py
@@ -33,11 +33,11 @@ 
 import re
 import time
 import random
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase, check_supported_nic, skip_unsupported_pkg
-from utils import GREEN, RED
-from rte_flow_common import RssProcessing
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase, check_supported_nic, skip_unsupported_pkg
+from framework.utils import GREEN, RED
+from .rte_flow_common import RssProcessing
 
 mac_qinq_ipv4_pay_src_ip = {
     'name': 'mac_qinq_ipv4_pay_src_ip',
diff --git a/tests/TestSuite_cvl_rss_configure.py b/tests/TestSuite_cvl_rss_configure.py
index 904c3ca3..40d3e533 100644
--- a/tests/TestSuite_cvl_rss_configure.py
+++ b/tests/TestSuite_cvl_rss_configure.py
@@ -32,15 +32,15 @@ 
 import json
 import time
 import re
-import packet
+import framework.packet as packet
 import os
 from scapy.contrib.gtp import *
-from test_case import TestCase
-from pmd_output import PmdOutput
-from utils import BLUE, RED
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.utils import BLUE, RED
 from collections import OrderedDict
-from packet import IncreaseIP, IncreaseIPv6
-import rte_flow_common as rfc
+from framework.packet import IncreaseIP, IncreaseIPv6
+import tests.rte_flow_common as rfc
 
 out = os.popen("pip list|grep scapy ")
 version_result =out.read()
diff --git a/tests/TestSuite_cvl_switch_filter.py b/tests/TestSuite_cvl_switch_filter.py
index 5ec8b184..e25d0127 100644
--- a/tests/TestSuite_cvl_switch_filter.py
+++ b/tests/TestSuite_cvl_switch_filter.py
@@ -37,12 +37,12 @@  import copy
 import random
 from itertools import groupby
 
-from test_case import TestCase, skip_unsupported_pkg
-from pmd_output import PmdOutput
-from packet import Packet
-from utils import BLUE, RED, GREEN
+from framework.test_case import TestCase, skip_unsupported_pkg
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.utils import BLUE, RED, GREEN
 from collections import OrderedDict
-import rte_flow_common as rfc
+import tests.rte_flow_common as rfc
 
 import os
 
diff --git a/tests/TestSuite_cvl_switch_filter_pppoe.py b/tests/TestSuite_cvl_switch_filter_pppoe.py
index c2949546..e1e98e4e 100644
--- a/tests/TestSuite_cvl_switch_filter_pppoe.py
+++ b/tests/TestSuite_cvl_switch_filter_pppoe.py
@@ -37,12 +37,12 @@  import copy
 import random
 from itertools import groupby
 
-from test_case import TestCase, skip_unsupported_pkg
-from pmd_output import PmdOutput
-from packet import Packet
-from utils import BLUE, RED, GREEN
+from framework.test_case import TestCase, skip_unsupported_pkg
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.utils import BLUE, RED, GREEN
 from collections import OrderedDict
-import rte_flow_common as rfc
+import tests.rte_flow_common as rfc
 
 import os
 
diff --git a/tests/TestSuite_cvl_vf_support_multicast_address.py b/tests/TestSuite_cvl_vf_support_multicast_address.py
index dd241a82..11c5897f 100644
--- a/tests/TestSuite_cvl_vf_support_multicast_address.py
+++ b/tests/TestSuite_cvl_vf_support_multicast_address.py
@@ -30,9 +30,9 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import re
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 
 vf0_mac = "00:11:22:33:44:55"
 vf1_mac = "00:11:22:33:44:66"
diff --git a/tests/TestSuite_dcf_lifecycle.py b/tests/TestSuite_dcf_lifecycle.py
index b8645a61..1d24e6a8 100644
--- a/tests/TestSuite_dcf_lifecycle.py
+++ b/tests/TestSuite_dcf_lifecycle.py
@@ -52,12 +52,12 @@  from pprint import pformat
 from functools import partial
 
 
-from settings import HEADER_SIZE
-from test_case import TestCase
-from exception import VerifyFailure
-from packet import Packet
-from pmd_output import PmdOutput
-import utils
+from framework.settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+import framework.utils as utils
 
 
 class TestDcfLifeCycle(TestCase):
diff --git a/tests/TestSuite_ddp_gtp.py b/tests/TestSuite_ddp_gtp.py
index c992e049..28848207 100644
--- a/tests/TestSuite_ddp_gtp.py
+++ b/tests/TestSuite_ddp_gtp.py
@@ -32,11 +32,11 @@ 
 import time
 import re
 import sys
-import utils
-from qemu_kvm import QEMUKvm
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import get_nic_name
+import framework.utils as utils
+from framework.qemu_kvm import QEMUKvm
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import get_nic_name
 import random
 
 VM_CORES_MASK = 'all'
diff --git a/tests/TestSuite_ddp_gtp_qregion.py b/tests/TestSuite_ddp_gtp_qregion.py
index e7e40cfc..c46fade9 100644
--- a/tests/TestSuite_ddp_gtp_qregion.py
+++ b/tests/TestSuite_ddp_gtp_qregion.py
@@ -32,12 +32,12 @@ 
 import time
 import re
 import sys
-import utils
+import framework.utils as utils
 from scapy.all import *
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import get_nic_name
-import packet
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import get_nic_name
+import framework.packet as packet
 
 
 class TestDdpGtpQregion(TestCase):
diff --git a/tests/TestSuite_ddp_l2tpv3.py b/tests/TestSuite_ddp_l2tpv3.py
index 22ae0be7..477f9adc 100644
--- a/tests/TestSuite_ddp_l2tpv3.py
+++ b/tests/TestSuite_ddp_l2tpv3.py
@@ -35,8 +35,8 @@  l2tpv3 test script.
 """
 import time
 import re
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 from scapy.all import *
 import random
 
diff --git a/tests/TestSuite_ddp_mpls.py b/tests/TestSuite_ddp_mpls.py
index 7c677c3c..9a93a745 100644
--- a/tests/TestSuite_ddp_mpls.py
+++ b/tests/TestSuite_ddp_mpls.py
@@ -31,13 +31,13 @@ 
 
 import time
 import sys
-import utils 
+import framework.utils as utils 
 from scapy.utils import rdpcap
 
-from qemu_kvm import QEMUKvm
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import get_nic_name
+from framework.qemu_kvm import QEMUKvm
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import get_nic_name
 import random
 
 VM_CORES_MASK = 'all'
diff --git a/tests/TestSuite_ddp_ppp_l2tp.py b/tests/TestSuite_ddp_ppp_l2tp.py
index 57b8c352..53de7e10 100644
--- a/tests/TestSuite_ddp_ppp_l2tp.py
+++ b/tests/TestSuite_ddp_ppp_l2tp.py
@@ -32,10 +32,10 @@ 
 import time
 import re
 import sys
-import utils
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import get_nic_name
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import get_nic_name
 from scapy.all import *
 import random
 
diff --git a/tests/TestSuite_distributor.py b/tests/TestSuite_distributor.py
index cd88977d..f8a1ef6f 100644
--- a/tests/TestSuite_distributor.py
+++ b/tests/TestSuite_distributor.py
@@ -33,10 +33,10 @@ 
 DPDK Test suite.
 """
 import re
-import utils
+import framework.utils as utils
 import os
-from test_case import TestCase
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestDistributor(TestCase):
diff --git a/tests/TestSuite_dpdk_gro_lib.py b/tests/TestSuite_dpdk_gro_lib.py
index f5668ad4..72dc20b3 100644
--- a/tests/TestSuite_dpdk_gro_lib.py
+++ b/tests/TestSuite_dpdk_gro_lib.py
@@ -38,10 +38,10 @@  hostcpu to start qemu and only have one vcpu
 """
 import re
 import time
-import utils
-from test_case import TestCase
-from virt_common import VM
-import vhost_peer_conf as peer
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.virt_common import VM
+import tests.vhost_peer_conf as peer
 
 
 class TestDPDKGROLib(TestCase):
diff --git a/tests/TestSuite_dpdk_gso_lib.py b/tests/TestSuite_dpdk_gso_lib.py
index 8cb13a8f..a806f4d3 100644
--- a/tests/TestSuite_dpdk_gso_lib.py
+++ b/tests/TestSuite_dpdk_gso_lib.py
@@ -37,12 +37,12 @@  In this suite, in order to check the performance of gso lib, will use one
 hostcpu to start qemu and only have one vcpu
 """
 import time
-import utils
+import framework.utils as utils
 import re
-from test_case import TestCase
-from virt_common import VM
-from config import UserConf
-import vhost_peer_conf as peer
+from framework.test_case import TestCase
+from framework.virt_common import VM
+from framework.config import UserConf
+import tests.vhost_peer_conf as peer
 
 
 class TestDPDKGsoLib(TestCase):
diff --git a/tests/TestSuite_dpdk_hugetlbfs_mount_size.py b/tests/TestSuite_dpdk_hugetlbfs_mount_size.py
index 48fdc8ef..c06b7f02 100644
--- a/tests/TestSuite_dpdk_hugetlbfs_mount_size.py
+++ b/tests/TestSuite_dpdk_hugetlbfs_mount_size.py
@@ -34,9 +34,9 @@  This feature is to limit DPDK to use the exact size which is the mounted hugepag
 """
 
 import re
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
+from framework.test_case import TestCase
 
 DEFAULT_MNT = '/mnt/huge'
 MNT_PATH = ["/mnt/huge1", "/mnt/huge2", "/mnt/huge3"]
diff --git a/tests/TestSuite_dual_vlan.py b/tests/TestSuite_dual_vlan.py
index 933ffb90..e2d2c06d 100644
--- a/tests/TestSuite_dual_vlan.py
+++ b/tests/TestSuite_dual_vlan.py
@@ -37,7 +37,7 @@  Test the support of Dual VLAN Offload Features by Poll Mode Drivers.
 
 """
 
-import utils
+import framework.utils as utils
 import random
 import re
 import time
@@ -71,8 +71,8 @@  vlanCase = ["OUTER+INNER", "INNER", ("OUTER+INNER", "NONE"), ("INNER", "NONE"),
             "TX+OUTER+INNER", "TX+OUTER", ("NONE", "TX+OUTER+INNER"), ("NONE", "TX+OUTER")]
 
 
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestDualVlan(TestCase):
diff --git a/tests/TestSuite_dynamic_config.py b/tests/TestSuite_dynamic_config.py
index 92f15d36..20d57470 100644
--- a/tests/TestSuite_dynamic_config.py
+++ b/tests/TestSuite_dynamic_config.py
@@ -36,11 +36,11 @@  Test the dynamic driver configuration feature.
 
 """
 
-import utils
+import framework.utils as utils
 import time
 
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 #
diff --git a/tests/TestSuite_dynamic_flowtype.py b/tests/TestSuite_dynamic_flowtype.py
index d60a5822..816dc3f2 100644
--- a/tests/TestSuite_dynamic_flowtype.py
+++ b/tests/TestSuite_dynamic_flowtype.py
@@ -31,10 +31,10 @@ 
 
 import time
 import re
-import utils
-from test_case import TestCase
-from pmd_output import PmdOutput
-import packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+import framework.packet as packet
 
 VM_CORES_MASK = 'all'
 
diff --git a/tests/TestSuite_dynamic_queue.py b/tests/TestSuite_dynamic_queue.py
index 9314ff73..4abb0411 100644
--- a/tests/TestSuite_dynamic_queue.py
+++ b/tests/TestSuite_dynamic_queue.py
@@ -31,11 +31,11 @@ 
 
 import time
 import re
-import utils
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import get_nic_name
-from packet import Packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import get_nic_name
+from framework.packet import Packet
 import random
 
 test_loop = 3
diff --git a/tests/TestSuite_eeprom_dump.py b/tests/TestSuite_eeprom_dump.py
index 8c2bf4c4..b6afdf15 100644
--- a/tests/TestSuite_eeprom_dump.py
+++ b/tests/TestSuite_eeprom_dump.py
@@ -33,10 +33,10 @@ 
 """
 DPDK Test suite.
 """
-import utils
+import framework.utils as utils
 import re
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
 
 class TestEEPROMDump(TestCase):
diff --git a/tests/TestSuite_efd.py b/tests/TestSuite_efd.py
index 787733ca..7779cfe8 100644
--- a/tests/TestSuite_efd.py
+++ b/tests/TestSuite_efd.py
@@ -33,10 +33,10 @@ 
 DPDK Test suite.
 """
 import re
-import utils
+import framework.utils as utils
 import os
-from test_case import TestCase
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestEFD(TestCase):
diff --git a/tests/TestSuite_enable_package_download_in_ice_driver.py b/tests/TestSuite_enable_package_download_in_ice_driver.py
index 8bf21d18..f3ef897c 100644
--- a/tests/TestSuite_enable_package_download_in_ice_driver.py
+++ b/tests/TestSuite_enable_package_download_in_ice_driver.py
@@ -32,8 +32,8 @@ 
 import time
 import re
 import os
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 class TestEnable_Package_Download_In_Ice_Driver(TestCase):
 
diff --git a/tests/TestSuite_etag.py b/tests/TestSuite_etag.py
index f165c91d..0b5a5674 100644
--- a/tests/TestSuite_etag.py
+++ b/tests/TestSuite_etag.py
@@ -38,15 +38,15 @@  import re
 import time
 import sys
 
-import utils
-from qemu_kvm import QEMUKvm
-from test_case import TestCase
-from pmd_output import PmdOutput
-from exception import VerifyFailure
+import framework.utils as utils
+from framework.qemu_kvm import QEMUKvm
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.exception import VerifyFailure
 
 from scapy.utils import rdpcap
 
-from packet import Packet
+from framework.packet import Packet
 
 VM_CORES_MASK = 'all'
 
diff --git a/tests/TestSuite_ethtool_stats.py b/tests/TestSuite_ethtool_stats.py
index c0032c86..942c0c50 100644
--- a/tests/TestSuite_ethtool_stats.py
+++ b/tests/TestSuite_ethtool_stats.py
@@ -39,14 +39,14 @@  import time
 import os
 import traceback
 
-from utils import create_mask as dts_create_mask
-from test_case import TestCase
-from pmd_output import PmdOutput
-from exception import VerifyFailure
+from framework.utils import create_mask as dts_create_mask
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.exception import VerifyFailure
 
-from packet import Packet
+from framework.packet import Packet
 from scapy.sendrecv import sendp
-from settings import HEADER_SIZE
+from framework.settings import HEADER_SIZE
 from functools import reduce
 
 
diff --git a/tests/TestSuite_eventdev_perf.py b/tests/TestSuite_eventdev_perf.py
index fd142e89..dabf75d6 100644
--- a/tests/TestSuite_eventdev_perf.py
+++ b/tests/TestSuite_eventdev_perf.py
@@ -34,20 +34,20 @@  DPDK Test suite.
 Test userland 10Gb/25Gb/40Gb/100Gb
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
 import os
 
-from test_case import TestCase
+from framework.test_case import TestCase
 from time import sleep
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
-from etgen import IxiaPacketGenerator
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
+from framework.etgen import IxiaPacketGenerator
 
-from settings import FOLDERS
-from system_info import SystemInfo
-import perf_report
+from framework.settings import FOLDERS
+from nics.system_info import SystemInfo
+import nics.perf_report as perf_report
 from datetime import datetime
 
 class TestEventdevPerf(TestCase,IxiaPacketGenerator):
diff --git a/tests/TestSuite_eventdev_pipeline.py b/tests/TestSuite_eventdev_pipeline.py
index 33091b6a..04e16c63 100644
--- a/tests/TestSuite_eventdev_pipeline.py
+++ b/tests/TestSuite_eventdev_pipeline.py
@@ -34,13 +34,13 @@  DPDK Test suite.
 Test eventdev pipeline
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
-from test_case import TestCase
+from framework.test_case import TestCase
 import scapy.layers.inet
 from scapy.utils import rdpcap
-from packet import Packet
+from framework.packet import Packet
 
 
 class TestEventdevPipeline(TestCase):
diff --git a/tests/TestSuite_eventdev_pipeline_perf.py b/tests/TestSuite_eventdev_pipeline_perf.py
index 361b47ee..1e89a250 100644
--- a/tests/TestSuite_eventdev_pipeline_perf.py
+++ b/tests/TestSuite_eventdev_pipeline_perf.py
@@ -34,20 +34,20 @@  DPDK Test suite.
 Test userland 10Gb/25Gb/40Gb/100Gb
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
 import os
 
-from test_case import TestCase
+from framework.test_case import TestCase
 from time import sleep
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
-from etgen import IxiaPacketGenerator
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
+from framework.etgen import IxiaPacketGenerator
 
-from settings import FOLDERS
-from system_info import SystemInfo
-import perf_report
+from framework.settings import FOLDERS
+from nics.system_info import SystemInfo
+import nics.perf_report as perf_report
 from datetime import datetime
 
 class TestEventdevPipelinePerf(TestCase,IxiaPacketGenerator):
diff --git a/tests/TestSuite_example_build.py b/tests/TestSuite_example_build.py
index 00db2f78..936fb258 100644
--- a/tests/TestSuite_example_build.py
+++ b/tests/TestSuite_example_build.py
@@ -37,7 +37,7 @@  Test example_build.
 
 import time
 import re
-from test_case import TestCase
+from framework.test_case import TestCase
 
 class TestExamplebuild(TestCase):
 
diff --git a/tests/TestSuite_external_memory.py b/tests/TestSuite_external_memory.py
index e31b2787..2f7344fe 100644
--- a/tests/TestSuite_external_memory.py
+++ b/tests/TestSuite_external_memory.py
@@ -37,8 +37,8 @@  Test external memory.
 
 import time
 import re
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 
 class TestExternalMemory(TestCase):
diff --git a/tests/TestSuite_external_mempool_handler.py b/tests/TestSuite_external_mempool_handler.py
index a16d4324..6f200666 100644
--- a/tests/TestSuite_external_mempool_handler.py
+++ b/tests/TestSuite_external_mempool_handler.py
@@ -34,9 +34,9 @@  DPDK Test suite.
 Test external mempool handler
 """
 
-import utils
-from test_case import TestCase
-from pmd_output import PmdOutput
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestExternalMempool(TestCase):
diff --git a/tests/TestSuite_fdir.py b/tests/TestSuite_fdir.py
index 007db26d..6763d401 100644
--- a/tests/TestSuite_fdir.py
+++ b/tests/TestSuite_fdir.py
@@ -41,11 +41,11 @@  import string
 from time import sleep
 from scapy.utils import struct, socket, PcapWriter
 
-import utils
-from etgen import IxiaPacketGenerator
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
+import framework.utils as utils
+from framework.etgen import IxiaPacketGenerator
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
 
 import sys
 import imp
diff --git a/tests/TestSuite_fips_cryptodev.py b/tests/TestSuite_fips_cryptodev.py
index 8c75d54c..b9f5e4a3 100644
--- a/tests/TestSuite_fips_cryptodev.py
+++ b/tests/TestSuite_fips_cryptodev.py
@@ -30,9 +30,9 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-import utils
-from test_case import TestCase
-import cryptodev_common as cc
+import framework.utils as utils
+from framework.test_case import TestCase
+import tests.cryptodev_common as cc
 import re
 
 class FipCryptodev(TestCase):
diff --git a/tests/TestSuite_firmware_version.py b/tests/TestSuite_firmware_version.py
index 85f08337..5ad03339 100644
--- a/tests/TestSuite_firmware_version.py
+++ b/tests/TestSuite_firmware_version.py
@@ -33,8 +33,8 @@ 
 """
 DPDK Test suite.
 """
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 import re
 
 
diff --git a/tests/TestSuite_flexible_rxd.py b/tests/TestSuite_flexible_rxd.py
index 45eb6036..16e179bb 100644
--- a/tests/TestSuite_flexible_rxd.py
+++ b/tests/TestSuite_flexible_rxd.py
@@ -32,9 +32,9 @@ 
 
 
 import time
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from flexible_common import FlexibleRxdBase
-import rte_flow_common as rfc
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from .flexible_common import FlexibleRxdBase
+import tests.rte_flow_common as rfc
 
 class TestFlexibleRxd(TestCase, FlexibleRxdBase):
     supported_nic = ['columbiaville_100g', 'columbiaville_25g', 'columbiaville_25gx2', 'foxville']
diff --git a/tests/TestSuite_floating_veb.py b/tests/TestSuite_floating_veb.py
index 8bfc4c49..c4214037 100644
--- a/tests/TestSuite_floating_veb.py
+++ b/tests/TestSuite_floating_veb.py
@@ -38,14 +38,14 @@  Test Floating VEB Features by Poll Mode Drivers.
 import re
 import time
 
-from virt_dut import VirtDut
-from project_dpdk import DPDKdut
-from dut import Dut
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE
-from packet import Packet
-from utils import RED
+from framework.virt_dut import VirtDut
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.utils import RED
 
 
 class TestFloatingVEBSwitching(TestCase):
diff --git a/tests/TestSuite_flow_classify.py b/tests/TestSuite_flow_classify.py
index 67d78734..14e2f862 100644
--- a/tests/TestSuite_flow_classify.py
+++ b/tests/TestSuite_flow_classify.py
@@ -35,13 +35,13 @@  import re
 from collections import Counter
 from datetime import datetime
 
-from packet import Packet
+from framework.packet import Packet
 from scapy.sendrecv import sendp
 
-from utils import create_mask as dts_create_mask
-from test_case import TestCase
-from exception import VerifyFailure
-from settings import HEADER_SIZE
+from framework.utils import create_mask as dts_create_mask
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.settings import HEADER_SIZE
 from functools import reduce
 
 
diff --git a/tests/TestSuite_flow_classify_softnic.py b/tests/TestSuite_flow_classify_softnic.py
index e5937289..eb6bf33d 100644
--- a/tests/TestSuite_flow_classify_softnic.py
+++ b/tests/TestSuite_flow_classify_softnic.py
@@ -29,24 +29,24 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import utils
+import framework.utils as utils
 import re
 import time
 
-from settings import HEADER_SIZE
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import DRIVERS
-from crb import Crb
+from framework.settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
+from framework.crb import Crb
 
-from virt_dut import VirtDut
-from project_dpdk import DPDKdut
-from dut import Dut
-from packet import Packet
+from framework.virt_dut import VirtDut
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+from framework.packet import Packet
 
 import os
 import random
-from exception import VerifyFailure
+from framework.exception import VerifyFailure
 import scapy.layers.inet
 from scapy.utils import rdpcap
 
diff --git a/tests/TestSuite_flow_filtering.py b/tests/TestSuite_flow_filtering.py
index 7d089bc3..a46846fd 100644
--- a/tests/TestSuite_flow_filtering.py
+++ b/tests/TestSuite_flow_filtering.py
@@ -30,13 +30,13 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import os
-import utils
+import framework.utils as utils
 import time
 import re
 import os
-import packet
-from test_case import TestCase
-from settings import HEADER_SIZE
+import framework.packet as packet
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
 
 
 class TestFlowFiltering(TestCase):
diff --git a/tests/TestSuite_fortville_rss_granularity_config.py b/tests/TestSuite_fortville_rss_granularity_config.py
index 3ebd5139..64a1922d 100644
--- a/tests/TestSuite_fortville_rss_granularity_config.py
+++ b/tests/TestSuite_fortville_rss_granularity_config.py
@@ -50,9 +50,9 @@  Support 4*10G, 1*40G and 2*40G NICs.
 import time
 import random
 import re
-import utils
-import dut
-from pmd_output import PmdOutput
+import framework.utils as utils
+import framework.dut as dut
+from framework.pmd_output import PmdOutput
 
 testQueues = [16]
 reta_entries = []
@@ -60,7 +60,7 @@  reta_lines = []
 
 # Use scapy to send packets with different source and dest ip.
 # and collect the hash result of five tuple and the queue id.
-from test_case import TestCase
+from framework.test_case import TestCase
 #
 #
 # Test class.
diff --git a/tests/TestSuite_fortville_rss_input.py b/tests/TestSuite_fortville_rss_input.py
index f542b667..3b20f227 100644
--- a/tests/TestSuite_fortville_rss_input.py
+++ b/tests/TestSuite_fortville_rss_input.py
@@ -50,9 +50,9 @@  Support 4*10G, 1*40G and 2*40G NICs.
 import time
 import random
 import re
-import utils
-import dut
-from pmd_output import PmdOutput
+import framework.utils as utils
+import framework.dut as dut
+from framework.pmd_output import PmdOutput
 
 testQueues = [16]
 reta_entries = []
@@ -60,7 +60,7 @@  reta_lines = []
 
 # Use scapy to send packets with different source and dest ip.
 # and collect the hash result of five tuple and the queue id.
-from test_case import TestCase
+from framework.test_case import TestCase
 #
 #
 # Test class.
diff --git a/tests/TestSuite_generic_filter.py b/tests/TestSuite_generic_filter.py
index 22f85bd0..d126b8b0 100644
--- a/tests/TestSuite_generic_filter.py
+++ b/tests/TestSuite_generic_filter.py
@@ -36,14 +36,14 @@  Test the support of VLAN Offload Features by Poll Mode Drivers.
 
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
-from settings import DRIVERS
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
 
 
 class TestGeneric_filter(TestCase):
diff --git a/tests/TestSuite_generic_flow_api.py b/tests/TestSuite_generic_flow_api.py
index e8171589..82bae0ff 100644
--- a/tests/TestSuite_generic_flow_api.py
+++ b/tests/TestSuite_generic_flow_api.py
@@ -36,24 +36,24 @@  Test the support of generic flow API by Poll Mode Drivers.
 
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
-from settings import DRIVERS
-from crb import Crb
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
+from framework.crb import Crb
 
-from virt_dut import VirtDut
-from project_dpdk import DPDKdut
-from dut import Dut
-import packet
+from framework.virt_dut import VirtDut
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+import framework.packet as packet
 
 import os
 import random
-from exception import VerifyFailure
+from framework.exception import VerifyFailure
 import scapy.layers.inet
 from scapy.utils import rdpcap
 
diff --git a/tests/TestSuite_hello_world.py b/tests/TestSuite_hello_world.py
index 8e2ffd90..0bcafe0e 100644
--- a/tests/TestSuite_hello_world.py
+++ b/tests/TestSuite_hello_world.py
@@ -34,8 +34,8 @@  DPDK Test suite.
 Test HelloWorld example.
 """
 
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 class TestHelloWorld(TestCase):
 
diff --git a/tests/TestSuite_hotplug.py b/tests/TestSuite_hotplug.py
index bb31a9d5..fcbd07df 100644
--- a/tests/TestSuite_hotplug.py
+++ b/tests/TestSuite_hotplug.py
@@ -37,9 +37,9 @@  Test port hot plug.
 
 import time
 import re
-import utils
-from test_case import TestCase
-from packet import Packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
 import os
 
 
diff --git a/tests/TestSuite_hotplug_mp.py b/tests/TestSuite_hotplug_mp.py
index 9b846a0e..bc4951e1 100644
--- a/tests/TestSuite_hotplug_mp.py
+++ b/tests/TestSuite_hotplug_mp.py
@@ -34,9 +34,9 @@  DPDK Test suite.
 Hotplug Multi-process Test.
 """
 
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
+from framework.test_case import TestCase
 import itertools
 
 test_loop = 2
diff --git a/tests/TestSuite_iavf.py b/tests/TestSuite_iavf.py
index 9656b4fc..e0bb1c4c 100644
--- a/tests/TestSuite_iavf.py
+++ b/tests/TestSuite_iavf.py
@@ -40,13 +40,13 @@  import re
 import time
 import math
 
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
-from settings import get_nic_name
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.settings import get_nic_name
 import random
-from settings import HEADER_SIZE
+from framework.settings import HEADER_SIZE
 
 VM_CORES_MASK = 'Default'
 
diff --git a/tests/TestSuite_iavf_fdir.py b/tests/TestSuite_iavf_fdir.py
index d79829ea..90a6cf8f 100644
--- a/tests/TestSuite_iavf_fdir.py
+++ b/tests/TestSuite_iavf_fdir.py
@@ -33,16 +33,16 @@ 
 import re
 import time
 
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase, skip_unsupported_pkg
-import rte_flow_common as rfc
-from rte_flow_common import CVL_TXQ_RXQ_NUMBER
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase, skip_unsupported_pkg
+import tests.rte_flow_common as rfc
+from .rte_flow_common import CVL_TXQ_RXQ_NUMBER
 from multiprocessing import Process
 from multiprocessing import Manager
 
-from utils import GREEN, RED
-import utils
+from framework.utils import GREEN, RED
+import framework.utils as utils
 
 MAC_IPV4_PAY = {
     "match": [
diff --git a/tests/TestSuite_iavf_flexible_descriptor.py b/tests/TestSuite_iavf_flexible_descriptor.py
index e5cd9b3d..667a9641 100644
--- a/tests/TestSuite_iavf_flexible_descriptor.py
+++ b/tests/TestSuite_iavf_flexible_descriptor.py
@@ -35,8 +35,8 @@  import time
 import traceback
 
 
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-from flexible_common import FlexibleRxdBase
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+from .flexible_common import FlexibleRxdBase
 
 
 class TestIavfFlexibleDescriptor(TestCase, FlexibleRxdBase):
diff --git a/tests/TestSuite_iavf_package_driver_error_handle.py b/tests/TestSuite_iavf_package_driver_error_handle.py
index d155afc9..962d1336 100644
--- a/tests/TestSuite_iavf_package_driver_error_handle.py
+++ b/tests/TestSuite_iavf_package_driver_error_handle.py
@@ -32,9 +32,9 @@ 
 import time
 import re
 import os
-from test_case import TestCase
-from pmd_output import PmdOutput
-from config import UserConf
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.config import UserConf
 
 class Testiavf_package_and_driver_check(TestCase):
 
diff --git a/tests/TestSuite_ieee1588.py b/tests/TestSuite_ieee1588.py
index f737c796..7fcff6ca 100644
--- a/tests/TestSuite_ieee1588.py
+++ b/tests/TestSuite_ieee1588.py
@@ -34,12 +34,12 @@  DPDK Test suite.
 Test support of IEEE1588 Precise Time Protocol.
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 
 DEV_TX_OFFLOAD_MULTI_SEGS = '0x00008000'
 
diff --git a/tests/TestSuite_inline_ipsec.py b/tests/TestSuite_inline_ipsec.py
index 2b9db77e..3826dda2 100644
--- a/tests/TestSuite_inline_ipsec.py
+++ b/tests/TestSuite_inline_ipsec.py
@@ -35,13 +35,13 @@  DPDK Test suite.
 Test inline_ipsec.
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 import random
 
 from scapy.all import ESP, IP, Ether, sendp, SecurityAssociation
-from test_case import TestCase
+from framework.test_case import TestCase
 
 ETHER_STANDARD_MTU = 1300
 ETHER_JUMBO_FRAME_MTU = 9000
diff --git a/tests/TestSuite_interrupt_pmd.py b/tests/TestSuite_interrupt_pmd.py
index e5e3751d..947a9615 100644
--- a/tests/TestSuite_interrupt_pmd.py
+++ b/tests/TestSuite_interrupt_pmd.py
@@ -37,8 +37,8 @@  Test interrupt pmd.
 
 import string
 import time
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 
 class TestInterruptPmd(TestCase):
diff --git a/tests/TestSuite_ip_pipeline.py b/tests/TestSuite_ip_pipeline.py
index 0d5a114b..dcfdb62c 100644
--- a/tests/TestSuite_ip_pipeline.py
+++ b/tests/TestSuite_ip_pipeline.py
@@ -29,24 +29,24 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import utils
+import framework.utils as utils
 import re
 import time
 
-from settings import HEADER_SIZE
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import DRIVERS
-from crb import Crb
+from framework.settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
+from framework.crb import Crb
 
-from virt_dut import VirtDut
-from project_dpdk import DPDKdut
-from dut import Dut
-from packet import Packet
+from framework.virt_dut import VirtDut
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+from framework.packet import Packet
 
 import os
 import random
-from exception import VerifyFailure
+from framework.exception import VerifyFailure
 import scapy.layers.inet
 from scapy.utils import rdpcap
 
diff --git a/tests/TestSuite_ipfrag.py b/tests/TestSuite_ipfrag.py
index e9972659..a5b343e4 100644
--- a/tests/TestSuite_ipfrag.py
+++ b/tests/TestSuite_ipfrag.py
@@ -34,15 +34,15 @@  DPDK Test suite.
 Test IPv4 fragmentation features in DPDK.
 """
 
-import utils
+import framework.utils as utils
 import string
 import re
 import time
 import os
-from settings import HEADER_SIZE
-from packet import Packet
-from pktgen import PacketGeneratorHelper
-from test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
 
 
 lpm_table_ipv4 = [
diff --git a/tests/TestSuite_ipgre.py b/tests/TestSuite_ipgre.py
index 5e7750c5..dfd70ac7 100644
--- a/tests/TestSuite_ipgre.py
+++ b/tests/TestSuite_ipgre.py
@@ -39,12 +39,12 @@  inside virtual point-to-point links over an Internet Protocol network.
 Fortville support GRE packet detecting, checksum computing and filtering.
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
 import os
 
-from packet import Packet
+from framework.packet import Packet
 
 from scapy.utils import wrpcap, rdpcap
 from scapy.packet import split_layers,bind_layers
@@ -52,9 +52,9 @@  from scapy.layers.inet import Ether, IP, TCP, UDP
 from scapy.layers.sctp import SCTP
 from scapy.layers.l2 import GRE
 
-from test_case import TestCase
-from exception import VerifyFailure
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.pmd_output import PmdOutput
 
 class TestIpgre(TestCase):
 
diff --git a/tests/TestSuite_ipsec_gw_cryptodev_func.py b/tests/TestSuite_ipsec_gw_cryptodev_func.py
index 33b67d45..bf08402e 100644
--- a/tests/TestSuite_ipsec_gw_cryptodev_func.py
+++ b/tests/TestSuite_ipsec_gw_cryptodev_func.py
@@ -31,11 +31,11 @@ 
 
 import binascii
 import time
-import utils
-from test_case import TestCase
-import packet
+import framework.utils as utils
+from framework.test_case import TestCase
+import framework.packet as packet
 
-import cryptodev_common as cc
+import tests.cryptodev_common as cc
 
 class TestIPsecGW(TestCase):
 
diff --git a/tests/TestSuite_ipv4_reassembly.py b/tests/TestSuite_ipv4_reassembly.py
index 0342fb0a..3f5b9a30 100644
--- a/tests/TestSuite_ipv4_reassembly.py
+++ b/tests/TestSuite_ipv4_reassembly.py
@@ -42,8 +42,8 @@  from scapy.utils import struct, socket, PcapWriter
 from scapy.layers.inet import Ether, IP, TCP, fragment
 from scapy.route import *
 
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 
 class IpReassemblyTestConfig(object):
diff --git a/tests/TestSuite_ixgbe_vf_get_extra_queue_information.py b/tests/TestSuite_ixgbe_vf_get_extra_queue_information.py
index 57db70f4..ca3b0fe8 100644
--- a/tests/TestSuite_ixgbe_vf_get_extra_queue_information.py
+++ b/tests/TestSuite_ixgbe_vf_get_extra_queue_information.py
@@ -36,14 +36,14 @@  Test Niantic ixgbe_get_vf_queue Include Extra Information function.
 import time
 import random
 import re
-import utils
+import framework.utils as utils
 
 # Use scapy to send packets with different source and dest ip.
 # and collect the hash result of five tuple and the queue id.
-from test_case import TestCase
-from pmd_output import PmdOutput
-from virt_common import VM
-from qemu_kvm import QEMUKvm
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.virt_common import VM
+from framework.qemu_kvm import QEMUKvm
 
 class TestIxgbeVfGetExtraInfo(TestCase):
 
diff --git a/tests/TestSuite_jumboframes.py b/tests/TestSuite_jumboframes.py
index e277bace..e2c2a362 100644
--- a/tests/TestSuite_jumboframes.py
+++ b/tests/TestSuite_jumboframes.py
@@ -34,12 +34,12 @@  DPDK Test suite.
 Test the support of Jumbo Frames by Poll Mode Drivers
 """
 
-import utils
+import framework.utils as utils
 import re
 from time import sleep
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import PROTOCOL_PACKET_SIZE
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import PROTOCOL_PACKET_SIZE
 
 ETHER_HEADER_LEN = 18
 IP_HEADER_LEN = 20
diff --git a/tests/TestSuite_keep_alive.py b/tests/TestSuite_keep_alive.py
index 4d350d79..093988fd 100644
--- a/tests/TestSuite_keep_alive.py
+++ b/tests/TestSuite_keep_alive.py
@@ -37,8 +37,8 @@  Test keep alive
 
 import time
 import re
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 class TestKeepAlive(TestCase):
 
diff --git a/tests/TestSuite_kernelpf_iavf.py b/tests/TestSuite_kernelpf_iavf.py
index 5db1ec00..b40197cb 100644
--- a/tests/TestSuite_kernelpf_iavf.py
+++ b/tests/TestSuite_kernelpf_iavf.py
@@ -40,13 +40,13 @@  Test some vf function in ice driver
 import re
 import time
 import random
-import utils
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE
-from packet import Packet
-from utils import RED
+import framework.utils as utils
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.utils import RED
 
 VM_CORES_MASK = 'all'
 MAX_VLAN = 4095
diff --git a/tests/TestSuite_kni.py b/tests/TestSuite_kni.py
index ba946140..689dca76 100644
--- a/tests/TestSuite_kni.py
+++ b/tests/TestSuite_kni.py
@@ -36,14 +36,14 @@  DPDK Test suite.
 Test Kernel NIC Interface.
 """
 
-import utils
+import framework.utils as utils
 import re
 import os
 import time
 from random import randint
-from pktgen import PacketGeneratorHelper
-from test_case import TestCase
-import packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+import framework.packet as packet
 
 dut_ports = []
 port_virtual_interaces = []
diff --git a/tests/TestSuite_l2fwd.py b/tests/TestSuite_l2fwd.py
index 091ac093..03dce364 100644
--- a/tests/TestSuite_l2fwd.py
+++ b/tests/TestSuite_l2fwd.py
@@ -34,10 +34,10 @@  Test Layer-2 Forwarding support
 """
 import os
 import time
-import utils
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestL2fwd(TestCase):
diff --git a/tests/TestSuite_l2fwd_cryptodev_func.py b/tests/TestSuite_l2fwd_cryptodev_func.py
index de0c0447..c9671c3c 100644
--- a/tests/TestSuite_l2fwd_cryptodev_func.py
+++ b/tests/TestSuite_l2fwd_cryptodev_func.py
@@ -33,9 +33,9 @@  import hmac
 import hashlib
 import binascii
 import time
-import utils
-from test_case import TestCase
-from packet import Packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
 
 from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
 from cryptography.hazmat.primitives.ciphers.aead import AESCCM, AESGCM
@@ -47,7 +47,7 @@  from cryptography.hazmat.backends import default_backend
 import CryptoMobile.CM as cm
 import pyDes
 
-import cryptodev_common as cc
+import tests.cryptodev_common as cc
 
 class TestL2fwdCrypto(TestCase):
 
diff --git a/tests/TestSuite_l2fwd_jobstats.py b/tests/TestSuite_l2fwd_jobstats.py
index 6c104168..bd60dc16 100644
--- a/tests/TestSuite_l2fwd_jobstats.py
+++ b/tests/TestSuite_l2fwd_jobstats.py
@@ -37,8 +37,8 @@  Test L2fwd Jobstats
 
 import time
 import re
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 
 class TestL2fwdJobstats(TestCase):
diff --git a/tests/TestSuite_l2tp_esp_coverage.py b/tests/TestSuite_l2tp_esp_coverage.py
index 10520c8b..5f8dda80 100644
--- a/tests/TestSuite_l2tp_esp_coverage.py
+++ b/tests/TestSuite_l2tp_esp_coverage.py
@@ -31,10 +31,10 @@ 
 
 import re
 import time
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase, skip_unsupported_pkg, check_supported_nic
-import rte_flow_common as rfc
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase, skip_unsupported_pkg, check_supported_nic
+import tests.rte_flow_common as rfc
 
 vf0_mac = "00:11:22:33:44:55"
 
diff --git a/tests/TestSuite_l3fwd.py b/tests/TestSuite_l3fwd.py
index 4efcca09..6739ac87 100644
--- a/tests/TestSuite_l3fwd.py
+++ b/tests/TestSuite_l3fwd.py
@@ -33,8 +33,8 @@ 
 DPDK Test suite.
 Layer-3 forwarding test script.
 """
-from test_case import TestCase
-from perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
 
 
 class TestL3fwd(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_l3fwd_em.py b/tests/TestSuite_l3fwd_em.py
index 4879b503..e148083d 100644
--- a/tests/TestSuite_l3fwd_em.py
+++ b/tests/TestSuite_l3fwd_em.py
@@ -33,8 +33,8 @@ 
 DPDK Test suite.
 Layer-3 forwarding test script.
 """
-from test_case import TestCase
-from perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
 
 
 class TestL3fwdEm(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_l3fwd_lpm_ipv4.py b/tests/TestSuite_l3fwd_lpm_ipv4.py
index 3b881e0a..7ce887cb 100644
--- a/tests/TestSuite_l3fwd_lpm_ipv4.py
+++ b/tests/TestSuite_l3fwd_lpm_ipv4.py
@@ -33,8 +33,8 @@ 
 DPDK Test suite.
 Layer-3 forwarding test script.
 """
-from test_case import TestCase
-from perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
 
 
 class TestL3fwdLpmIpv4(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_l3fwd_lpm_ipv4_rfc2544.py b/tests/TestSuite_l3fwd_lpm_ipv4_rfc2544.py
index 5b4a0aa3..d167be04 100644
--- a/tests/TestSuite_l3fwd_lpm_ipv4_rfc2544.py
+++ b/tests/TestSuite_l3fwd_lpm_ipv4_rfc2544.py
@@ -33,8 +33,8 @@ 
 DPDK Test suite.
 Layer-3 forwarding test script.
 """
-from test_case import TestCase
-from perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
 
 
 class TestL3fwdLpmIpv4Rfc2544(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_l3fwd_lpm_ipv6.py b/tests/TestSuite_l3fwd_lpm_ipv6.py
index e53e4f77..bafd91c8 100644
--- a/tests/TestSuite_l3fwd_lpm_ipv6.py
+++ b/tests/TestSuite_l3fwd_lpm_ipv6.py
@@ -33,8 +33,8 @@ 
 DPDK Test suite.
 Layer-3 forwarding test script.
 """
-from test_case import TestCase
-from perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, MATCH_MODE, IP_TYPE
 
 
 class TestL3fwdLpmIpv6(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_l3fwdacl.py b/tests/TestSuite_l3fwdacl.py
index 4cc51d40..90905251 100644
--- a/tests/TestSuite_l3fwdacl.py
+++ b/tests/TestSuite_l3fwdacl.py
@@ -35,10 +35,10 @@  Layer-3 forwarding ACL test script.
 """
 
 import re
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
-import packet
+from framework.test_case import TestCase
+import framework.packet as packet
 
 class TestL3fwdacl(TestCase):
 
diff --git a/tests/TestSuite_large_vf.py b/tests/TestSuite_large_vf.py
index 84f592d1..68002c9b 100644
--- a/tests/TestSuite_large_vf.py
+++ b/tests/TestSuite_large_vf.py
@@ -32,11 +32,11 @@ 
 import re
 import time
 
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
-from utils import GREEN, RED
+from framework.utils import GREEN, RED
 
 multi_fdir_queue_group = {
     "match": [
diff --git a/tests/TestSuite_link_flowctrl.py b/tests/TestSuite_link_flowctrl.py
index 326f8b98..89b84aaf 100644
--- a/tests/TestSuite_link_flowctrl.py
+++ b/tests/TestSuite_link_flowctrl.py
@@ -34,15 +34,15 @@  DPDK Test suite.
 Test for Ethernet Link Flow Control Features by Poll Mode Drivers
 """
 
-import utils
+import framework.utils as utils
 import re
 import os
 
 from time import sleep
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestLinkFlowctrl(TestCase):
diff --git a/tests/TestSuite_link_status_interrupt.py b/tests/TestSuite_link_status_interrupt.py
index 2e8c282e..c9aa35bd 100644
--- a/tests/TestSuite_link_status_interrupt.py
+++ b/tests/TestSuite_link_status_interrupt.py
@@ -35,12 +35,12 @@  DPDK Test suite.
 Test link status.
 """
 
-import utils
+import framework.utils as utils
 import string
 import time
 import re
-from test_case import TestCase
-from packet import Packet
+from framework.test_case import TestCase
+from framework.packet import Packet
 
 
 class TestLinkStatusInterrupt(TestCase):
diff --git a/tests/TestSuite_linux_modules.py b/tests/TestSuite_linux_modules.py
index a5a1542a..8bc864e6 100644
--- a/tests/TestSuite_linux_modules.py
+++ b/tests/TestSuite_linux_modules.py
@@ -37,8 +37,8 @@  Linux Kernel Modules example.
 import os
 import time
 
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
 from framework import settings
 
diff --git a/tests/TestSuite_loadbalancer.py b/tests/TestSuite_loadbalancer.py
index 84e534c9..5cb44466 100644
--- a/tests/TestSuite_loadbalancer.py
+++ b/tests/TestSuite_loadbalancer.py
@@ -36,10 +36,10 @@  Test Load Balancer.
 
 """
 
-import dts
-from packet import Packet
-from test_case import TestCase
-import utils
+import framework.dts as dts
+from framework.packet import Packet
+from framework.test_case import TestCase
+import framework.utils as utils
 import time
 
 
diff --git a/tests/TestSuite_loopback_multi_paths_port_restart.py b/tests/TestSuite_loopback_multi_paths_port_restart.py
index 972a8b25..556d449e 100644
--- a/tests/TestSuite_loopback_multi_paths_port_restart.py
+++ b/tests/TestSuite_loopback_multi_paths_port_restart.py
@@ -37,11 +37,11 @@  Benchmark Vhost loopback for 7 RX/TX PATHs.
 Includes Mergeable, Normal, Vector_RX,Inorder_mergeable,
 Inorder_no_mergeable, VIRTIO1.1_mergeable, VIRTIO1.1_normal Path.
 """
-import utils
+import framework.utils as utils
 import time
 import re
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
 
 class TestLoopbackPortRestart(TestCase):
diff --git a/tests/TestSuite_loopback_multi_queues.py b/tests/TestSuite_loopback_multi_queues.py
index 4700c2d4..d76b63e6 100644
--- a/tests/TestSuite_loopback_multi_queues.py
+++ b/tests/TestSuite_loopback_multi_queues.py
@@ -36,11 +36,11 @@  Includes Mergeable, Normal, Vector_RX, Inorder mergeable,
 Inorder no-mergeable, Virtio 1.1 mergeable, Virtio 1.1 no-mergeable Path.
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
 
 class TestLoopbackMultiQueues(TestCase):
diff --git a/tests/TestSuite_loopback_virtio_user_server_mode.py b/tests/TestSuite_loopback_virtio_user_server_mode.py
index 0178ca34..8531f647 100644
--- a/tests/TestSuite_loopback_virtio_user_server_mode.py
+++ b/tests/TestSuite_loopback_virtio_user_server_mode.py
@@ -35,11 +35,11 @@ 
 DPDK Test suite.
 Test loopback virtio-user server mode
 """
-import utils
+import framework.utils as utils
 import time
 import re
-from pmd_output import PmdOutput
-from test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
 
 class TestLoopbackVirtioUserServerMode(TestCase):
diff --git a/tests/TestSuite_mac_filter.py b/tests/TestSuite_mac_filter.py
index 112914d6..7742ad58 100644
--- a/tests/TestSuite_mac_filter.py
+++ b/tests/TestSuite_mac_filter.py
@@ -34,11 +34,11 @@  DPDK Test suite.
 Test the support of Allowlist Features by Poll Mode Drivers
 """
 
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 import operator
 
 class TestMacFilter(TestCase):
diff --git a/tests/TestSuite_macsec_for_ixgbe.py b/tests/TestSuite_macsec_for_ixgbe.py
index 4b010d08..a9f793ae 100644
--- a/tests/TestSuite_macsec_for_ixgbe.py
+++ b/tests/TestSuite_macsec_for_ixgbe.py
@@ -33,10 +33,10 @@  import re
 import time
 import os
 
-from test_case import TestCase
-from dut import Dut
-from pktgen import PacketGeneratorHelper
-from packet import Packet
+from framework.test_case import TestCase
+from framework.dut import Dut
+from framework.pktgen import PacketGeneratorHelper
+from framework.packet import Packet
 
 class TestMacsecForIxgbe(TestCase):
     def set_up_all(self):
diff --git a/tests/TestSuite_malicious_driver_event_indication.py b/tests/TestSuite_malicious_driver_event_indication.py
index 8b446cf2..3da9dfba 100644
--- a/tests/TestSuite_malicious_driver_event_indication.py
+++ b/tests/TestSuite_malicious_driver_event_indication.py
@@ -38,12 +38,12 @@  import re
 import time
 import traceback
 from contextlib import contextmanager
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 
 
-from exception import VerifyFailure
-from test_case import TestCase
-import utils
+from framework.exception import VerifyFailure
+from framework.test_case import TestCase
+import framework.utils as utils
 
 
 class TestSuiteMaliciousDrvEventIndication(TestCase):
diff --git a/tests/TestSuite_mdd.py b/tests/TestSuite_mdd.py
index 8aad1a72..cd07ae81 100644
--- a/tests/TestSuite_mdd.py
+++ b/tests/TestSuite_mdd.py
@@ -37,10 +37,10 @@  Test the support of Malicious Driver Detection
 
 import re
 import time
-from packet import Packet
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 VM_CORES_MASK = 'all'
 send_pks_num = 2000
diff --git a/tests/TestSuite_metering_and_policing.py b/tests/TestSuite_metering_and_policing.py
index a566c65c..b80054dc 100644
--- a/tests/TestSuite_metering_and_policing.py
+++ b/tests/TestSuite_metering_and_policing.py
@@ -34,15 +34,15 @@  Test metering_and_policing.
 """
 
 import os
-import utils
+import framework.utils as utils
 import string
 import time
 import re
-from test_case import TestCase
-from plotting import Plotting
-from settings import HEADER_SIZE
-from dut import Dut
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.plotting import Plotting
+from framework.settings import HEADER_SIZE
+from framework.dut import Dut
+from framework.pmd_output import PmdOutput
 
 
 class TestMeteringAndPolicing(TestCase):
diff --git a/tests/TestSuite_metrics.py b/tests/TestSuite_metrics.py
index d1b7fe9c..fd5013e5 100644
--- a/tests/TestSuite_metrics.py
+++ b/tests/TestSuite_metrics.py
@@ -41,13 +41,13 @@  import traceback
 from copy import deepcopy
 from pprint import pformat
 
-from test_case import TestCase
-from pmd_output import PmdOutput
-from exception import VerifyFailure
-from settings import HEADER_SIZE
-from packet import Packet
-from pktgen import TRANSMIT_CONT
-from config import SuiteConf
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.exception import VerifyFailure
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.pktgen import TRANSMIT_CONT
+from framework.config import SuiteConf
 
 
 class TestMetrics(TestCase):
diff --git a/tests/TestSuite_mtu_update.py b/tests/TestSuite_mtu_update.py
index f1da8660..bf25d81e 100644
--- a/tests/TestSuite_mtu_update.py
+++ b/tests/TestSuite_mtu_update.py
@@ -39,20 +39,20 @@  import subprocess
 from time import sleep
 from typing import List, Tuple
 
-import utils
-from pmd_output import PmdOutput
-from test_case import TestCase
+import framework.utils as utils
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
-from pktgen_base import TRANSMIT_S_BURST
+from framework.pktgen_base import TRANSMIT_S_BURST
 
-import utils
+import framework.utils as utils
 import re
 import time
-from test_case import TestCase
-from pktgen import TRANSMIT_CONT
+from framework.test_case import TestCase
+from framework.pktgen import TRANSMIT_CONT
 
-from packet import Packet
-from settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.settings import HEADER_SIZE
 
 ETHER_HEADER_LEN = 18
 VLAN=4
diff --git a/tests/TestSuite_multicast.py b/tests/TestSuite_multicast.py
index a163a151..6d6a7ed0 100644
--- a/tests/TestSuite_multicast.py
+++ b/tests/TestSuite_multicast.py
@@ -36,8 +36,8 @@  multicast test script.
 """
 
 import time
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 routeTbl = [
     ["224.0.0.101", "P1"], ["224.0.0.102", "P2"],
diff --git a/tests/TestSuite_multiple_pthread.py b/tests/TestSuite_multiple_pthread.py
index 8d9dc3f7..58c8abd9 100644
--- a/tests/TestSuite_multiple_pthread.py
+++ b/tests/TestSuite_multiple_pthread.py
@@ -34,9 +34,9 @@  import os
 import re
 import random
 import string
-import utils
-from test_case import TestCase
-from packet import Packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
 
 
 class TestMultiplePthread(TestCase):
diff --git a/tests/TestSuite_multiprocess.py b/tests/TestSuite_multiprocess.py
index 743ca1f3..a5985178 100644
--- a/tests/TestSuite_multiprocess.py
+++ b/tests/TestSuite_multiprocess.py
@@ -34,13 +34,13 @@  DPDK Test suite.
 Multi-process Test.
 """
 
-import utils
+import framework.utils as utils
 import time
 import os
 
 executions = []
-from test_case import TestCase
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestMultiprocess(TestCase):
diff --git a/tests/TestSuite_netmap_compat.py b/tests/TestSuite_netmap_compat.py
index 31fa684c..787098d1 100644
--- a/tests/TestSuite_netmap_compat.py
+++ b/tests/TestSuite_netmap_compat.py
@@ -35,11 +35,11 @@  DPDK Test suite.
 Test Netmap_compat.
 """
 
-import utils
+import framework.utils as utils
 import string
 import time
 import re
-from test_case import TestCase
+from framework.test_case import TestCase
 
 class TestNetmapCompat(TestCase):
 
diff --git a/tests/TestSuite_nic_single_core_perf.py b/tests/TestSuite_nic_single_core_perf.py
index 4ccc04ac..45adf06a 100644
--- a/tests/TestSuite_nic_single_core_perf.py
+++ b/tests/TestSuite_nic_single_core_perf.py
@@ -32,18 +32,18 @@ 
 DPDK Test suite.
 """
 
-import utils
+import framework.utils as utils
 import json
 import os
 import string
-from test_case import TestCase
-from exception import VerifyFailure
-from settings import HEADER_SIZE, UPDATE_EXPECTED, load_global_setting
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.settings import HEADER_SIZE, UPDATE_EXPECTED, load_global_setting
+from framework.pmd_output import PmdOutput
 from copy import deepcopy
 from numpy import mean
-import rst
-from pktgen import PacketGeneratorHelper
+import framework.rst as rst
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestNicSingleCorePerf(TestCase):
diff --git a/tests/TestSuite_ntb.py b/tests/TestSuite_ntb.py
index e5013132..fe037057 100644
--- a/tests/TestSuite_ntb.py
+++ b/tests/TestSuite_ntb.py
@@ -32,11 +32,11 @@ 
 import os
 import re
 import time
-from test_case import TestCase
-from net_device import GetNicObj
-from settings import HEADER_SIZE
-from packet import Packet
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from nics.net_device import GetNicObj
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
 
 class TestNtb(TestCase):
 
diff --git a/tests/TestSuite_nvgre.py b/tests/TestSuite_nvgre.py
index 1b1a50db..7b3a04bb 100644
--- a/tests/TestSuite_nvgre.py
+++ b/tests/TestSuite_nvgre.py
@@ -36,13 +36,13 @@  Test NVGRE features in DPDK.
 
 """
 
-import utils
+import framework.utils as utils
 import string
 import re
 import time
 import os
-from pmd_output import PmdOutput
-from packet import IncreaseIP, IncreaseIPv6
+from framework.pmd_output import PmdOutput
+from framework.packet import IncreaseIP, IncreaseIPv6
 from random import randint
 
 from socket import AF_INET6
@@ -55,8 +55,8 @@  from scapy.sendrecv import sniff
 from scapy.config import conf
 from scapy.route import *
 
-from test_case import TestCase
-from settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
 
 #
 #
diff --git a/tests/TestSuite_packet_capture.py b/tests/TestSuite_packet_capture.py
index 4b980558..b41e7594 100644
--- a/tests/TestSuite_packet_capture.py
+++ b/tests/TestSuite_packet_capture.py
@@ -46,10 +46,10 @@  from scapy.packet import NoPayload
 from scapy.packet import Packet as scapyPacket
 from scapy.fields import ConditionalField
 
-from test_case import TestCase
-from exception import VerifyFailure
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 
 
 # These source code copy from packet.py module before sniff_packets/load_sniff_packets
diff --git a/tests/TestSuite_packet_ordering.py b/tests/TestSuite_packet_ordering.py
index 807a3c0d..7cb2ad8e 100644
--- a/tests/TestSuite_packet_ordering.py
+++ b/tests/TestSuite_packet_ordering.py
@@ -36,9 +36,9 @@  Packet ordering example app test cases.
 
 import os
 import time
-import utils
-from test_case import TestCase
-from packet import Packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
 
 
 class TestPacketOrdering(TestCase):
diff --git a/tests/TestSuite_perf_virtio_user_loopback.py b/tests/TestSuite_perf_virtio_user_loopback.py
index 4408786c..8e7df7e9 100644
--- a/tests/TestSuite_perf_virtio_user_loopback.py
+++ b/tests/TestSuite_perf_virtio_user_loopback.py
@@ -37,16 +37,16 @@  Inorder non-mergeable, packed ring mergeable, non-mergeable, inorder mergeable,
 inorder non-mergeable Path.
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 import json
-import rst
+import framework.rst as rst
 import os
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 from copy import deepcopy
-from test_case import TestCase
-from settings import UPDATE_EXPECTED, load_global_setting
+from framework.test_case import TestCase
+from framework.settings import UPDATE_EXPECTED, load_global_setting
 
 
 class TestPerfVirtioUserLoopback(TestCase):
diff --git a/tests/TestSuite_perf_virtio_user_pvp.py b/tests/TestSuite_perf_virtio_user_pvp.py
index 344dba5a..3789f244 100644
--- a/tests/TestSuite_perf_virtio_user_pvp.py
+++ b/tests/TestSuite_perf_virtio_user_pvp.py
@@ -32,15 +32,15 @@ 
 """
 DPDK Test suite.
 """
-import utils
+import framework.utils as utils
 import json
-import rst
+import framework.rst as rst
 import os
 import re
 import time
-from test_case import TestCase
-from packet import Packet
-from settings import UPDATE_EXPECTED, load_global_setting
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.settings import UPDATE_EXPECTED, load_global_setting
 from copy import deepcopy
 
 
diff --git a/tests/TestSuite_perf_vm2vm_virtio_net_perf.py b/tests/TestSuite_perf_vm2vm_virtio_net_perf.py
index ac0e38a2..672bbe39 100644
--- a/tests/TestSuite_perf_vm2vm_virtio_net_perf.py
+++ b/tests/TestSuite_perf_vm2vm_virtio_net_perf.py
@@ -40,15 +40,15 @@  please use qemu version greater 4.1.94 which support packed feathur to test this
 """
 import re
 import os
-import rst
+import framework.rst as rst
 import json
 import time
 import string
 import random
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import UPDATE_EXPECTED, load_global_setting
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import UPDATE_EXPECTED, load_global_setting
 from copy import deepcopy
 
 
diff --git a/tests/TestSuite_performance_thread.py b/tests/TestSuite_performance_thread.py
index 3ff20150..9e138d08 100644
--- a/tests/TestSuite_performance_thread.py
+++ b/tests/TestSuite_performance_thread.py
@@ -35,10 +35,10 @@  Performance-Thread test script.
 """
 import os
 import string
-import utils
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestPerformanceThread(TestCase):
diff --git a/tests/TestSuite_pf_smoke.py b/tests/TestSuite_pf_smoke.py
index 63eb2c7e..e4dffdaf 100644
--- a/tests/TestSuite_pf_smoke.py
+++ b/tests/TestSuite_pf_smoke.py
@@ -29,14 +29,14 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-from smoke_base import SmokeTest
-from smoke_base import JUMBO_FRAME_LENGTH
-from smoke_base import JUMBO_FRAME_MTU
-from smoke_base import DEFAULT_MTU_VALUE
-from smoke_base import LAUNCH_QUEUE
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from .smoke_base import SmokeTest
+from .smoke_base import JUMBO_FRAME_LENGTH
+from .smoke_base import JUMBO_FRAME_MTU
+from .smoke_base import DEFAULT_MTU_VALUE
+from .smoke_base import LAUNCH_QUEUE
 
 
 class TestPfSmoke(TestCase):
diff --git a/tests/TestSuite_pipeline.py b/tests/TestSuite_pipeline.py
index e00f2e9b..ba7131ec 100644
--- a/tests/TestSuite_pipeline.py
+++ b/tests/TestSuite_pipeline.py
@@ -29,25 +29,25 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-import utils
+import framework.utils as utils
 import re
 import time
 import socket
 
-from settings import HEADER_SIZE
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import DRIVERS
-from crb import Crb
+from framework.settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
+from framework.crb import Crb
 
-from virt_dut import VirtDut
-from project_dpdk import DPDKdut
-from dut import Dut
-from packet import Packet
+from framework.virt_dut import VirtDut
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+from framework.packet import Packet
 
 import os
 import random
-from exception import VerifyFailure
+from framework.exception import VerifyFailure
 import scapy.layers.inet
 from scapy.utils import rdpcap
 
diff --git a/tests/TestSuite_pmd.py b/tests/TestSuite_pmd.py
index 48d35831..72f0e473 100644
--- a/tests/TestSuite_pmd.py
+++ b/tests/TestSuite_pmd.py
@@ -34,21 +34,21 @@  DPDK Test suite.
 Test userland 10Gb PMD
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
 import os
 
-from test_case import TestCase
+from framework.test_case import TestCase
 from time import sleep
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
 
-from settings import FOLDERS
-from system_info import SystemInfo
-import perf_report
+from framework.settings import FOLDERS
+from nics.system_info import SystemInfo
+import nics.perf_report as perf_report
 from datetime import datetime
-from pktgen import PacketGeneratorHelper
+from framework.pktgen import PacketGeneratorHelper
 
 class TestPmd(TestCase):
 
diff --git a/tests/TestSuite_pmd_bonded.py b/tests/TestSuite_pmd_bonded.py
index c5c1a667..253c1a69 100644
--- a/tests/TestSuite_pmd_bonded.py
+++ b/tests/TestSuite_pmd_bonded.py
@@ -43,11 +43,11 @@  import random
 from socket import htons, htonl
 from functools import wraps
 
-import utils
-from test_case import TestCase
-from exception import TimeoutException
-from settings import TIMEOUT
-from pmd_output import PmdOutput
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.exception import TimeoutException
+from framework.settings import TIMEOUT
+from framework.pmd_output import PmdOutput
 
 SOCKET_0 = 0
 SOCKET_1 = 1
diff --git a/tests/TestSuite_pmd_bonded_8023ad.py b/tests/TestSuite_pmd_bonded_8023ad.py
index 37070421..cdac97ec 100644
--- a/tests/TestSuite_pmd_bonded_8023ad.py
+++ b/tests/TestSuite_pmd_bonded_8023ad.py
@@ -34,12 +34,12 @@  import re
 import traceback
 
 # import dts/framework libs
-from test_case import TestCase
-from exception import VerifyFailure
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
 
 # import bonding lib(common methods for pmd bonding command)
-import bonding
-from bonding import MODE_LACP, FRAME_SIZE_64
+import tests.bonding as bonding
+from .bonding import MODE_LACP, FRAME_SIZE_64
 
 ######################
 # bonding 802.3ad mode
diff --git a/tests/TestSuite_pmd_stacked_bonded.py b/tests/TestSuite_pmd_stacked_bonded.py
index 12c384fb..66dc00eb 100644
--- a/tests/TestSuite_pmd_stacked_bonded.py
+++ b/tests/TestSuite_pmd_stacked_bonded.py
@@ -33,13 +33,13 @@  import time
 import traceback
 
 # import dts/framework libs
-import utils
-from test_case import TestCase
-from exception import VerifyFailure
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
 
 # import bonding lib
-import bonding
-from bonding import (
+import tests.bonding as bonding
+from .bonding import (
                 MODE_ROUND_ROBIN,
                 MODE_ACTIVE_BACKUP,
                 MODE_XOR_BALANCE,
diff --git a/tests/TestSuite_pmdpcap.py b/tests/TestSuite_pmdpcap.py
index 0913e9bf..e08dc61c 100644
--- a/tests/TestSuite_pmdpcap.py
+++ b/tests/TestSuite_pmdpcap.py
@@ -31,12 +31,12 @@ 
 
 '''
 '''
-from test_case import TestCase
+from framework.test_case import TestCase
 
 from time import sleep
 from scapy.layers.inet import Ether, IP
 from scapy.utils import wrpcap
-import utils
+import framework.utils as utils
 
 
 #
diff --git a/tests/TestSuite_pmdrss_hash.py b/tests/TestSuite_pmdrss_hash.py
index 9ea6f9ae..4e9dd459 100644
--- a/tests/TestSuite_pmdrss_hash.py
+++ b/tests/TestSuite_pmdrss_hash.py
@@ -39,7 +39,7 @@  Support 4*10G, 1*40G and 2*40G NICs.
 import time
 import random
 import re
-import utils
+import framework.utils as utils
 
 queue = 16
 reta_entries = []
@@ -60,7 +60,7 @@  iptypes = {'ipv4-sctp': 'sctp',
 
 # Use scapy to send packets with different source and dest ip.
 # and collect the hash result of five tuple and the queue id.
-from test_case import TestCase
+from framework.test_case import TestCase
 #
 #
 # Test class.
diff --git a/tests/TestSuite_pmdrssreta.py b/tests/TestSuite_pmdrssreta.py
index ce3ee421..230d588b 100644
--- a/tests/TestSuite_pmdrssreta.py
+++ b/tests/TestSuite_pmdrssreta.py
@@ -36,7 +36,7 @@  Test RSS reta (redirection table) update function.
 import time
 import random
 import re
-import utils
+import framework.utils as utils
 import textwrap
 testQueues = [2, 9, 16]
 reta_entries = []
@@ -44,8 +44,8 @@  reta_lines = []
 
 # Use scapy to send packets with different source and dest ip.
 # and collect the hash result of five tuple and the queue id.
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestPmdrssreta(TestCase):
diff --git a/tests/TestSuite_port_control.py b/tests/TestSuite_port_control.py
index e8d96f5a..7a87808e 100644
--- a/tests/TestSuite_port_control.py
+++ b/tests/TestSuite_port_control.py
@@ -30,13 +30,13 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import os
-import utils
+import framework.utils as utils
 import time
 import re
-import packet
-from test_case import TestCase
-from pmd_output import PmdOutput
-from virt_common import VM
+import framework.packet as packet
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.virt_common import VM
 
 
 class TestPortControl(TestCase):
diff --git a/tests/TestSuite_port_representor.py b/tests/TestSuite_port_representor.py
index e2fe0dc8..51ec9982 100644
--- a/tests/TestSuite_port_representor.py
+++ b/tests/TestSuite_port_representor.py
@@ -39,10 +39,10 @@  independent on the control plane and data plane.
 import time
 import re
 
-from test_case import TestCase
-from dut import Dut
-from packet import Packet
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.dut import Dut
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
 
 
 class TestPortRepresentor(TestCase):
diff --git a/tests/TestSuite_power_bidirection_channel.py b/tests/TestSuite_power_bidirection_channel.py
index 1aa02976..6f1a71cb 100644
--- a/tests/TestSuite_power_bidirection_channel.py
+++ b/tests/TestSuite_power_bidirection_channel.py
@@ -37,10 +37,10 @@  import os
 import time
 import traceback
 
-from utils import create_mask as dts_create_mask
-from qemu_libvirt import LibvirtKvm
-from exception import VerifyFailure
-from test_case import TestCase
+from framework.utils import create_mask as dts_create_mask
+from framework.qemu_libvirt import LibvirtKvm
+from framework.exception import VerifyFailure
+from framework.test_case import TestCase
 
 
 class TestPowerBidirectionChannel(TestCase):
diff --git a/tests/TestSuite_power_branch_ratio.py b/tests/TestSuite_power_branch_ratio.py
index a157539a..9b7ed953 100644
--- a/tests/TestSuite_power_branch_ratio.py
+++ b/tests/TestSuite_power_branch_ratio.py
@@ -42,15 +42,15 @@  from pprint import pformat
 import traceback
 
 
-from settings import load_global_setting
-from settings import HOST_BUILD_TYPE_SETTING
-from utils import create_mask as dts_create_mask
-from qemu_libvirt import LibvirtKvm
-from pktgen import TRANSMIT_CONT
-from exception import VerifyFailure
-from settings import HEADER_SIZE
-from packet import Packet
-from test_case import TestCase
+from framework.settings import load_global_setting
+from framework.settings import HOST_BUILD_TYPE_SETTING
+from framework.utils import create_mask as dts_create_mask
+from framework.qemu_libvirt import LibvirtKvm
+from framework.pktgen import TRANSMIT_CONT
+from framework.exception import VerifyFailure
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.test_case import TestCase
 
 
 class TestPowerBranchRatio(TestCase):
diff --git a/tests/TestSuite_power_empty_poll.py b/tests/TestSuite_power_empty_poll.py
index bb69656d..0e44c475 100644
--- a/tests/TestSuite_power_empty_poll.py
+++ b/tests/TestSuite_power_empty_poll.py
@@ -39,12 +39,12 @@  import traceback
 from copy import deepcopy
 from pprint import pformat
 
-from utils import create_mask as dts_create_mask
-from exception import VerifyFailure
-from test_case import TestCase
-from settings import HEADER_SIZE, PKTGEN_TREX
-from packet import Packet
-from pktgen import TRANSMIT_CONT
+from framework.utils import create_mask as dts_create_mask
+from framework.exception import VerifyFailure
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE, PKTGEN_TREX
+from framework.packet import Packet
+from framework.pktgen import TRANSMIT_CONT
 
 
 class TestPowerEmptyPoll(TestCase):
diff --git a/tests/TestSuite_power_negative.py b/tests/TestSuite_power_negative.py
index f6d41491..e28e7334 100644
--- a/tests/TestSuite_power_negative.py
+++ b/tests/TestSuite_power_negative.py
@@ -39,10 +39,10 @@  import re
 import time
 import traceback
 
-from utils import create_mask as dts_create_mask
-from qemu_libvirt import LibvirtKvm
-from exception import VerifyFailure
-from test_case import TestCase
+from framework.utils import create_mask as dts_create_mask
+from framework.qemu_libvirt import LibvirtKvm
+from framework.exception import VerifyFailure
+from framework.test_case import TestCase
 
 
 class TestPowerNegative(TestCase):
diff --git a/tests/TestSuite_power_pbf.py b/tests/TestSuite_power_pbf.py
index 083fd5b3..be7fa8a0 100644
--- a/tests/TestSuite_power_pbf.py
+++ b/tests/TestSuite_power_pbf.py
@@ -39,12 +39,12 @@  import traceback
 from collections import Counter
 from pprint import pformat
 
-# import dts libs
-from settings import load_global_setting
-from settings import HOST_BUILD_TYPE_SETTING
-from test_case import TestCase
-from exception import VerifyFailure
-from utils import create_mask
+# import framework.dts as dts libs
+from framework.settings import load_global_setting
+from framework.settings import HOST_BUILD_TYPE_SETTING
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.utils import create_mask
 
 
 class TestPowerPbf(TestCase):
diff --git a/tests/TestSuite_power_pstate.py b/tests/TestSuite_power_pstate.py
index 220fe6ff..ed3d78ea 100644
--- a/tests/TestSuite_power_pstate.py
+++ b/tests/TestSuite_power_pstate.py
@@ -37,10 +37,10 @@  import traceback
 from collections import Counter
 from pprint import pformat
 
-# import dts libs
-from test_case import TestCase
-from exception import VerifyFailure
-from utils import create_mask
+# import framework.dts as dts libs
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.utils import create_mask
 
 
 class TestPowerPstate(TestCase):
diff --git a/tests/TestSuite_power_telemetry.py b/tests/TestSuite_power_telemetry.py
index 0af30d77..6b94f171 100644
--- a/tests/TestSuite_power_telemetry.py
+++ b/tests/TestSuite_power_telemetry.py
@@ -42,15 +42,15 @@  import json
 from copy import deepcopy
 from pprint import pformat
 
-from settings import load_global_setting
-from settings import HOST_BUILD_TYPE_SETTING
-from utils import create_mask as dts_create_mask
-from settings import HEADER_SIZE
-from test_case import TestCase
-from pktgen import TRANSMIT_CONT
-from exception import VerifyFailure
-
-from packet import Packet
+from framework.settings import load_global_setting
+from framework.settings import HOST_BUILD_TYPE_SETTING
+from framework.utils import create_mask as dts_create_mask
+from framework.settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.pktgen import TRANSMIT_CONT
+from framework.exception import VerifyFailure
+
+from framework.packet import Packet
 
 
 class TestPowerTelemetry(TestCase):
diff --git a/tests/TestSuite_ptpclient.py b/tests/TestSuite_ptpclient.py
index 858d5f46..dd0daafd 100644
--- a/tests/TestSuite_ptpclient.py
+++ b/tests/TestSuite_ptpclient.py
@@ -34,10 +34,10 @@  DPDK Test suite.
 Test support of IEEE1588 Precise Time Protocol.
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
-from test_case import TestCase
+from framework.test_case import TestCase
 
 class TestPtpClient(TestCase):
 
diff --git a/tests/TestSuite_ptype_mapping.py b/tests/TestSuite_ptype_mapping.py
index 0d650e0b..a5e04774 100644
--- a/tests/TestSuite_ptype_mapping.py
+++ b/tests/TestSuite_ptype_mapping.py
@@ -30,11 +30,11 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 
-import utils
-from test_case import TestCase
-from exception import VerifyFailure
-from pmd_output import PmdOutput
-from packet import Packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 import time
 import re
 
diff --git a/tests/TestSuite_pvp_diff_qemu_version.py b/tests/TestSuite_pvp_diff_qemu_version.py
index bdf3f67c..e00151e9 100644
--- a/tests/TestSuite_pvp_diff_qemu_version.py
+++ b/tests/TestSuite_pvp_diff_qemu_version.py
@@ -40,12 +40,12 @@  qemu =
 """
 import re
 import time
-import utils
+import framework.utils as utils
 from scapy.utils import wrpcap
-from test_case import TestCase
-from settings import HEADER_SIZE
-from virt_common import VM
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.virt_common import VM
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVhostPVPDiffQemuVersion(TestCase):
diff --git a/tests/TestSuite_pvp_multi_paths_performance.py b/tests/TestSuite_pvp_multi_paths_performance.py
index 11db11ee..8ef9b085 100644
--- a/tests/TestSuite_pvp_multi_paths_performance.py
+++ b/tests/TestSuite_pvp_multi_paths_performance.py
@@ -34,15 +34,15 @@  DPDK Test suite.
 Test PVP performance using virtio_user on 8 tx/rx path.
 """
 import json
-import rst
+import framework.rst as rst
 import os
-import utils
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
-from settings import UPDATE_EXPECTED, load_global_setting
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.settings import UPDATE_EXPECTED, load_global_setting
 from copy import deepcopy
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 
 
 class TestPVPMultiPathPerformance(TestCase):
diff --git a/tests/TestSuite_pvp_multi_paths_vhost_single_core_performance.py b/tests/TestSuite_pvp_multi_paths_vhost_single_core_performance.py
index d26b2719..bc32e793 100644
--- a/tests/TestSuite_pvp_multi_paths_vhost_single_core_performance.py
+++ b/tests/TestSuite_pvp_multi_paths_vhost_single_core_performance.py
@@ -35,15 +35,15 @@  Test PVP vhost single core performance using virtio_user on 8 tx/rx path.
 """
 
 import json
-import rst
+import framework.rst as rst
 import os
-import utils
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
-from settings import UPDATE_EXPECTED, load_global_setting
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.settings import UPDATE_EXPECTED, load_global_setting
 from copy import deepcopy
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 
 
 class TestPVPMultiPathVhostPerformance(TestCase):
diff --git a/tests/TestSuite_pvp_multi_paths_virtio_single_core_performance.py b/tests/TestSuite_pvp_multi_paths_virtio_single_core_performance.py
index 03c5a3ce..620bdcc3 100644
--- a/tests/TestSuite_pvp_multi_paths_virtio_single_core_performance.py
+++ b/tests/TestSuite_pvp_multi_paths_virtio_single_core_performance.py
@@ -35,15 +35,15 @@  Test PVP virtio single core performance using virtio_user on 8 tx/rx path.
 """
 
 import json
-import rst
+import framework.rst as rst
 import os
-import utils
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
-from settings import UPDATE_EXPECTED, load_global_setting
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.settings import UPDATE_EXPECTED, load_global_setting
 from copy import deepcopy
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 
 
 class TestPVPMultiPathVirtioPerformance(TestCase):
diff --git a/tests/TestSuite_pvp_qemu_multi_paths_port_restart.py b/tests/TestSuite_pvp_qemu_multi_paths_port_restart.py
index 1c31ce6f..b4306eea 100644
--- a/tests/TestSuite_pvp_qemu_multi_paths_port_restart.py
+++ b/tests/TestSuite_pvp_qemu_multi_paths_port_restart.py
@@ -38,13 +38,13 @@  includes Mergeable, Normal, Vector_RX.
 Cover virtio 1.0 and virtio 0.95.Also cover
 port restart test with each path
 """
-import utils
+import framework.utils as utils
 import time
 import re
-from virt_common import VM
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestPVPQemuMultiPathPortRestart(TestCase):
diff --git a/tests/TestSuite_pvp_share_lib.py b/tests/TestSuite_pvp_share_lib.py
index 6746ff89..1d24a032 100644
--- a/tests/TestSuite_pvp_share_lib.py
+++ b/tests/TestSuite_pvp_share_lib.py
@@ -34,10 +34,10 @@  DPDK Test suite.
 The feature need compile dpdk as shared libraries.
 """
 
-import utils
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestPVPShareLib(TestCase):
diff --git a/tests/TestSuite_pvp_vhost_user_built_in_net_driver.py b/tests/TestSuite_pvp_vhost_user_built_in_net_driver.py
index a0d16671..b1843749 100644
--- a/tests/TestSuite_pvp_vhost_user_built_in_net_driver.py
+++ b/tests/TestSuite_pvp_vhost_user_built_in_net_driver.py
@@ -33,13 +33,13 @@ 
 DPDK Test suite.
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
+from framework.pmd_output import PmdOutput
 
 
 class TestPVPVhostUserBuiltInNetDriver(TestCase):
diff --git a/tests/TestSuite_pvp_vhost_user_reconnect.py b/tests/TestSuite_pvp_vhost_user_reconnect.py
index 4be19c5a..fd880bd3 100644
--- a/tests/TestSuite_pvp_vhost_user_reconnect.py
+++ b/tests/TestSuite_pvp_vhost_user_reconnect.py
@@ -37,12 +37,12 @@  Becase this suite will use the reconnet feature, the VM will start as
 server mode, so the qemu version should greater than 2.7
 """
 import re
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
-from virt_common import VM
-from packet import Packet
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.virt_common import VM
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestPVPVhostUserReconnect(TestCase):
diff --git a/tests/TestSuite_pvp_virtio_bonding.py b/tests/TestSuite_pvp_virtio_bonding.py
index e6d0e61a..d5b67769 100644
--- a/tests/TestSuite_pvp_virtio_bonding.py
+++ b/tests/TestSuite_pvp_virtio_bonding.py
@@ -36,12 +36,12 @@  link bonding devices from within testpmd interactive prompt.
 """
 import re
 import time
-import utils
-from test_case import TestCase
-from virt_common import VM
-from pmd_output import PmdOutput
-from packet import Packet
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.virt_common import VM
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestPVPVirtIOBonding(TestCase):
diff --git a/tests/TestSuite_pvp_virtio_user_2M_hugepages.py b/tests/TestSuite_pvp_virtio_user_2M_hugepages.py
index c1685463..4174fe80 100644
--- a/tests/TestSuite_pvp_virtio_user_2M_hugepages.py
+++ b/tests/TestSuite_pvp_virtio_user_2M_hugepages.py
@@ -34,11 +34,11 @@  DPDK Test suite.
 vhost/virtio-user pvp with 2M hugepage.
 """
 
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestPVPVirtioWith2Mhuge(TestCase):
diff --git a/tests/TestSuite_pvp_virtio_user_4k_pages.py b/tests/TestSuite_pvp_virtio_user_4k_pages.py
index 98cfdce6..4681a48a 100644
--- a/tests/TestSuite_pvp_virtio_user_4k_pages.py
+++ b/tests/TestSuite_pvp_virtio_user_4k_pages.py
@@ -34,11 +34,11 @@  DPDK Test suite.
 vhost/virtio-user pvp with 4K pages.
 """
 
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestPvpVirtioUser4kPages(TestCase):
diff --git a/tests/TestSuite_pvp_virtio_user_multi_queues_port_restart.py b/tests/TestSuite_pvp_virtio_user_multi_queues_port_restart.py
index eefc5bb4..36783a76 100644
--- a/tests/TestSuite_pvp_virtio_user_multi_queues_port_restart.py
+++ b/tests/TestSuite_pvp_virtio_user_multi_queues_port_restart.py
@@ -41,10 +41,10 @@  non-mergeable path, also cover port restart test with each path.
 """
 import time
 import re
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.pmd_output import PmdOutput
 
 class TestPVPVirtioUserMultiQueuesPortRestart(TestCase):
 
diff --git a/tests/TestSuite_qinq_filter.py b/tests/TestSuite_qinq_filter.py
index e19fe0f3..c841372a 100644
--- a/tests/TestSuite_qinq_filter.py
+++ b/tests/TestSuite_qinq_filter.py
@@ -37,10 +37,10 @@  Test the support of VLAN Offload Features by Poll Mode Drivers.
 
 """
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 import time
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 
 class TestQinqFilter(TestCase):
 
diff --git a/tests/TestSuite_qos_api.py b/tests/TestSuite_qos_api.py
index da2c544a..10035b78 100644
--- a/tests/TestSuite_qos_api.py
+++ b/tests/TestSuite_qos_api.py
@@ -34,14 +34,14 @@  DPDK Test suite.
 Test QOS API in DPDK.
 """
 
-import utils
+import framework.utils as utils
 import string
 import re
 import time
 import os
-from pktgen import PacketGeneratorHelper
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestQosApi(TestCase):
diff --git a/tests/TestSuite_qos_meter.py b/tests/TestSuite_qos_meter.py
index fa193126..2374989e 100644
--- a/tests/TestSuite_qos_meter.py
+++ b/tests/TestSuite_qos_meter.py
@@ -35,11 +35,11 @@  Test QOS API in DPDK.
 The DUT must have two 10G Ethernet ports connected to two ports of IXIA.
 """
 import os
-from test_case import TestCase
-from  settings import HEADER_SIZE
-from pktgen import TRANSMIT_CONT
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import TRANSMIT_CONT
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 
 
 class TestQosMeter(TestCase):
diff --git a/tests/TestSuite_queue_region.py b/tests/TestSuite_queue_region.py
index 29adaf41..bee17434 100644
--- a/tests/TestSuite_queue_region.py
+++ b/tests/TestSuite_queue_region.py
@@ -36,18 +36,18 @@  Test the support of VLAN Offload Features by Poll Mode Drivers.
 
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
-from settings import DRIVERS
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
 
-from project_dpdk import DPDKdut
-from dut import Dut
-from packet import Packet
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+from framework.packet import Packet
 
 
 class TestQueue_region(TestCase):
diff --git a/tests/TestSuite_queue_start_stop.py b/tests/TestSuite_queue_start_stop.py
index 75718c8c..32d58fdc 100644
--- a/tests/TestSuite_queue_start_stop.py
+++ b/tests/TestSuite_queue_start_stop.py
@@ -41,10 +41,10 @@  Test queue start stop Feature
 import time
 import re
 import os
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import FOLDERS
-from packet import Packet, strip_pktload
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import FOLDERS
+from framework.packet import Packet, strip_pktload
 
 #
 #
diff --git a/tests/TestSuite_rss_key_update.py b/tests/TestSuite_rss_key_update.py
index f74641cb..35675037 100644
--- a/tests/TestSuite_rss_key_update.py
+++ b/tests/TestSuite_rss_key_update.py
@@ -40,10 +40,10 @@  Test the support of RSS Key Update by Poll Mode Drivers.
 import time
 import re
 import random
-import utils
+import framework.utils as utils
 
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 queue = 16
 reta_entries = []
diff --git a/tests/TestSuite_rss_to_rte_flow.py b/tests/TestSuite_rss_to_rte_flow.py
index 20deda0c..5edf4247 100644
--- a/tests/TestSuite_rss_to_rte_flow.py
+++ b/tests/TestSuite_rss_to_rte_flow.py
@@ -38,10 +38,10 @@  Test moving RSS to rte_flow.
 
 import time
 import re
-import packet
+import framework.packet as packet
 
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestRSS_to_Rteflow(TestCase):
diff --git a/tests/TestSuite_rte_flow.py b/tests/TestSuite_rte_flow.py
index 0cc9830f..f4141976 100644
--- a/tests/TestSuite_rte_flow.py
+++ b/tests/TestSuite_rte_flow.py
@@ -38,11 +38,11 @@  import time
 import ipaddress
 from typing import Callable
 
-import utils
-from pmd_output import PmdOutput
-from test_case import TestCase
+import framework.utils as utils
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
-from test_case import TestCase
+from framework.test_case import TestCase
 
 from framework.flow import generator
 
diff --git a/tests/TestSuite_rteflow_priority.py b/tests/TestSuite_rteflow_priority.py
index 353dc8f9..d65d82e3 100644
--- a/tests/TestSuite_rteflow_priority.py
+++ b/tests/TestSuite_rteflow_priority.py
@@ -41,11 +41,11 @@  import string
 from time import sleep
 from scapy.utils import struct, socket, PcapWriter
 
-import utils
-from etgen import IxiaPacketGenerator
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
+import framework.utils as utils
+from framework.etgen import IxiaPacketGenerator
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
 import sys
 import imp
 imp.reload(sys)
diff --git a/tests/TestSuite_runtime_vf_queue_number.py b/tests/TestSuite_runtime_vf_queue_number.py
index 1d7d536c..21b6bdd7 100644
--- a/tests/TestSuite_runtime_vf_queue_number.py
+++ b/tests/TestSuite_runtime_vf_queue_number.py
@@ -36,10 +36,10 @@  DPDK Test suite.
 
 import time
 import re
-from qemu_kvm import QEMUKvm
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.qemu_kvm import QEMUKvm
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 
 RSS_KEY = '6EA6A420D5138E712433B813AE45B3C4BECB2B405F31AD6C331835372D15E2D5E49566EE0ED1962AFA1B7932F3549520FD71C75E'
 PACKET_COUNT = 100
diff --git a/tests/TestSuite_runtime_vf_queue_number_kernel.py b/tests/TestSuite_runtime_vf_queue_number_kernel.py
index 3daf2347..a13ef30e 100644
--- a/tests/TestSuite_runtime_vf_queue_number_kernel.py
+++ b/tests/TestSuite_runtime_vf_queue_number_kernel.py
@@ -37,11 +37,11 @@  runtime_vf_queue_number_kernel test script.
 import random
 import time
 
-import utils
-from pmd_output import PmdOutput
-from test_case import TestCase
-from virt_common import VM
-from packet import Packet
+import framework.utils as utils
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.virt_common import VM
+from framework.packet import Packet
 
 VM_CORES_MASK = 'all'
 
diff --git a/tests/TestSuite_runtime_vf_queue_number_maxinum.py b/tests/TestSuite_runtime_vf_queue_number_maxinum.py
index 8e93c208..31aa20ac 100644
--- a/tests/TestSuite_runtime_vf_queue_number_maxinum.py
+++ b/tests/TestSuite_runtime_vf_queue_number_maxinum.py
@@ -37,8 +37,8 @@  DPDK Test suite.
 import time
 import re
 import math
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestRuntimeVfQnMaxinum(TestCase):
diff --git a/tests/TestSuite_rxtx_callbacks.py b/tests/TestSuite_rxtx_callbacks.py
index f7d343eb..54075946 100644
--- a/tests/TestSuite_rxtx_callbacks.py
+++ b/tests/TestSuite_rxtx_callbacks.py
@@ -34,10 +34,10 @@ 
 DPDK Test suite.
 Test Rxtx_Callbacks.
 """
-import utils
+import framework.utils as utils
 import string
 import time
-from test_case import TestCase
+from framework.test_case import TestCase
 
 
 class TestRxtxCallbacks(TestCase):
diff --git a/tests/TestSuite_rxtx_offload.py b/tests/TestSuite_rxtx_offload.py
index 0e70526f..a57a9cea 100644
--- a/tests/TestSuite_rxtx_offload.py
+++ b/tests/TestSuite_rxtx_offload.py
@@ -36,18 +36,18 @@  New RX/TX offload APIs.
 
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pmd_output import PmdOutput
-from settings import DRIVERS
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pmd_output import PmdOutput
+from framework.settings import DRIVERS
 
-from project_dpdk import DPDKdut
-from dut import Dut
-from packet import Packet
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+from framework.packet import Packet
 
 ETHER_STANDARD_MTU = 1518
 ETHER_JUMBO_FRAME_MTU = 9000
diff --git a/tests/TestSuite_scatter.py b/tests/TestSuite_scatter.py
index 2049f357..80a0f3ef 100644
--- a/tests/TestSuite_scatter.py
+++ b/tests/TestSuite_scatter.py
@@ -33,9 +33,9 @@ 
 DPDK Test suite.
 Test Scattered Packets.
 """
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet, strip_pktload
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet, strip_pktload
 import time
 #
 #
diff --git a/tests/TestSuite_short_live.py b/tests/TestSuite_short_live.py
index 5ebf0b4d..c3b1fdc4 100644
--- a/tests/TestSuite_short_live.py
+++ b/tests/TestSuite_short_live.py
@@ -41,9 +41,9 @@  Test short live dpdk app Feature
 import time
 import re
 import os
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import FOLDERS
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import FOLDERS
 
 #
 #
diff --git a/tests/TestSuite_shutdown_api.py b/tests/TestSuite_shutdown_api.py
index 3810b53a..1d5a0873 100644
--- a/tests/TestSuite_shutdown_api.py
+++ b/tests/TestSuite_shutdown_api.py
@@ -36,19 +36,19 @@  Test Shutdown API Feature
 
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 import os
 import random
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE, PROTOCOL_PACKET_SIZE
-from exception import VerifyFailure
-from qemu_kvm import QEMUKvm
-from settings import get_nic_name
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE, PROTOCOL_PACKET_SIZE
+from framework.exception import VerifyFailure
+from framework.qemu_kvm import QEMUKvm
+from framework.settings import get_nic_name
 from random import randint
-from settings import DRIVERS
+from framework.settings import DRIVERS
 #
 #
 # Test class.
diff --git a/tests/TestSuite_skeleton.py b/tests/TestSuite_skeleton.py
index c2563dc3..816cfcfe 100644
--- a/tests/TestSuite_skeleton.py
+++ b/tests/TestSuite_skeleton.py
@@ -34,10 +34,10 @@ 
 DPDK Test suite.
 Test Skeleton.
 """
-import utils
+import framework.utils as utils
 import string
 import time
-from test_case import TestCase
+from framework.test_case import TestCase
 
 
 
diff --git a/tests/TestSuite_softnic.py b/tests/TestSuite_softnic.py
index e4934ffe..d29d2218 100644
--- a/tests/TestSuite_softnic.py
+++ b/tests/TestSuite_softnic.py
@@ -34,15 +34,15 @@  DPDK Test suite.
 Test softnic API in DPDK.
 """
 
-import utils
+import framework.utils as utils
 import string
 import re
 import time
-from settings import HEADER_SIZE
+from framework.settings import HEADER_SIZE
 import os
-from pktgen import PacketGeneratorHelper
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestSoftnic(TestCase):
diff --git a/tests/TestSuite_speed_capabilities.py b/tests/TestSuite_speed_capabilities.py
index 25c45e45..9fa441f5 100644
--- a/tests/TestSuite_speed_capabilities.py
+++ b/tests/TestSuite_speed_capabilities.py
@@ -33,9 +33,9 @@ 
 """
 DPDK Test suite.
 """
-import utils
-from pmd_output import PmdOutput
-from test_case import TestCase
+import framework.utils as utils
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
 
 
 class TestSpeedCapabilities(TestCase):
diff --git a/tests/TestSuite_sriov_kvm.py b/tests/TestSuite_sriov_kvm.py
index 1a0e3a53..c43087d4 100644
--- a/tests/TestSuite_sriov_kvm.py
+++ b/tests/TestSuite_sriov_kvm.py
@@ -42,11 +42,11 @@  import pdb
 import time
 import random
 
-from virt_common import VM
-from test_case import TestCase
+from framework.virt_common import VM
+from framework.test_case import TestCase
 
-from pmd_output import PmdOutput
-from settings import PROTOCOL_PACKET_SIZE
+from framework.pmd_output import PmdOutput
+from framework.settings import PROTOCOL_PACKET_SIZE
 
 FRAME_SIZE_64 = 64
 VM_CORES_MASK = 'all'
diff --git a/tests/TestSuite_stats_checks.py b/tests/TestSuite_stats_checks.py
index 5dc21b6d..b405f0d1 100644
--- a/tests/TestSuite_stats_checks.py
+++ b/tests/TestSuite_stats_checks.py
@@ -40,11 +40,11 @@  import random
 import struct
 import socket
 import re
-import utils
-from pmd_output import PmdOutput
-import packet
+import framework.utils as utils
+from framework.pmd_output import PmdOutput
+import framework.packet as packet
 
-from test_case import TestCase
+from framework.test_case import TestCase
 
 ETHER_HEADER_LEN = 18
 IP_HEADER_LEN = 20
diff --git a/tests/TestSuite_telemetry.py b/tests/TestSuite_telemetry.py
index 82a1d400..b87e5d58 100644
--- a/tests/TestSuite_telemetry.py
+++ b/tests/TestSuite_telemetry.py
@@ -36,9 +36,9 @@  import re
 import textwrap
 from pprint import pformat
 
-# import dts libs
-from test_case import TestCase
-from pmd_output import PmdOutput
+# import framework.dts as dts libs
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestTelemetry(TestCase):
diff --git a/tests/TestSuite_testpmd_perf.py b/tests/TestSuite_testpmd_perf.py
index db2eb3c7..477464bf 100644
--- a/tests/TestSuite_testpmd_perf.py
+++ b/tests/TestSuite_testpmd_perf.py
@@ -34,8 +34,8 @@  DPDK Test suite.
 testpmd perf test script.
 """
 
-from test_case import TestCase
-from perf_test_base import PerfTestBase, BIN_TYPE, MATCH_MODE, IP_TYPE
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, BIN_TYPE, MATCH_MODE, IP_TYPE
 
 
 class TestPmdPerf(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_timer.py b/tests/TestSuite_timer.py
index 77758823..73d4f217 100644
--- a/tests/TestSuite_timer.py
+++ b/tests/TestSuite_timer.py
@@ -34,12 +34,12 @@  DPDK Test suite.
 Test Timer.
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
 
 
-from test_case import TestCase
+from framework.test_case import TestCase
 
 
 class TestTimer(TestCase):
diff --git a/tests/TestSuite_tso.py b/tests/TestSuite_tso.py
index 1b5cda67..891833d0 100644
--- a/tests/TestSuite_tso.py
+++ b/tests/TestSuite_tso.py
@@ -37,14 +37,14 @@  Tests for TSO.
 
 """
 import os
-import utils
+import framework.utils as utils
 import time
 import re
 import os
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
-from packet import Packet
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
+from framework.packet import Packet
 
 DEFAULT_MUT = 1500
 TSO_MTU = 9000
diff --git a/tests/TestSuite_tx_preparation.py b/tests/TestSuite_tx_preparation.py
index 070290e0..66eec90e 100644
--- a/tests/TestSuite_tx_preparation.py
+++ b/tests/TestSuite_tx_preparation.py
@@ -40,14 +40,14 @@  Test tx preparation feature
 
 import os
 import time
-import dut
+import framework.dut as dut
 import re
 import subprocess
-from config import PortConf
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import FOLDERS
-from packet import Packet
+from framework.config import PortConf
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import FOLDERS
+from framework.packet import Packet
 import random
 #
 #
diff --git a/tests/TestSuite_uni_pkt.py b/tests/TestSuite_uni_pkt.py
index 9a3200aa..ed503b29 100644
--- a/tests/TestSuite_uni_pkt.py
+++ b/tests/TestSuite_uni_pkt.py
@@ -43,12 +43,12 @@  translate the offloaded packet types into these 7 fields of information, for
 user applications
 """
 
-import utils
-from test_case import TestCase
-from exception import VerifyFailure
-from packet import Packet
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.exception import VerifyFailure
+from framework.packet import Packet
 import time
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 
 
 class TestUniPacket(TestCase):
diff --git a/tests/TestSuite_unit_tests_cmdline.py b/tests/TestSuite_unit_tests_cmdline.py
index ac49c1bf..13ecc587 100644
--- a/tests/TestSuite_unit_tests_cmdline.py
+++ b/tests/TestSuite_unit_tests_cmdline.py
@@ -36,8 +36,8 @@  Cmdline autotest
 
 """
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_crc.py b/tests/TestSuite_unit_tests_crc.py
index 9bc5e62f..66a6ee43 100644
--- a/tests/TestSuite_unit_tests_crc.py
+++ b/tests/TestSuite_unit_tests_crc.py
@@ -36,8 +36,8 @@  Crc autotest
 
 """
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_cryptodev_func.py b/tests/TestSuite_unit_tests_cryptodev_func.py
index e51cca42..502e7969 100644
--- a/tests/TestSuite_unit_tests_cryptodev_func.py
+++ b/tests/TestSuite_unit_tests_cryptodev_func.py
@@ -30,10 +30,10 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import json
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
-import cryptodev_common as cc
+import tests.cryptodev_common as cc
 
 
 class UnitTestsCryptodev(TestCase):
diff --git a/tests/TestSuite_unit_tests_dump.py b/tests/TestSuite_unit_tests_dump.py
index 38b5fc48..22018bb4 100644
--- a/tests/TestSuite_unit_tests_dump.py
+++ b/tests/TestSuite_unit_tests_dump.py
@@ -38,8 +38,8 @@  Run Inter-VM share memory autotests
 """
 
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_eal.py b/tests/TestSuite_unit_tests_eal.py
index e5703f1d..706f7c0e 100644
--- a/tests/TestSuite_unit_tests_eal.py
+++ b/tests/TestSuite_unit_tests_eal.py
@@ -36,10 +36,10 @@  EAL autotest.
 
 """
 
-import utils
+import framework.utils as utils
 
 
-from test_case import TestCase
+from framework.test_case import TestCase
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_event_timer.py b/tests/TestSuite_unit_tests_event_timer.py
index 22c316e0..ca880f58 100644
--- a/tests/TestSuite_unit_tests_event_timer.py
+++ b/tests/TestSuite_unit_tests_event_timer.py
@@ -34,9 +34,9 @@  DPDK Test suite.
 Test Event Timer Adapter Unit test
 """
 
-import utils
+import framework.utils as utils
 
-from test_case import TestCase
+from framework.test_case import TestCase
 
 
 class TestUnitTestEventTimer(TestCase):
diff --git a/tests/TestSuite_unit_tests_kni.py b/tests/TestSuite_unit_tests_kni.py
index d54a5ace..fce7baa3 100644
--- a/tests/TestSuite_unit_tests_kni.py
+++ b/tests/TestSuite_unit_tests_kni.py
@@ -35,8 +35,8 @@  DPDK Test suite.
 This TestSuite runs the unit tests included in DPDK for KNI feature.
 """
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_loopback.py b/tests/TestSuite_unit_tests_loopback.py
index a0467378..86eff71c 100644
--- a/tests/TestSuite_unit_tests_loopback.py
+++ b/tests/TestSuite_unit_tests_loopback.py
@@ -35,10 +35,10 @@  DPDK Test suite.
 This TestSuite runs the unit tests included in DPDK for X710/XL710/XXV710 loopback mode.
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
-from test_case import TestCase
+from framework.test_case import TestCase
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_lpm.py b/tests/TestSuite_unit_tests_lpm.py
index dd4d5346..8c2f6ae6 100644
--- a/tests/TestSuite_unit_tests_lpm.py
+++ b/tests/TestSuite_unit_tests_lpm.py
@@ -36,8 +36,8 @@  This TestSuite runs the unit tests included in DPDK for LPM methods in l3fwd.
 """
 
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_mbuf.py b/tests/TestSuite_unit_tests_mbuf.py
index 05b633ce..c5a85b7e 100644
--- a/tests/TestSuite_unit_tests_mbuf.py
+++ b/tests/TestSuite_unit_tests_mbuf.py
@@ -36,8 +36,8 @@  Run all mbuf autotests
 """
 
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_mempool.py b/tests/TestSuite_unit_tests_mempool.py
index 4907fd42..92afb492 100644
--- a/tests/TestSuite_unit_tests_mempool.py
+++ b/tests/TestSuite_unit_tests_mempool.py
@@ -36,8 +36,8 @@  Run all Mempool autotests
 """
 
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_pmd_perf.py b/tests/TestSuite_unit_tests_pmd_perf.py
index 4546169d..f8fb0f1c 100644
--- a/tests/TestSuite_unit_tests_pmd_perf.py
+++ b/tests/TestSuite_unit_tests_pmd_perf.py
@@ -36,7 +36,7 @@  This TestSuite runs the unit tests included in DPDK for pmd performance.
 """
 
 import re
-from test_case import TestCase
+from framework.test_case import TestCase
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_power.py b/tests/TestSuite_unit_tests_power.py
index b09bcd69..66c05e00 100644
--- a/tests/TestSuite_unit_tests_power.py
+++ b/tests/TestSuite_unit_tests_power.py
@@ -35,8 +35,8 @@  DPDK Test suite.
 This TestSuite runs the unit tests included in DPDK for power feature.
 """
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_qos.py b/tests/TestSuite_unit_tests_qos.py
index 8ccaea17..e3a6e216 100644
--- a/tests/TestSuite_unit_tests_qos.py
+++ b/tests/TestSuite_unit_tests_qos.py
@@ -36,8 +36,8 @@  This TestSuite runs the unit tests included in DPDK for Random Early
 Detection, Metering and Scheduling QoS features.
 """
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_ring.py b/tests/TestSuite_unit_tests_ring.py
index 8c7e0624..2e46ddc8 100644
--- a/tests/TestSuite_unit_tests_ring.py
+++ b/tests/TestSuite_unit_tests_ring.py
@@ -36,8 +36,8 @@  Run all Ring autotests
 """
 
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_ringpmd.py b/tests/TestSuite_unit_tests_ringpmd.py
index 7050a448..e55ff7af 100644
--- a/tests/TestSuite_unit_tests_ringpmd.py
+++ b/tests/TestSuite_unit_tests_ringpmd.py
@@ -36,8 +36,8 @@  Run Inter-VM share memory autotests
 """
 
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_unit_tests_timer.py b/tests/TestSuite_unit_tests_timer.py
index fef84089..8869eacd 100644
--- a/tests/TestSuite_unit_tests_timer.py
+++ b/tests/TestSuite_unit_tests_timer.py
@@ -36,8 +36,8 @@  Run all timer autotests
 """
 
 
-from test_case import TestCase
-import utils
+from framework.test_case import TestCase
+import framework.utils as utils
 
 #
 #
diff --git a/tests/TestSuite_userspace_ethtool.py b/tests/TestSuite_userspace_ethtool.py
index fd65d718..b42ff71a 100644
--- a/tests/TestSuite_userspace_ethtool.py
+++ b/tests/TestSuite_userspace_ethtool.py
@@ -35,17 +35,17 @@  Test support of userspace ethtool feature
 """
 
 import os
-import utils
+import framework.utils as utils
 import time
 import re
-from test_case import TestCase
-from packet import Packet
+from framework.test_case import TestCase
+from framework.packet import Packet
 import random
-from etgen import IxiaPacketGenerator
-from settings import HEADER_SIZE
-from settings import SCAPY2IXIA
-from utils import RED
-from exception import VerifyFailure
+from framework.etgen import IxiaPacketGenerator
+from framework.settings import HEADER_SIZE
+from framework.settings import SCAPY2IXIA
+from framework.utils import RED
+from framework.exception import VerifyFailure
 
 
 class TestUserspaceEthtool(TestCase, IxiaPacketGenerator):
diff --git a/tests/TestSuite_vdev_primary_secondary.py b/tests/TestSuite_vdev_primary_secondary.py
index 50d5b597..841afc58 100644
--- a/tests/TestSuite_vdev_primary_secondary.py
+++ b/tests/TestSuite_vdev_primary_secondary.py
@@ -43,9 +43,9 @@  sends them out by writing them directly to a suitable TX queue.
 
 import time
 import re
-import utils
-from test_case import TestCase
-from virt_common import VM
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.virt_common import VM
 
 
 class TestVdevPrimarySecondary(TestCase):
diff --git a/tests/TestSuite_veb_switch.py b/tests/TestSuite_veb_switch.py
index cdd2b3c4..c72721dd 100644
--- a/tests/TestSuite_veb_switch.py
+++ b/tests/TestSuite_veb_switch.py
@@ -37,16 +37,16 @@  Test VEB Switch and floating VEB Features by Poll Mode Drivers.
 
 import re
 import time
-import utils
-
-from virt_dut import VirtDut
-from project_dpdk import DPDKdut
-from dut import Dut
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE
-from packet import Packet
-from utils import RED
+import framework.utils as utils
+
+from framework.virt_dut import VirtDut
+from framework.project_dpdk import DPDKdut
+from framework.dut import Dut
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.utils import RED
 
 
 class TestVEBSwitching(TestCase):
diff --git a/tests/TestSuite_vf_daemon.py b/tests/TestSuite_vf_daemon.py
index a08ae7b5..ed2c392b 100644
--- a/tests/TestSuite_vf_daemon.py
+++ b/tests/TestSuite_vf_daemon.py
@@ -31,14 +31,14 @@ 
 
 import time
 import sys
-import utils 
+import framework.utils as utils 
 from scapy.utils import rdpcap
 
-from qemu_kvm import QEMUKvm
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
-from settings import get_nic_name
+from framework.qemu_kvm import QEMUKvm
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.settings import get_nic_name
 import random
 
 VM_CORES_MASK = 'all'
diff --git a/tests/TestSuite_vf_interrupt_pmd.py b/tests/TestSuite_vf_interrupt_pmd.py
index 8d68b022..9a4e6235 100644
--- a/tests/TestSuite_vf_interrupt_pmd.py
+++ b/tests/TestSuite_vf_interrupt_pmd.py
@@ -35,13 +35,13 @@  DPDK Test suite.
 Test vf_interrupt_pmd.
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
 import pdb
-from virt_common import VM
-from test_case import TestCase
-from packet import Packet
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.packet import Packet
 
 class TestVfInterruptPmd(TestCase):
     supported_vf_driver = ['pci-stub', 'vfio-pci']
diff --git a/tests/TestSuite_vf_jumboframe.py b/tests/TestSuite_vf_jumboframe.py
index 3eb441f2..faa53929 100644
--- a/tests/TestSuite_vf_jumboframe.py
+++ b/tests/TestSuite_vf_jumboframe.py
@@ -32,13 +32,13 @@ 
 import re
 import time
 
-import utils
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE
-from packet import Packet
-from utils import RED
+import framework.utils as utils
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.utils import RED
 
 VM_CORES_MASK = 'all'
 
diff --git a/tests/TestSuite_vf_kernel.py b/tests/TestSuite_vf_kernel.py
index a4e1e52a..9656f027 100755
--- a/tests/TestSuite_vf_kernel.py
+++ b/tests/TestSuite_vf_kernel.py
@@ -35,18 +35,18 @@  DPDK Test suite.
 Test VF kernel
 """
 
-import utils
+import framework.utils as utils
 import time
 import datetime
 import re
 import random
 import threading
-from test_case import TestCase
-from qemu_kvm import QEMUKvm
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.test_case import TestCase
+from framework.qemu_kvm import QEMUKvm
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 import random
-from utils import GREEN, RED
+from framework.utils import GREEN, RED
 
 
 class TestVfKernel(TestCase):
diff --git a/tests/TestSuite_vf_l3fwd.py b/tests/TestSuite_vf_l3fwd.py
index a9bc7fa4..b2e816eb 100644
--- a/tests/TestSuite_vf_l3fwd.py
+++ b/tests/TestSuite_vf_l3fwd.py
@@ -32,11 +32,11 @@ 
 import time
 import os
 import string
-import utils
-from test_case import TestCase
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVfL3fwd(TestCase):
diff --git a/tests/TestSuite_vf_l3fwd_em_kernelpf.py b/tests/TestSuite_vf_l3fwd_em_kernelpf.py
index 05cda1d1..4468210e 100644
--- a/tests/TestSuite_vf_l3fwd_em_kernelpf.py
+++ b/tests/TestSuite_vf_l3fwd_em_kernelpf.py
@@ -31,8 +31,8 @@ 
 
 import os
 import time
-from test_case import TestCase
-from perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
 
 
 class TestVfL3fwdEmKernelPf(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_vf_l3fwd_kernelpf.py b/tests/TestSuite_vf_l3fwd_kernelpf.py
index d5ed897a..6ed04dcc 100644
--- a/tests/TestSuite_vf_l3fwd_kernelpf.py
+++ b/tests/TestSuite_vf_l3fwd_kernelpf.py
@@ -31,8 +31,8 @@ 
 
 import os
 import time
-from test_case import TestCase
-from perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
 
 
 class TestVfL3fwdKernelPf(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_vf_l3fwd_lpm_ipv4_kernelpf.py b/tests/TestSuite_vf_l3fwd_lpm_ipv4_kernelpf.py
index 51490047..ccb232c9 100644
--- a/tests/TestSuite_vf_l3fwd_lpm_ipv4_kernelpf.py
+++ b/tests/TestSuite_vf_l3fwd_lpm_ipv4_kernelpf.py
@@ -31,8 +31,8 @@ 
 
 import os
 import time
-from test_case import TestCase
-from perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
 
 
 class TestVfL3fwdLpmIpv4KernelPf(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_vf_l3fwd_lpm_ipv4_rfc2544_kernelpf.py b/tests/TestSuite_vf_l3fwd_lpm_ipv4_rfc2544_kernelpf.py
index c37d18ad..2688f5f4 100644
--- a/tests/TestSuite_vf_l3fwd_lpm_ipv4_rfc2544_kernelpf.py
+++ b/tests/TestSuite_vf_l3fwd_lpm_ipv4_rfc2544_kernelpf.py
@@ -31,8 +31,8 @@ 
 
 import os
 import time
-from test_case import TestCase
-from perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
 
 
 class TestVfL3fwdLpmIpv4Rfc2544KernelPf(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_vf_l3fwd_lpm_ipv6_kernelpf.py b/tests/TestSuite_vf_l3fwd_lpm_ipv6_kernelpf.py
index c7cb1b6c..9f99a63b 100644
--- a/tests/TestSuite_vf_l3fwd_lpm_ipv6_kernelpf.py
+++ b/tests/TestSuite_vf_l3fwd_lpm_ipv6_kernelpf.py
@@ -31,8 +31,8 @@ 
 
 import os
 import time
-from test_case import TestCase
-from perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
+from framework.test_case import TestCase
+from .perf_test_base import PerfTestBase, IP_TYPE, MATCH_MODE, SUITE_TYPE, VF_L3FWD_NIC_SUPPORT
 
 
 class TestVfL3fwdLpmIpv6KernelPf(TestCase, PerfTestBase):
diff --git a/tests/TestSuite_vf_macfilter.py b/tests/TestSuite_vf_macfilter.py
index b3035603..49ea9c86 100644
--- a/tests/TestSuite_vf_macfilter.py
+++ b/tests/TestSuite_vf_macfilter.py
@@ -32,9 +32,9 @@ 
 import re
 import time
 
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 VM_CORES_MASK = 'all'
 
diff --git a/tests/TestSuite_vf_offload.py b/tests/TestSuite_vf_offload.py
index 4a16134b..1431414a 100644
--- a/tests/TestSuite_vf_offload.py
+++ b/tests/TestSuite_vf_offload.py
@@ -33,14 +33,14 @@  import re
 import time
 import string
 
-import utils
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from utils import RED, GREEN
-from net_device import NetDevice
-from crb import Crb
-from settings import HEADER_SIZE
+import framework.utils as utils
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.utils import RED, GREEN
+from nics.net_device import NetDevice
+from framework.crb import Crb
+from framework.settings import HEADER_SIZE
 VM_CORES_MASK = 'all'
 DEFAULT_MTU = 1500
 TSO_MTU = 9000
diff --git a/tests/TestSuite_vf_packet_rxtx.py b/tests/TestSuite_vf_packet_rxtx.py
index faf9c402..e3522c0d 100644
--- a/tests/TestSuite_vf_packet_rxtx.py
+++ b/tests/TestSuite_vf_packet_rxtx.py
@@ -32,10 +32,10 @@ 
 import re
 import time
 
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 
 VM_CORES_MASK = 'all'
 
diff --git a/tests/TestSuite_vf_port_start_stop.py b/tests/TestSuite_vf_port_start_stop.py
index de67a67c..8adb699e 100644
--- a/tests/TestSuite_vf_port_start_stop.py
+++ b/tests/TestSuite_vf_port_start_stop.py
@@ -32,10 +32,10 @@ 
 import re
 import time
 
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 VM_CORES_MASK = 'all'
 
 class TestVfPortStartStop(TestCase):
diff --git a/tests/TestSuite_vf_rss.py b/tests/TestSuite_vf_rss.py
index 4e48163b..7db9fd20 100644
--- a/tests/TestSuite_vf_rss.py
+++ b/tests/TestSuite_vf_rss.py
@@ -42,9 +42,9 @@  reta_lines = []
 
 # Use scapy to send packets with different source and dest ip.
 # and collect the hash result of five tuple and the queue id.
-from test_case import TestCase
-from pmd_output import PmdOutput
-from virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.virt_common import VM
 
 
 class TestVfRss(TestCase):
diff --git a/tests/TestSuite_vf_single_core_perf.py b/tests/TestSuite_vf_single_core_perf.py
index d40547cd..a1d1e0ce 100644
--- a/tests/TestSuite_vf_single_core_perf.py
+++ b/tests/TestSuite_vf_single_core_perf.py
@@ -32,15 +32,15 @@ 
 DPDK Test suite.
 """
 
-import utils
+import framework.utils as utils
 import json
 import os
-from test_case import TestCase
-from settings import HEADER_SIZE, UPDATE_EXPECTED, load_global_setting
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE, UPDATE_EXPECTED, load_global_setting
+from framework.pmd_output import PmdOutput
 from copy import deepcopy
-import rst
-from pktgen import PacketGeneratorHelper
+import framework.rst as rst
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVfSingleCorePerf(TestCase):
diff --git a/tests/TestSuite_vf_smoke.py b/tests/TestSuite_vf_smoke.py
index ac627aa3..7d0713e1 100644
--- a/tests/TestSuite_vf_smoke.py
+++ b/tests/TestSuite_vf_smoke.py
@@ -29,14 +29,14 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from packet import Packet
-from pmd_output import PmdOutput
-from test_case import TestCase
-from smoke_base import SmokeTest
-from smoke_base import JUMBO_FRAME_LENGTH
-from smoke_base import JUMBO_FRAME_MTU
-from smoke_base import DEFAULT_MTU_VALUE
-from smoke_base import LAUNCH_QUEUE
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.test_case import TestCase
+from .smoke_base import SmokeTest
+from .smoke_base import JUMBO_FRAME_LENGTH
+from .smoke_base import JUMBO_FRAME_MTU
+from .smoke_base import DEFAULT_MTU_VALUE
+from .smoke_base import LAUNCH_QUEUE
 
 VF_MAC_ADDR = '00:11:22:33:44:55'
 
diff --git a/tests/TestSuite_vf_to_vf_nic_bridge.py b/tests/TestSuite_vf_to_vf_nic_bridge.py
index b7b749bc..d06630b0 100644
--- a/tests/TestSuite_vf_to_vf_nic_bridge.py
+++ b/tests/TestSuite_vf_to_vf_nic_bridge.py
@@ -34,13 +34,13 @@  Test vf to vf nic bridge
 """
 
 import re
-import utils
+import framework.utils as utils
 import time
 import pdb
 
-from test_case import TestCase
-from virt_common import VM
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.virt_common import VM
+from framework.pmd_output import PmdOutput
 
 VF_NUMS_ON_ONE_PF = 2
 VF_TEMP_MAC = "52:54:12:45:67:1%d"
diff --git a/tests/TestSuite_vf_vlan.py b/tests/TestSuite_vf_vlan.py
index 28650143..3d417033 100644
--- a/tests/TestSuite_vf_vlan.py
+++ b/tests/TestSuite_vf_vlan.py
@@ -32,11 +32,11 @@ 
 import re
 import time
 
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
-from settings import get_nic_name
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.settings import get_nic_name
 import random
 
 VM_CORES_MASK = 'all'
diff --git a/tests/TestSuite_vhost_1024_ethports.py b/tests/TestSuite_vhost_1024_ethports.py
index 5eb89c3b..3b20f3e0 100644
--- a/tests/TestSuite_vhost_1024_ethports.py
+++ b/tests/TestSuite_vhost_1024_ethports.py
@@ -34,8 +34,8 @@  DPDK Test suite.
 Basic test for launch vhost with 1024 ethports
 """
 
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 
 class TestVhost1024Ethports(TestCase):
diff --git a/tests/TestSuite_vhost_cbdma.py b/tests/TestSuite_vhost_cbdma.py
index 16fef645..a0abe6b0 100644
--- a/tests/TestSuite_vhost_cbdma.py
+++ b/tests/TestSuite_vhost_cbdma.py
@@ -42,16 +42,16 @@  Here is an example:
  $ ./testpmd -c f -n 4 \
    --vdev 'net_vhost0,iface=/tmp/s0,queues=1,dmas=[txq0@80:04.0],dmathr=1024'
 """
-import rst, json
+import framework.rst as rst, json
 import os
 import re
 import time
-from test_case import TestCase
-from settings import HEADER_SIZE
-from packet import Packet
-from pktgen import PacketGeneratorHelper
-from pmd_output import PmdOutput
-from settings import UPDATE_EXPECTED, load_global_setting
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.pmd_output import PmdOutput
+from framework.settings import UPDATE_EXPECTED, load_global_setting
 from copy import deepcopy
 
 
diff --git a/tests/TestSuite_vhost_event_idx_interrupt.py b/tests/TestSuite_vhost_event_idx_interrupt.py
index 6179dd1c..d0939d01 100644
--- a/tests/TestSuite_vhost_event_idx_interrupt.py
+++ b/tests/TestSuite_vhost_event_idx_interrupt.py
@@ -34,11 +34,11 @@  DPDK Test suite.
 Vhost event idx interrupt need test with l3fwd-power sample
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
-from virt_common import VM
-from test_case import TestCase
+from framework.virt_common import VM
+from framework.test_case import TestCase
 
 
 class TestVhostEventIdxInterrupt(TestCase):
diff --git a/tests/TestSuite_vhost_multi_queue_qemu.py b/tests/TestSuite_vhost_multi_queue_qemu.py
index 01d5826b..72294fa7 100644
--- a/tests/TestSuite_vhost_multi_queue_qemu.py
+++ b/tests/TestSuite_vhost_multi_queue_qemu.py
@@ -36,13 +36,13 @@  Vhost PVP performance using Qemu test suite.
 """
 import re
 import time
-import utils
-from test_case import TestCase
-from settings import HEADER_SIZE
-from virt_common import VM
-from packet import Packet
-from pmd_output import PmdOutput
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.virt_common import VM
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVhostMultiQueueQemu(TestCase):
diff --git a/tests/TestSuite_vhost_pmd_xstats.py b/tests/TestSuite_vhost_pmd_xstats.py
index 016348d1..8934d438 100644
--- a/tests/TestSuite_vhost_pmd_xstats.py
+++ b/tests/TestSuite_vhost_pmd_xstats.py
@@ -36,14 +36,14 @@  vhost pmd xstats test suite.
 """
 import re
 import time
-import utils
+import framework.utils as utils
 import datetime
 import copy
-from test_case import TestCase
-from settings import HEADER_SIZE
-from qemu_kvm import QEMUKvm
-from packet import Packet
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.qemu_kvm import QEMUKvm
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
 ETHER_JUMBO_FRAME_MTU = 9000
 DEFAULT_JUMBO_FRAME_MTU = 1500
 
diff --git a/tests/TestSuite_vhost_user_interrupt.py b/tests/TestSuite_vhost_user_interrupt.py
index e64a4c14..0ed6f12d 100644
--- a/tests/TestSuite_vhost_user_interrupt.py
+++ b/tests/TestSuite_vhost_user_interrupt.py
@@ -34,10 +34,10 @@  DPDK Test suite.
 Vhost enqueue interrupt need test with l3fwd-power sample
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
-from test_case import TestCase
+from framework.test_case import TestCase
 
 
 class TestVhostUserInterrupt(TestCase):
diff --git a/tests/TestSuite_vhost_user_live_migration.py b/tests/TestSuite_vhost_user_live_migration.py
index f73411e5..7b9f175b 100644
--- a/tests/TestSuite_vhost_user_live_migration.py
+++ b/tests/TestSuite_vhost_user_live_migration.py
@@ -31,11 +31,11 @@ 
 
 import re
 import time
-import utils
-from virt_common import VM
-from test_case import TestCase
-from config import UserConf
-from exception import VirtDutInitException
+import framework.utils as utils
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.config import UserConf
+from framework.exception import VirtDutInitException
 
 
 class TestVhostUserLiveMigration(TestCase):
diff --git a/tests/TestSuite_vhost_virtio_pmd_interrupt.py b/tests/TestSuite_vhost_virtio_pmd_interrupt.py
index 675a15ee..64bcddd5 100644
--- a/tests/TestSuite_vhost_virtio_pmd_interrupt.py
+++ b/tests/TestSuite_vhost_virtio_pmd_interrupt.py
@@ -34,13 +34,13 @@  DPDK Test suite.
 vhost virtio pmd interrupt need test with l3fwd-power sample
 """
 
-import utils
+import framework.utils as utils
 import time
 import re
-from virt_common import VM
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVhostVirtioPmdInterrupt(TestCase):
diff --git a/tests/TestSuite_vhost_virtio_user_interrupt.py b/tests/TestSuite_vhost_virtio_user_interrupt.py
index 1c4a5a98..e0136de2 100644
--- a/tests/TestSuite_vhost_virtio_user_interrupt.py
+++ b/tests/TestSuite_vhost_virtio_user_interrupt.py
@@ -36,8 +36,8 @@  Virtio-user interrupt need test with l3fwd-power sample
 
 import re
 import time
-import utils
-from test_case import TestCase
+import framework.utils as utils
+from framework.test_case import TestCase
 
 
 class TestVirtioUserInterrupt(TestCase):
diff --git a/tests/TestSuite_virtio_event_idx_interrupt.py b/tests/TestSuite_virtio_event_idx_interrupt.py
index 37634f05..18cbc4a4 100644
--- a/tests/TestSuite_virtio_event_idx_interrupt.py
+++ b/tests/TestSuite_virtio_event_idx_interrupt.py
@@ -34,13 +34,13 @@  DPDK Test suite.
 Virtio idx interrupt need test with l3fwd-power sample
 """
 
-import utils
+import framework.utils as utils
 import time
 import _thread
 import re
-from virt_common import VM
-from test_case import TestCase
-from pktgen import PacketGeneratorHelper
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVirtioIdxInterrupt(TestCase):
diff --git a/tests/TestSuite_virtio_ipsec_cryptodev_func.py b/tests/TestSuite_virtio_ipsec_cryptodev_func.py
index ec610dde..a2ce9cdb 100644
--- a/tests/TestSuite_virtio_ipsec_cryptodev_func.py
+++ b/tests/TestSuite_virtio_ipsec_cryptodev_func.py
@@ -33,14 +33,14 @@  DPDK Test suite
 Test DPDK vhost + virtio scenarios
 """
 import os
-import utils
+import framework.utils as utils
 import time
 import subprocess
 import binascii
-from test_case import TestCase
-from qemu_kvm import QEMUKvm
-import cryptodev_common as cc
-from packet import Packet
+from framework.test_case import TestCase
+from framework.qemu_kvm import QEMUKvm
+import tests.cryptodev_common as cc
+from framework.packet import Packet
 
 class VirtioCryptodevIpsecTest(TestCase):
     def set_up_all(self):
diff --git a/tests/TestSuite_virtio_perf_cryptodev_func.py b/tests/TestSuite_virtio_perf_cryptodev_func.py
index 506dd5a7..6719fdc5 100644
--- a/tests/TestSuite_virtio_perf_cryptodev_func.py
+++ b/tests/TestSuite_virtio_perf_cryptodev_func.py
@@ -33,11 +33,11 @@  DPDK Test suite
 Test DPDK vhost + virtio scenarios
 """
 import os
-import utils
+import framework.utils as utils
 import subprocess
-from test_case import TestCase
-from qemu_kvm import QEMUKvm
-import cryptodev_common as cc
+from framework.test_case import TestCase
+from framework.qemu_kvm import QEMUKvm
+import tests.cryptodev_common as cc
 
 class VirtioCryptodevPerfTest(TestCase):
     def set_up_all(self):
diff --git a/tests/TestSuite_virtio_pvp_regression.py b/tests/TestSuite_virtio_pvp_regression.py
index 8e04ba5a..b3dc098a 100644
--- a/tests/TestSuite_virtio_pvp_regression.py
+++ b/tests/TestSuite_virtio_pvp_regression.py
@@ -43,11 +43,11 @@  qemu =
 """
 import re
 import time
-import utils
-from test_case import TestCase
-from settings import HEADER_SIZE
-from virt_common import VM
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.virt_common import VM
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVirtioPVPRegression(TestCase):
diff --git a/tests/TestSuite_virtio_smoke.py b/tests/TestSuite_virtio_smoke.py
index b7391b77..eec785f9 100644
--- a/tests/TestSuite_virtio_smoke.py
+++ b/tests/TestSuite_virtio_smoke.py
@@ -34,8 +34,8 @@  DPDK Test suite.
 """
 
 import re
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 DEFAULT_MTU = 1500
 TSO_MTU = 9000
 
diff --git a/tests/TestSuite_virtio_unit_cryptodev_func.py b/tests/TestSuite_virtio_unit_cryptodev_func.py
index bf96b62f..088872cc 100644
--- a/tests/TestSuite_virtio_unit_cryptodev_func.py
+++ b/tests/TestSuite_virtio_unit_cryptodev_func.py
@@ -35,11 +35,11 @@  Test DPDK vhost + virtio scenarios
 """
 
 import os
-import utils
+import framework.utils as utils
 import subprocess
-from test_case import TestCase
-from qemu_kvm import QEMUKvm
-import cryptodev_common as cc
+from framework.test_case import TestCase
+from framework.qemu_kvm import QEMUKvm
+import tests.cryptodev_common as cc
 
 class VirtioCryptodevUnitTest(TestCase):
     def set_up_all(self):
diff --git a/tests/TestSuite_virtio_user_as_exceptional_path.py b/tests/TestSuite_virtio_user_as_exceptional_path.py
index 3d54441c..e35a0764 100644
--- a/tests/TestSuite_virtio_user_as_exceptional_path.py
+++ b/tests/TestSuite_virtio_user_as_exceptional_path.py
@@ -36,11 +36,11 @@  virtio user as exception path test suite.
 """
 import re
 import time
-import utils
-from test_case import TestCase
-from settings import HEADER_SIZE
-import vhost_peer_conf as peer
-from pktgen import PacketGeneratorHelper
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+import tests.vhost_peer_conf as peer
+from framework.pktgen import PacketGeneratorHelper
 
 class TestVirtioUserAsExceptionalPath(TestCase):
 
diff --git a/tests/TestSuite_virtio_user_for_container_networking.py b/tests/TestSuite_virtio_user_for_container_networking.py
index 0fca14ab..43f4f44f 100644
--- a/tests/TestSuite_virtio_user_for_container_networking.py
+++ b/tests/TestSuite_virtio_user_for_container_networking.py
@@ -34,11 +34,11 @@  DPDK Test suite.
 Virtio user for container networking
 """
 
-import utils
+import framework.utils as utils
 import time
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVirtioUserForContainer(TestCase):
diff --git a/tests/TestSuite_vlan.py b/tests/TestSuite_vlan.py
index ec4cca7b..736d7b84 100644
--- a/tests/TestSuite_vlan.py
+++ b/tests/TestSuite_vlan.py
@@ -37,13 +37,13 @@  Test the support of VLAN Offload Features by Poll Mode Drivers.
 
 """
 
-import utils
+import framework.utils as utils
 import time
 
 
-from test_case import TestCase
-from pmd_output import PmdOutput
-from packet import Packet
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.packet import Packet
 
 
 class TestVlan(TestCase):
diff --git a/tests/TestSuite_vlan_ethertype_config.py b/tests/TestSuite_vlan_ethertype_config.py
index 514bdd1f..f5f69ddd 100644
--- a/tests/TestSuite_vlan_ethertype_config.py
+++ b/tests/TestSuite_vlan_ethertype_config.py
@@ -37,17 +37,17 @@  Test the support of VLAN Offload Features by Poll Mode Drivers.
 
 """
 
-import dts
+import framework.dts as dts
 import time
-import utils
+import framework.utils as utils
 
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 from scapy.utils import struct, socket, wrpcap, rdpcap
 from scapy.layers.inet import Ether, IP, TCP, UDP, ICMP
 from scapy.layers.l2 import Dot1Q, ARP, GRE
-from settings import DPDK_RXMODE_SETTING
-from settings import load_global_setting
+from framework.settings import DPDK_RXMODE_SETTING
+from framework.settings import load_global_setting
 
 import random
 MAX_VLAN = 4095
diff --git a/tests/TestSuite_vm2vm_virtio_net_perf.py b/tests/TestSuite_vm2vm_virtio_net_perf.py
index 0ec542af..b11dacae 100644
--- a/tests/TestSuite_vm2vm_virtio_net_perf.py
+++ b/tests/TestSuite_vm2vm_virtio_net_perf.py
@@ -42,10 +42,10 @@  import re
 import time
 import string
 import random
-import utils
-from virt_common import VM
-from test_case import TestCase
-from pmd_output import PmdOutput
+import framework.utils as utils
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 
 class TestVM2VMVirtioNetPerf(TestCase):
diff --git a/tests/TestSuite_vm2vm_virtio_pmd.py b/tests/TestSuite_vm2vm_virtio_pmd.py
index 44f17a36..6ff7fe30 100644
--- a/tests/TestSuite_vm2vm_virtio_pmd.py
+++ b/tests/TestSuite_vm2vm_virtio_pmd.py
@@ -40,11 +40,11 @@  About mergeable path check the large packet payload.
 """
 import re
 import time
-import utils
-from virt_common import VM
-from test_case import TestCase
-from packet import Packet
-from pmd_output import PmdOutput
+import framework.utils as utils
+from framework.virt_common import VM
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
 
 class TestVM2VMVirtioPMD(TestCase):
     def set_up_all(self):
diff --git a/tests/TestSuite_vm2vm_virtio_user.py b/tests/TestSuite_vm2vm_virtio_user.py
index bd1c320e..d6ab38c4 100644
--- a/tests/TestSuite_vm2vm_virtio_user.py
+++ b/tests/TestSuite_vm2vm_virtio_user.py
@@ -40,10 +40,10 @@  mergeable, non-mergeable path test
 """
 import re
 import time
-import utils
-from test_case import TestCase
-from packet import Packet
-from pmd_output import PmdOutput
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
 
 
 class TestVM2VMVirtioUser(TestCase):
diff --git a/tests/TestSuite_vm_hotplug.py b/tests/TestSuite_vm_hotplug.py
index f403d40e..ddee4188 100644
--- a/tests/TestSuite_vm_hotplug.py
+++ b/tests/TestSuite_vm_hotplug.py
@@ -39,9 +39,9 @@  Test some vm hotplug function with vfio
 import os
 import re
 import time
-from qemu_kvm import QEMUKvm
-from test_case import TestCase
-from pmd_output import PmdOutput
+from framework.qemu_kvm import QEMUKvm
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
 
 VM_CORES_MASK = 'all'
 
diff --git a/tests/TestSuite_vm_power_manager.py b/tests/TestSuite_vm_power_manager.py
index fca122bb..479d1267 100644
--- a/tests/TestSuite_vm_power_manager.py
+++ b/tests/TestSuite_vm_power_manager.py
@@ -35,11 +35,11 @@  VM power manager test suite.
 """
 
 import re
-import utils
-from test_case import TestCase
-from etgen import IxiaPacketGenerator
-from settings import HEADER_SIZE
-from qemu_libvirt import LibvirtKvm
+import framework.utils as utils
+from framework.test_case import TestCase
+from framework.etgen import IxiaPacketGenerator
+from framework.settings import HEADER_SIZE
+from framework.qemu_libvirt import LibvirtKvm
 
 
 class TestVmPowerManager(TestCase, IxiaPacketGenerator):
diff --git a/tests/TestSuite_vm_pw_mgmt_policy.py b/tests/TestSuite_vm_pw_mgmt_policy.py
index f074f6d7..7eac19db 100644
--- a/tests/TestSuite_vm_pw_mgmt_policy.py
+++ b/tests/TestSuite_vm_pw_mgmt_policy.py
@@ -44,13 +44,13 @@  from datetime import datetime, timedelta
 from copy import deepcopy
 from pprint import pformat
 
-from utils import create_mask as dts_create_mask
-from test_case import TestCase
-from pmd_output import PmdOutput
-from qemu_libvirt import LibvirtKvm
-from pktgen import TRANSMIT_CONT
-from exception import VerifyFailure
-from packet import Packet
+from framework.utils import create_mask as dts_create_mask
+from framework.test_case import TestCase
+from framework.pmd_output import PmdOutput
+from framework.qemu_libvirt import LibvirtKvm
+from framework.pktgen import TRANSMIT_CONT
+from framework.exception import VerifyFailure
+from framework.packet import Packet
 
 
 class TestVmPwMgmtPolicy(TestCase):
diff --git a/tests/TestSuite_vmdq.py b/tests/TestSuite_vmdq.py
index 3f2ccde2..1ccd88b2 100644
--- a/tests/TestSuite_vmdq.py
+++ b/tests/TestSuite_vmdq.py
@@ -35,13 +35,13 @@  DPDK Test suite.
 Tests for vmdq.
 
 """
-import utils
+import framework.utils as utils
 import os
 import re
-from test_case import TestCase
+from framework.test_case import TestCase
 from time import sleep
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVmdq(TestCase):
diff --git a/tests/TestSuite_vmdq_dcb.py b/tests/TestSuite_vmdq_dcb.py
index 5f0da0fb..4dbecff8 100644
--- a/tests/TestSuite_vmdq_dcb.py
+++ b/tests/TestSuite_vmdq_dcb.py
@@ -36,13 +36,13 @@  DPDK Test suite.
 Test  example vmdq_dcb.
 
 """
-import utils
+import framework.utils as utils
 import os
 import re
 import random
-from test_case import TestCase
-from settings import HEADER_SIZE
-from pktgen import PacketGeneratorHelper
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE
+from framework.pktgen import PacketGeneratorHelper
 
 
 class TestVmdqDcb(TestCase):
diff --git a/tests/TestSuite_vswitch_sample_cbdma.py b/tests/TestSuite_vswitch_sample_cbdma.py
index 08422ea3..bc301139 100644
--- a/tests/TestSuite_vswitch_sample_cbdma.py
+++ b/tests/TestSuite_vswitch_sample_cbdma.py
@@ -33,16 +33,16 @@ 
 DPDK Test suite.
 """
 
-import utils
+import framework.utils as utils
 import re
 import time
 import os
-from test_case import TestCase
-from packet import Packet
-from pktgen import PacketGeneratorHelper
-from pmd_output import PmdOutput
-from virt_common import VM
-from settings import HEADER_SIZE
+from framework.test_case import TestCase
+from framework.packet import Packet
+from framework.pktgen import PacketGeneratorHelper
+from framework.pmd_output import PmdOutput
+from framework.virt_common import VM
+from framework.settings import HEADER_SIZE
 import random
 import string
 
diff --git a/tests/TestSuite_vxlan.py b/tests/TestSuite_vxlan.py
index fdb6616d..4a7520e2 100644
--- a/tests/TestSuite_vxlan.py
+++ b/tests/TestSuite_vxlan.py
@@ -36,13 +36,13 @@  Test VXLAN behaviour in DPDK.
 
 """
 
-import utils
+import framework.utils as utils
 import string
 import re
 import time
 import os
-from pmd_output import PmdOutput
-from packet import IncreaseIP, IncreaseIPv6
+from framework.pmd_output import PmdOutput
+from framework.packet import IncreaseIP, IncreaseIPv6
 from random import randint
 
 from scapy.utils import wrpcap, rdpcap
@@ -55,10 +55,10 @@  from scapy.sendrecv import sniff
 from scapy.config import conf
 from scapy.route import *
 
-from test_case import TestCase
-from settings import HEADER_SIZE, FOLDERS
-from etgen import IxiaPacketGenerator
-import packet
+from framework.test_case import TestCase
+from framework.settings import HEADER_SIZE, FOLDERS
+from framework.etgen import IxiaPacketGenerator
+import framework.packet as packet
 
 #
 #
diff --git a/tests/TestSuite_vxlan_gpe_support_in_i40e.py b/tests/TestSuite_vxlan_gpe_support_in_i40e.py
index b5022540..a17b790a 100644
--- a/tests/TestSuite_vxlan_gpe_support_in_i40e.py
+++ b/tests/TestSuite_vxlan_gpe_support_in_i40e.py
@@ -36,17 +36,17 @@  Test VXLAN-GPE behaviour in DPDK.
 
 """
 
-import utils
+import framework.utils as utils
 import os
 import re
-from pmd_output import PmdOutput
+from framework.pmd_output import PmdOutput
 from scapy.utils import wrpcap, rdpcap
 from scapy.layers.inet import Ether, IP, UDP
 from scapy.layers.l2 import Dot1Q
 from scapy.layers.vxlan import VXLAN
 from scapy.config import conf
-from test_case import TestCase
-from settings import FOLDERS
+from framework.test_case import TestCase
+from framework.settings import FOLDERS
 
 #
 #
diff --git a/tests/__init__.py b/tests/__init__.py
new file mode 100644
index 00000000..ae0043b7
--- /dev/null
+++ b/tests/__init__.py
@@ -0,0 +1,30 @@ 
+#!/usr/bin/python3
+# BSD LICENSE
+#
+# Copyright (c) 2021 PANTHEON.tech s.r.o.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of PANTHEON.tech s.r.o. nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/tests/bonding.py b/tests/bonding.py
index b5fc45fc..1df1feda 100644
--- a/tests/bonding.py
+++ b/tests/bonding.py
@@ -36,14 +36,14 @@  import struct
 import socket
 from socket import htonl
 
-from packet import Packet, TMP_PATH
+from framework.packet import Packet, TMP_PATH
 from scapy.sendrecv import sendp
 from scapy.utils import wrpcap
 
-import utils
-from exception import TimeoutException, VerifyFailure
-from pmd_output import PmdOutput
-from settings import HEADER_SIZE
+import framework.utils as utils
+from framework.exception import TimeoutException, VerifyFailure
+from framework.pmd_output import PmdOutput
+from framework.settings import HEADER_SIZE
 
 # define bonding mode
 MODE_ROUND_ROBIN = 0
diff --git a/tests/compress_common.py b/tests/compress_common.py
index 4afdcdef..c585af5d 100644
--- a/tests/compress_common.py
+++ b/tests/compress_common.py
@@ -32,8 +32,8 @@ 
 
 import os
 import re
-import utils
-from config import SuiteConf
+import framework.utils as utils
+from framework.config import SuiteConf
 
 conf = SuiteConf('compressdev_sample')
 
diff --git a/tests/cryptodev_common.py b/tests/cryptodev_common.py
index bb725897..f2ff3c3c 100644
--- a/tests/cryptodev_common.py
+++ b/tests/cryptodev_common.py
@@ -29,8 +29,8 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from net_device import GetNicObj
-from config import SuiteConf
+from nics.net_device import GetNicObj
+from framework.config import SuiteConf
 
 conf = SuiteConf('cryptodev_sample')
 
diff --git a/tests/flexible_common.py b/tests/flexible_common.py
index 9df62caa..19a4a358 100644
--- a/tests/flexible_common.py
+++ b/tests/flexible_common.py
@@ -30,8 +30,8 @@ 
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
 import time
-from packet import Packet
-from pmd_output import PmdOutput
+from framework.packet import Packet
+from framework.pmd_output import PmdOutput
 import re
 
 
diff --git a/tests/perf_test_base.py b/tests/perf_test_base.py
index 02a73eec..ee09915e 100644
--- a/tests/perf_test_base.py
+++ b/tests/perf_test_base.py
@@ -36,7 +36,7 @@  import os
 import re
 import time
 import traceback
-import texttable
+import framework.texttable as texttable
 import json
 import numpy as np
 from enum import Enum, unique
@@ -44,12 +44,12 @@  from pprint import pformat
 from itertools import product
 from copy import deepcopy
 
-from config import SuiteConf
-from packet import Packet
-from pktgen import TRANSMIT_CONT, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK
-from utils import convert_int2ip, convert_ip2int
-from exception import VerifyFailure
-import utils
+from framework.config import SuiteConf
+from framework.packet import Packet
+from framework.pktgen import TRANSMIT_CONT, PKTGEN_TREX, PKTGEN_IXIA, PKTGEN_IXIA_NETWORK
+from framework.utils import convert_int2ip, convert_ip2int
+from framework.exception import VerifyFailure
+import framework.utils as utils
 
 
 VF_L3FWD_NIC_SUPPORT = frozenset((
diff --git a/tests/rte_flow_common.py b/tests/rte_flow_common.py
index 591aa5a1..348750bf 100644
--- a/tests/rte_flow_common.py
+++ b/tests/rte_flow_common.py
@@ -32,8 +32,8 @@ 
 import json
 import time
 import re
-from utils import GREEN, RED
-from packet import Packet
+from framework.utils import GREEN, RED
+from framework.packet import Packet
 
 CVL_TXQ_RXQ_NUMBER = 16
 
diff --git a/tests/smoke_base.py b/tests/smoke_base.py
index 0d7046b0..f992f068 100644
--- a/tests/smoke_base.py
+++ b/tests/smoke_base.py
@@ -31,7 +31,7 @@ 
 
 import re
 import time
-from settings import HEADER_SIZE
+from framework.settings import HEADER_SIZE
 
 JUMBO_FRAME_MTU = 9600
 DEFAULT_MTU_VALUE = 1500
diff --git a/tests/vhost_peer_conf.py b/tests/vhost_peer_conf.py
index 59b34956..c8802277 100644
--- a/tests/vhost_peer_conf.py
+++ b/tests/vhost_peer_conf.py
@@ -29,7 +29,7 @@ 
 # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
-from config import UserConf
+from framework.config import UserConf
 
 conf_file = 'conf/vhost_peer_conf.cfg'
 conf_peer = UserConf(conf_file)
diff --git a/tools/__init__.py b/tools/__init__.py
new file mode 100644
index 00000000..ae0043b7
--- /dev/null
+++ b/tools/__init__.py
@@ -0,0 +1,30 @@ 
+#!/usr/bin/python3
+# BSD LICENSE
+#
+# Copyright (c) 2021 PANTHEON.tech s.r.o.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+#
+#   * Redistributions of source code must retain the above copyright
+#     notice, this list of conditions and the following disclaimer.
+#   * Redistributions in binary form must reproduce the above copyright
+#     notice, this list of conditions and the following disclaimer in
+#     the documentation and/or other materials provided with the
+#     distribution.
+#   * Neither the name of PANTHEON.tech s.r.o. nor the names of its
+#     contributors may be used to endorse or promote products derived
+#     from this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/tools/dump_case.py b/tools/dump_case.py
index 22c79d2c..d4633875 100755
--- a/tools/dump_case.py
+++ b/tools/dump_case.py
@@ -13,9 +13,9 @@  DTS_FRAMEWORK = DTS_PATH + '/framework'
 sys.path.append(DTS_SUITES)
 sys.path.append(DTS_FRAMEWORK)
 
-import dts
-from test_case import TestCase
-from utils import pprint
+import framework.dts as dts
+from framework.test_case import TestCase
+from framework.utils import pprint
 
 
 def get_subclasses(module, clazz):
diff --git a/tools/setup.py b/tools/setup.py
index c0852f21..516d5031 100755
--- a/tools/setup.py
+++ b/tools/setup.py
@@ -22,10 +22,10 @@  DTS_IXIA_CFG = DTS_PATH + '/conf/ixia.cfg'
 sys.path.append(DTS_FRAMEWORK)
 sys.path.append(DTS_TOOLS)
 
-import utils
-from parse_opt import Option
-from settings import NICS
-from utils import GREEN, RED
+import framework.utils as utils
+from .parse_opt import Option
+from framework.settings import NICS
+from framework.utils import GREEN, RED
 
 global def_opt
 global dut_ip