diff --git a/test_set/cvp-sanity/tests/test_packet_checker.py b/test_set/cvp-sanity/tests/test_packet_checker.py
index 0b574cf..f534aad 100644
--- a/test_set/cvp-sanity/tests/test_packet_checker.py
+++ b/test_set/cvp-sanity/tests/test_packet_checker.py
@@ -2,14 +2,32 @@
 import json
 import utils
 import logging
+import itertools
+from functools import lru_cache
 
-def is_deb_in_exception(inconsistency_rule, package_name, error_node_list):
-    short_names_in_error_nodes = [n.split('.')[0] for n in error_node_list]
-    for node, excluded_packages in inconsistency_rule.items():
-        if package_name in excluded_packages and node in short_names_in_error_nodes:
+
+@lru_cache(maxsize=32)
+def targeted_minions(target):
+    """
+    Returns nodes associated with salt target
+    :param target: str, salt target in COMPOUND notation like I@nova:server
+    More here https://docs.saltproject.io/en/latest/topics/targeting/compound.html
+    :return: list of nodes or []
+    """
+    salt_client = pytest.local_salt_client
+    return list(salt_client.test_ping(
+        tgt=target,
+        expr_form='compound'))
+
+
+def is_deb_in_exception(inconsistency_rule, package_name, node_hostname):
+    for salt_target, excluded_packages in inconsistency_rule.items():
+        if package_name in excluded_packages \
+                and node_hostname in targeted_minions(salt_target):
             return True
     return False
 
+
 @pytest.mark.full
 def test_check_package_versions(local_salt_client, nodes_in_group):
     """Validate package has same versions on all the nodes.
@@ -19,73 +37,66 @@
      2) Exclude nodes without packages and exceptions
      3) Go through each package and save it with version from each node to the
         list. Mark 'No version' if package is not found.
-        If pachage name in the eception list or in inconsistency_rule, ignore it.
+        If package name in the exception list or in inconsistency_rule,
+        ignore it.
      4) Compare items in that list - they should be equal and match the amout of nodes
 
     """
-    # defines packages specific to the concrete nodes
-    inconsistency_rule = {"kvm03": ["rsync", "sysstat", "xz-utils"], "log01": ["python-elasticsearch"], "ctl01": ["python-gnocchiclient", "python-ujson"]}
+    salt = local_salt_client
+    # defines packages specific to the nodes
+    inconsistency_rule = {
+        "I@backupninja:server": [
+            "rsync", "sysstat", "xz-utils"],
+        "I@elasticsearch:server": [
+            "python-elasticsearch"],
+        # PROD-30833
+        "I@octavia:manager:controller_worker:loadbalancer_topology:SINGLE": [
+            "netfilter-persistent",
+            "gunicorn",
+            "octavia-worker",
+            "octavia-health-manager",
+            "octavia-housekeeping"]
+        }
     exclude_packages = utils.get_configuration().get("skipped_packages", [])
