diff --git a/cvp_checks/tests/__init__.py b/cvp_checks/tests/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/cvp_checks/tests/__init__.py
diff --git a/cvp_checks/tests/__init__.pyc b/cvp_checks/tests/__init__.pyc
new file mode 100644
index 0000000..c5b5b46
--- /dev/null
+++ b/cvp_checks/tests/__init__.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/conftest.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/conftest.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..9529827
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/conftest.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_contrail.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_contrail.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..12c3420
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_contrail.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_default_gateway.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_default_gateway.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..d449fb7
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_default_gateway.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_galera_cluster.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_galera_cluster.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..2dd98e0
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_galera_cluster.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_mtu.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_mtu.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..4fab58c
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_mtu.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_ntp_sync.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_ntp_sync.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..0c139d4
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_ntp_sync.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_packet_checker.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_packet_checker.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..816e78f
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_packet_checker.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_rabbit_cluster.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_rabbit_cluster.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..ff5eeb0
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_rabbit_cluster.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_repo_list.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_repo_list.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..1de85b4
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_repo_list.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_services.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_services.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..f28935a
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_services.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/__pycache__/test_single_vip.cpython-27-PYTEST.pyc b/cvp_checks/tests/__pycache__/test_single_vip.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..692eefd
--- /dev/null
+++ b/cvp_checks/tests/__pycache__/test_single_vip.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/ceph/__pycache__/test_ceph.cpython-27-PYTEST.pyc b/cvp_checks/tests/ceph/__pycache__/test_ceph.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..c0451ed
--- /dev/null
+++ b/cvp_checks/tests/ceph/__pycache__/test_ceph.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/ceph/__pycache__/test_ceph_haproxy.cpython-27-PYTEST.pyc b/cvp_checks/tests/ceph/__pycache__/test_ceph_haproxy.cpython-27-PYTEST.pyc
new file mode 100644
index 0000000..71abde3
--- /dev/null
+++ b/cvp_checks/tests/ceph/__pycache__/test_ceph_haproxy.cpython-27-PYTEST.pyc
Binary files differ
diff --git a/cvp_checks/tests/ceph/config.yaml b/cvp_checks/tests/ceph/config.yaml
new file mode 100644
index 0000000..bfc8e70
--- /dev/null
+++ b/cvp_checks/tests/ceph/config.yaml
@@ -0,0 +1,3 @@
+---
+ceph_monitors: ['ceph-003*', 'ceph-004*', 'ceph-005*']
+ceph_osd_probe_node: ['ceph-001*']
diff --git a/cvp_checks/tests/ceph/test_ceph.py b/cvp_checks/tests/ceph/test_ceph.py
new file mode 100644
index 0000000..05a61c2
--- /dev/null
+++ b/cvp_checks/tests/ceph/test_ceph.py
@@ -0,0 +1,11 @@
+from cvp_checks import utils
+
+
+def test_check_ceph_osd(local_salt_client):
+    config = utils.get_configuration(__file__)
+    osd_fail = \
+        local_salt_client.cmd(config["ceph_osd_probe_node"][0], 'cmd.run',
+                              ['ceph osd tree | grep down'])
+    assert not osd_fail.values()[0], \
+        "Some osds are in down state or ceph is not found".format(
+        osd_fail.values()[0])
diff --git a/cvp_checks/tests/ceph/test_ceph_haproxy.py b/cvp_checks/tests/ceph/test_ceph_haproxy.py
new file mode 100644
index 0000000..2f2e1e0
--- /dev/null
+++ b/cvp_checks/tests/ceph/test_ceph_haproxy.py
@@ -0,0 +1,21 @@
+from cvp_checks import utils
+
+
+def test_ceph_haproxy(local_salt_client):
+    config = utils.get_configuration(__file__)
+
+    fail = {}
+
+    for monitor in config["ceph_monitors"]:
+        monitor_info = local_salt_client.cmd(monitor, 'cmd.run',
+                                             ["echo 'show stat' | nc -U "
+                                              "/var/run/haproxy/admin.sock | "
+                                              "grep ceph_mon_radosgw_cluster"])
+
+        for name, info in monitor_info.iteritems():
+            if "OPEN" and "UP" in info:
+                continue
+            else:
+                fail[name] = info
+
+    assert not fail, "Failed monitors: {}".format(fail)
diff --git a/cvp_checks/tests/conftest.py b/cvp_checks/tests/conftest.py
new file mode 100644
index 0000000..21af490
--- /dev/null
+++ b/cvp_checks/tests/conftest.py
@@ -0,0 +1 @@
+from cvp_checks.fixtures.base import *
diff --git a/cvp_checks/tests/test_contrail.py b/cvp_checks/tests/test_contrail.py
new file mode 100644
index 0000000..16c3389
--- /dev/null
+++ b/cvp_checks/tests/test_contrail.py
@@ -0,0 +1,78 @@
+import pytest
+import json
+
+def test_contrail_compute_status(local_salt_client):
+    cs = local_salt_client.cmd(
+        'nova:compute', 'cmd.run',
+        ['contrail-status | grep -Pv \'(==|^$)\''],
+        expr_form='pillar'
+    )
+    # TODO: what if compute lacks these service unintentionally?
+    if not cs:
+        pytest.skip("Contrail services were not found on compute nodes")
+    broken_services = []
+
+    for node in cs:
+        for line in cs[node].split('\n'):
+            line = line.strip()
+            name, status = line.split(None, 1)
+            if status not in {'active'}:
+                err_msg = "{node}:{service} - {status}".format(
+                    node=node, service=name, status=status)
+                broken_services.append(err_msg)
+
+    assert not broken_services, 'Broken services: {}'.format(json.dumps(
+                                                             broken_services,
+                                                             indent=4))
+
+
+def test_contrail_node_status(local_salt_client):
+    cs = local_salt_client.cmd(
+        'opencontrail:client:analytics_node', 'cmd.run',
+        ['contrail-status | grep -Pv \'(==|^$|Disk|unix|support)\''],
+        expr_form='pillar'
+    )
+    cs.update(local_salt_client.cmd(
+        'opencontrail:control', 'cmd.run',
+        ['contrail-status | grep -Pv \'(==|^$|Disk|unix|support)\''],
+        expr_form='pillar')
+    )
+    if not cs:
+        pytest.skip("Contrail nodes were not found on compute nodes")
+    broken_services = []
+    for node in cs:
+        for line in cs[node].split('\n'):
+            line = line.strip()
+            if 'crashes/core.java.' not in line:
+                name, status = line.split(None, 1)
+            else:
+                name, status = line,'FATAL'
+            if status not in {'active', 'backup'}:
+                err_msg = "{node}:{service} - {status}".format(
+                    node=node, service=name, status=status)
+                broken_services.append(err_msg)
+
+    assert not broken_services, 'Broken services: {}'.format(json.dumps(
+                                                             broken_services,
+                                                             indent=4))
+
+
+def test_contrail_vrouter_count(local_salt_client):
+    cs = local_salt_client.cmd(
+        'nova:compute', 'cmd.run', ['contrail-status | grep -Pv \'(==|^$)\''],
+        expr_form='pillar'
+    )
+    # TODO: what if compute lacks these service unintentionally?
+    if not cs:
+        pytest.skip("Contrail services were not found on compute nodes")
+
+    actual_vrouter_count = 0
+    for node in cs:
+        for line in cs[node].split('\n'):
+            if 'contrail-vrouter-nodemgr' in line:
+                actual_vrouter_count += 1
+
+    assert actual_vrouter_count == len(cs.keys()),\
+        'The length of vRouters {} differs' \
+        ' from the length of compute nodes {}'.format(actual_vrouter_count,
+                                                      len(cs.keys()))
diff --git a/cvp_checks/tests/test_default_gateway.py b/cvp_checks/tests/test_default_gateway.py
new file mode 100644
index 0000000..57a6d7b
--- /dev/null
+++ b/cvp_checks/tests/test_default_gateway.py
@@ -0,0 +1,29 @@
+import json
+import pytest
+
+from cvp_checks import utils
+
+
+@pytest.mark.parametrize(
+    "group",
+    utils.get_groups(utils.get_configuration(__file__))
+)
+def test_check_default_gateways(local_salt_client, group):
+    config = utils.get_configuration(__file__)
+    netstat_info = local_salt_client.cmd(
+        group, 'cmd.run', ['ip r | sed -n 1p'], expr_form='pcre')
+
+    gateways = {}
+    nodes = netstat_info.keys()
+
+    for node in nodes:
+        if netstat_info[node] not in gateways:
+            gateways[netstat_info[node]] = [node]
+        else:
+            gateways[netstat_info[node]].append(node)
+
+    assert len(gateways.keys()) == 1, \
+        "There were found few gateways within group {group}: {gw}".format(
+        group=group,
+        gw=json.dumps(gateways, indent=4)
+    )
diff --git a/cvp_checks/tests/test_galera_cluster.py b/cvp_checks/tests/test_galera_cluster.py
new file mode 100644
index 0000000..d2b2d5f
--- /dev/null
+++ b/cvp_checks/tests/test_galera_cluster.py
@@ -0,0 +1,17 @@
+def test_galera_cluster_status(local_salt_client):
+    gs = local_salt_client.cmd(
+        'I@galera:*',
+        'cmd.run',
+        ['salt-call mysql.status | grep -A1 wsrep_cluster_size | tail -n1'],
+        expr_form='pillar')
+
+    size_cluster = []
+    amount = len(gs)
+
+    for item in gs.values():
+        size_cluster.append(item.split('\n')[-1].strip())
+
+    assert all(item == str(amount) for item in size_cluster), \
+        '''There found inconsistency within cloud. MySQL galera cluster
+              is probably broken, the cluster size gathered from nodes:
+              {}'''.format(gs)
diff --git a/cvp_checks/tests/test_mtu.py b/cvp_checks/tests/test_mtu.py
new file mode 100644
index 0000000..f3c3511
--- /dev/null
+++ b/cvp_checks/tests/test_mtu.py
@@ -0,0 +1,68 @@
+import pytest
+import json
+from cvp_checks import utils
+
+
+@pytest.mark.parametrize(
+    "group",
+    utils.get_groups(utils.get_configuration(__file__))
+)
+def test_mtu(local_salt_client, group):
+    config = utils.get_configuration(__file__)
+    skipped_ifaces = config["skipped_ifaces"]
+    total = {}
+    network_info = local_salt_client.cmd(
+        group, 'cmd.run', ['ls /sys/class/net/'], expr_form='pcre')
+
+    kvm_nodes = local_salt_client.cmd(
+        'salt:control', 'test.ping', expr_form='pillar').keys()
+
+    if len(network_info.keys()) < 2:
+        pytest.skip("Nothing to compare - only 1 node")
+
+    for node, ifaces_info in network_info.iteritems():
+        if node in kvm_nodes:
+            kvm_info = local_salt_client.cmd(node, 'cmd.run',
+                                             ["virsh list | "
+                                              "awk '{print $2}' | "
+                                              "xargs -n1 virsh domiflist | "
+                                              "grep -v br-pxe | grep br- | "
+                                              "awk '{print $1}'"])
+            ifaces_info = kvm_info.get(node)
+        node_ifaces = ifaces_info.split('\n')
+        ifaces = {}
+        for iface in node_ifaces:
+            for skipped_iface in skipped_ifaces:
+                if skipped_iface in iface:
+                    break
+            else:
+                iface_mtu = local_salt_client.cmd(node, 'cmd.run',
+                                                  ['cat /sys/class/'
+                                                   'net/{}/mtu'.format(iface)])
+                ifaces[iface] = iface_mtu.get(node)
+        total[node] = ifaces
+
+    nodes = []
+    mtu_data = []
+    my_set = set()
+
+    for node in total:
+        nodes.append(node)
+        my_set.update(total[node].keys())
+    for interf in my_set:
+        diff = []
+        row = []
+        for node in nodes:
+            if interf in total[node].keys():
+                diff.append(total[node][interf])
+                row.append("{}: {}".format(node, total[node][interf]))
+            else:
+                row.append("{}: No interface".format(node))
+        if diff.count(diff[0]) < len(nodes):
+            row.sort()
+            row.insert(0, interf)
+            mtu_data.append(row)
+    assert len(mtu_data) == 0, \
+        "Several problems found for {0} group: {1}".format(
+        group, json.dumps(mtu_data, indent=4))
+
diff --git a/cvp_checks/tests/test_ntp_sync.py b/cvp_checks/tests/test_ntp_sync.py
new file mode 100644
index 0000000..72ca43e
--- /dev/null
+++ b/cvp_checks/tests/test_ntp_sync.py
@@ -0,0 +1,27 @@
+import pytest
+import os
+from cvp_checks import utils
+
+
+@pytest.mark.parametrize(
+    "node",
+    utils.get_active_nodes(utils.get_configuration(__file__))
+)
+def test_ntp_sync(local_salt_client, node):
+    config = utils.get_configuration(__file__)
+    fail = {}
+
+    saltmaster_time = int(local_salt_client.cmd(
+        os.uname()[1] + '*', 'cmd.run', ['date +%s']).values()[0])
+
+    nodes_time = local_salt_client.cmd(
+        node, 'cmd.run', ['date +%s'], expr_form='pcre')
+
+    for node, time in nodes_time.iteritems():
+        if (int(time) - saltmaster_time) > config["time_deviation"] or \
+                (int(time) - saltmaster_time) < -config["time_deviation"]:
+            fail[node] = time
+
+    assert not fail, 'SaltMaster time: {}\n' \
+                     'Nodes with time mismatch:\n {}'.format(saltmaster_time,
+                                                             fail)
diff --git a/cvp_checks/tests/test_packet_checker.py b/cvp_checks/tests/test_packet_checker.py
new file mode 100644
index 0000000..79915ec
--- /dev/null
+++ b/cvp_checks/tests/test_packet_checker.py
@@ -0,0 +1,83 @@
+import pytest
+import json
+from cvp_checks import utils
+
+
+@pytest.mark.parametrize(
+    "group",
+    utils.get_groups(utils.get_configuration(__file__))
+)
+def test_check_package_versions(local_salt_client, group):
+    config = utils.get_configuration(__file__)
+
+    output = local_salt_client.cmd(group, 'lowpkg.list_pkgs', expr_form='pcre')
+
+    if len(output.keys()) < 2:
+        pytest.skip("Nothing to compare - only 1 node")
+
+    nodes = []
+    pkts_data = []
+    my_set = set()
+
+    for node in output:
+        nodes.append(node)
+        my_set.update(output[node].keys())
+
+    for deb in my_set:
+        diff = []
+        row = []
+        for node in nodes:
+            if deb in output[node].keys():
+                diff.append(output[node][deb])
+                row.append("{}: {}".format(node, output[node][deb]))
+            else:
+                row.append("{}: No package".format(node))
+        if diff.count(diff[0]) < len(nodes):
+            row.sort()
+            row.insert(0, deb)
+            pkts_data.append(row)
+    assert len(pkts_data) <= 1, \
+        "Several problems found for {0} group: {1}".format(
+        group, json.dumps(pkts_data, indent=4))
+
+
+@pytest.mark.parametrize(
+    "group",
+    utils.get_groups(utils.get_configuration(__file__))
+)
+def test_check_module_versions(local_salt_client, group):
+    config = utils.get_configuration(__file__)
+
+    pre_check = local_salt_client.cmd(
+        group, 'cmd.run', ['dpkg -l | grep "python-pip "'], expr_form='pcre')
+    if pre_check.values().count('') > 0:
+        pytest.skip("pip is not installed on one or more nodes")
+    if len(pre_check.keys()) < 2:
+        pytest.skip("Nothing to compare - only 1 node")
+    output = local_salt_client.cmd(group, 'pip.freeze', expr_form='pcre')
+
+    nodes = []
+    pkts_data = []
+    my_set = set()
+
+    for node in output:
+        nodes.append(node)
+        my_set.update([x.split("=")[0] for x in output[node]])
+        output[node] = dict([x.split("==") for x in output[node]])
+
+    for deb in my_set:
+        diff = []
+        row = []
+        for node in nodes:
+            if deb in output[node].keys():
+                diff.append(output[node][deb])
+                row.append("{}: {}".format(node, output[node][deb]))
+            else:
+                row.append("{}: No module".format(node))
+        if diff.count(diff[0]) < len(nodes):
+            row.sort()
+            row.insert(0, deb)
+            pkts_data.append(row)
+    assert len(pkts_data) <= 1, \
+        "Several problems found for {0} group: {1}".format(
+        group, json.dumps(pkts_data, indent=4))
diff --git a/cvp_checks/tests/test_rabbit_cluster.py b/cvp_checks/tests/test_rabbit_cluster.py
new file mode 100644
index 0000000..94de975
--- /dev/null
+++ b/cvp_checks/tests/test_rabbit_cluster.py
@@ -0,0 +1,43 @@
+import re
+
+
+def test_checking_rabbitmq_cluster(local_salt_client):
+    # disable config for this test
+    # it may be reintroduced in future
+    # config = utils.get_configuration(__file__)
+    # request pillar data from rmq nodes
+    rabbitmq_pillar_data = local_salt_client.cmd(
+        'rabbitmq:server', 'pillar.data',
+        ['rabbitmq:cluster'], expr_form='pillar')
+
+    # creating dictionary {node:cluster_size_for_the_node}
+    # with required cluster size for each node
+    control_dict = {}
+    required_cluster_size_dict = {}
+    for node in rabbitmq_pillar_data:
+        cluster_size_from_the_node = len(
+            rabbitmq_pillar_data[node]['rabbitmq:cluster']['members'])
+        required_cluster_size_dict.update({node: cluster_size_from_the_node})
+
+    # request actual data from rmq nodes
+    rabbit_actual_data = local_salt_client.cmd(
+        'rabbitmq:server', 'cmd.run',
+        ['rabbitmqctl cluster_status'], expr_form='pillar')
+
+    # find actual cluster size for each node
+    for node in rabbit_actual_data:
+        running_nodes_count = 0
+        for line in rabbit_actual_data[node].split('\n'):
+            if 'running_nodes' in line:
+                running_nodes_count = line.count('rabbit@')
+        # update control dictionary with values
+        # {node:actual_cluster_size_for_node}
+        if required_cluster_size_dict[node] != running_nodes_count:
+            control_dict.update({node: running_nodes_count})
+
+    assert not len(control_dict), "Inconsistency found within cloud. " \
+                                  "RabbitMQ cluster is probably broken, " \
+                                  "the cluster size for each node " \
+                                  "should be: {} but the following " \
+                                  "nodes has other values: {}".format(
+        len(required_cluster_size_dict.keys()), control_dict)
diff --git a/cvp_checks/tests/test_repo_list.py b/cvp_checks/tests/test_repo_list.py
new file mode 100644
index 0000000..6df6027
--- /dev/null
+++ b/cvp_checks/tests/test_repo_list.py
@@ -0,0 +1,43 @@
+import pytest
+from cvp_checks import utils
+
+
+@pytest.mark.parametrize(
+    "group",
+    utils.get_groups(utils.get_configuration(__file__))
+)
+def test_list_of_repo_on_nodes(local_salt_client, group):
+    info_salt = local_salt_client.cmd(
+        group, 'pillar.data', ['linux:system:repo'], expr_form='pcre')
+
+    raw_actual_info = local_salt_client.cmd(
+        group,
+        'cmd.run',
+        ['cat /etc/apt/sources.list.d/*;'
+         'cat /etc/apt/sources.list|grep deb|grep -v "#"'],
+        expr_form='pcre')
+    actual_repo_list = [item.replace('/ ', ' ')
+                        for item in raw_actual_info.values()[0].split('\n')]
+    expected_salt_data = [repo['source'].replace('/ ', ' ')
+                          for repo in info_salt.values()[0]
+                          ['linux:system:repo'].values()]
+
+    diff = {}
+    my_set = set()
+
+    my_set.update(actual_repo_list)
+    my_set.update(expected_salt_data)
+    import json
+    for repo in my_set:
+        rows = []
+        if repo not in actual_repo_list:
+            rows.append("{}: {}".format("pillars", "+"))
+            rows.append("{}: No repo".format('config'))
+            diff[repo] = rows
+        elif repo not in expected_salt_data:
+            rows.append("{}: {}".format("config", "+"))
+            rows.append("{}: No repo".format('pillars'))
+            diff[repo] = rows
+    assert len(diff) <= 1, \
+        "Several problems found for {0} group: {1}".format(
+        group, json.dumps(diff, indent=4))
diff --git a/cvp_checks/tests/test_services.py b/cvp_checks/tests/test_services.py
new file mode 100644
index 0000000..3d90218
--- /dev/null
+++ b/cvp_checks/tests/test_services.py
@@ -0,0 +1,41 @@
+import pytest
+import json
+from cvp_checks import utils
+
+
+@pytest.mark.parametrize(
+    "group",
+    utils.get_groups(utils.get_configuration(__file__))
+)
+def test_check_services(local_salt_client, group):
+    config = utils.get_configuration(__file__)
+
+    output = local_salt_client.cmd(group, 'service.get_all', expr_form='pcre')
+
+    if len(output.keys()) < 2:
+        pytest.skip("Nothing to compare - only 1 node")
+
+    nodes = []
+    pkts_data = []
+    my_set = set()
+
+    for node in output:
+        nodes.append(node)
+        my_set.update(output[node])
+
+    for srv in my_set:
+        diff = []
+        row = []
+        for node in nodes:
+            if srv in output[node]:
+                diff.append(srv)
+                row.append("{}: +".format(node))
+            else:
+                row.append("{}: No service".format(node))
+        if diff.count(diff[0]) < len(nodes):
+            row.sort()
+            row.insert(0, srv)
+            pkts_data.append(row)
+    assert len(pkts_data) <= 1, \
+        "Several problems found for {0} group: {1}".format(
+        group, json.dumps(pkts_data, indent=4))
diff --git a/cvp_checks/tests/test_single_vip.py b/cvp_checks/tests/test_single_vip.py
new file mode 100644
index 0000000..9e0f16e
--- /dev/null
+++ b/cvp_checks/tests/test_single_vip.py
@@ -0,0 +1,27 @@
+import pytest
+from cvp_checks import utils
+from collections import Counter
+
+
+@pytest.mark.parametrize(
+    "group",
+    utils.get_groups(utils.get_configuration(__file__))
+)
+def test_single_vip(local_salt_client, group):
+    local_salt_client.cmd(group, 'saltutil.sync_all', expr_form='pcre')
+    nodes_list = local_salt_client.cmd(
+        group, 'grains.item', ['ipv4'], expr_form='pcre')
+
+    ipv4_list = []
+
+    for node in nodes_list:
+        ipv4_list.extend(nodes_list.get(node).get('ipv4'))
+
+    cnt = Counter(ipv4_list)
+
+    for ip in cnt:
+        if ip == '127.0.0.1':
+            continue
+        elif cnt[ip] > 1:
+            assert "VIP IP duplicate found " \
+                   "in group {}\n{}".format(group, ipv4_list)