-    group, nodes = nodes_in_group
-    packages_versions = local_salt_client.cmd(tgt="L@"+','.join(nodes),
+
+    group_name, nodes = nodes_in_group
+    packages_versions_by_nodes = salt.cmd(tgt="L@"+','.join(nodes),
                                               fun='lowpkg.list_pkgs',
                                               expr_form='compound')
     # Let's exclude cid01 and dbs01 nodes from this check
-    exclude_nodes = list(local_salt_client.test_ping(tgt="I@galera:master or I@gerrit:client",
-                                                expr_form='compound').keys())
-    # PROD-30833
-    gtw01 = local_salt_client.pillar_get(
-        param='_param:openstack_gateway_node01_hostname') or 'gtw01'
-    cluster_domain = local_salt_client.pillar_get(
-        param='_param:cluster_domain') or '.local'
-    gtw01 += '.' + cluster_domain
-    if gtw01 in nodes:
-        octavia = local_salt_client.cmd(tgt="L@" + ','.join(nodes),
-                                        fun='pillar.get',
-                                        param='octavia:manager:enabled',
-                                        expr_form='compound')
-        gtws = [gtw for gtw in list(octavia.values()) if gtw]
-        if len(gtws) == 1:
-            exclude_nodes.append(gtw01)
-            logging.info("gtw01 node is skipped in test_check_package_versions")
+    exclude_nodes = targeted_minions("I@galera:master or I@gerrit:client")
 
-    total_nodes = [i for i in nodes if i not in exclude_nodes]
+    total_nodes = [i
+                   for i in nodes
+                   if i not in exclude_nodes]
     if len(total_nodes) < 2:
         pytest.skip("Nothing to compare - only 1 node")
-    nodes_with_packages = []
-    packages_with_different_versions = []
-    packages_names = set()
 
-    for node in total_nodes:
-        if not packages_versions[node]:
-            # TODO: do not skip node
-            logging.warning("Node {} is skipped".format(node))
-            continue
-        nodes_with_packages.append(node)
-        packages_names.update(list(packages_versions[node].keys()))
+    packages_with_different_versions = dict()
+    packages_names = set(itertools.chain.from_iterable(
+        [packages_versions_by_nodes[node].keys()
+         for node in total_nodes])
+    )
+
     for deb in packages_names:
         if deb in exclude_packages:
             continue
-        diff = []
-        row = []
-        for node in nodes_with_packages:
-            if not packages_versions[node]:
-                continue
-            if deb in list(packages_versions[node].keys()):
-                diff.append(packages_versions[node][deb])
-                row.append("{}: {}".format(node, packages_versions[node][deb]))
-            else:
-                row.append("{}: No package".format(node))
 
-        if diff.count(diff[0]) < len(nodes_with_packages):
-            if not is_deb_in_exception(inconsistency_rule, deb, row):
-                row.sort()
-                row.insert(0, deb)
-                packages_with_different_versions.append(row)
+        node_and_version = [
+            (node, packages_versions_by_nodes[node].get(deb, "No package"))
+            for node in total_nodes
+            if not is_deb_in_exception(inconsistency_rule, deb, node)
+        ]
+
+        if set([version for node, version in node_and_version]).__len__() > 1:
+            packages_with_different_versions[deb] = [
+                f"{node}: {version}"
+                for node, version in node_and_version]
+
     assert len(packages_with_different_versions) == 0, (
         "Non-uniform package versions are installed on '{}' group of nodes:\n"
         "{}".format(
-            group, json.dumps(packages_with_different_versions, indent=4))
+            group_name, json.dumps(packages_with_different_versions, indent=4))
     )
 
 
@@ -117,7 +128,7 @@
 @pytest.mark.full
 def test_check_module_versions(local_salt_client, nodes_in_group):
     # defines modules specific to the concrete nodes
-    inconsistency_rule = {"ctl01": ["gnocchiclient", "ujson"], "log01": ["elasticsearch"]}
+    inconsistency_rule = {"I@elasticsearch:server": ["elasticsearch"]}
     exclude_modules = utils.get_configuration().get("skipped_modules", [])
     group, nodes = nodes_in_group
     pre_check = local_salt_client.cmd(
@@ -127,8 +138,7 @@
     if list(pre_check.values()).count('') > 0:
         pytest.skip("pip is not installed on one or more nodes")
 
-    exclude_nodes = list(local_salt_client.test_ping(tgt="I@galera:master or I@gerrit:client",
-                                                expr_form='compound').keys())
+    exclude_nodes = targeted_minions("I@galera:master or I@gerrit:client")
 
     # PROD-30833
     gtw01 = local_salt_client.pillar_get(
@@ -194,7 +204,7 @@
         param='_param:updates_mirantis_login',
         expr_form='compound')
     if not restricted_repo_enabled:
-        pytest.skip("This env doesn't required the restricted ubuntu repo")
+        pytest.skip("This env doesn't require the restricted ubuntu repo")
 
     repos_by_nodes=local_salt_client.cmd(
         tgt="*",
