diff --git a/README.md b/README.md
index 9bd04f7..c2ae337 100644
--- a/README.md
+++ b/README.md
@@ -40,11 +40,19 @@
    # vim cvp_checks/global_config.yaml
 ```
 SALT credentials are mandatory for tests.
+
+
 Other settings are optional (please keep uncommented with default values)
+
+
 Alternatively, you can specify these settings via env variables:
+```bash
 export SALT_URL=http://10.0.0.1:6969
+```
 For array-type settings please do:
+```bash
 export skipped_nodes='ctl01.example.com,ctl02.example.com'
+```
 
 5) Start tests:
 ```bash 
diff --git a/cvp_checks/global_config.yaml b/cvp_checks/global_config.yaml
index 5b8e6c2..74dbbb5 100644
--- a/cvp_checks/global_config.yaml
+++ b/cvp_checks/global_config.yaml
@@ -12,15 +12,15 @@
 # TEMPORARY: please do not comment this setting.
 skipped_groups: [""]
 
-# Some tests may skip groups
-#test_mtu: {"skipped_groups": ["dbs"]}
+# mtu test setting
+# this test may skip groups (see example)
+test_mtu:
+  { #"skipped_groups": ["dbs"]
+    "skipped_ifaces": ["bonding_masters", "lo", "veth", "tap", "cali"]}
+# mask for interfaces to skip
 
 # ntp test setting
 # this test may skip specific node (use fqdn)
 test_ntp_sync:
   { #"skipped_nodes": [""],
     "time_deviation": 30}
-
-# mtu test setting
-# mask for interfaces to skip
-skipped_ifaces: ["bonding_masters", "lo", "veth", "tap", "cali"]
diff --git a/cvp_checks/tests/ceph/test_ceph_haproxy.py b/cvp_checks/tests/ceph/test_ceph_haproxy.py
index 7bff15b..d6c8e49 100644
--- a/cvp_checks/tests/ceph/test_ceph_haproxy.py
+++ b/cvp_checks/tests/ceph/test_ceph_haproxy.py
@@ -8,9 +8,9 @@
     monitor_info = local_salt_client.cmd(
         'ceph:mon',
         'cmd.run',
-       ["echo 'show stat' | nc -U "
-        "/var/run/haproxy/admin.sock | "
-        "grep ceph_mon_radosgw_cluster"],
+        ["echo 'show stat' | nc -U "
+         "/var/run/haproxy/admin.sock | "
+         "grep ceph_mon_radosgw_cluster"],
         expr_form='pillar')
     if not monitor_info:
         pytest.skip("Ceph is not found on this environment")
diff --git a/cvp_checks/tests/test_contrail.py b/cvp_checks/tests/test_contrail.py
index a469976..b8955f0 100644
--- a/cvp_checks/tests/test_contrail.py
+++ b/cvp_checks/tests/test_contrail.py
@@ -1,6 +1,7 @@
 import pytest
 import json
 
+
 def test_contrail_compute_status(local_salt_client):
     probe = local_salt_client.cmd(
         'opencontrail:control', 'cmd.run',
@@ -51,7 +52,7 @@
             if 'crashes/core.java.' not in line:
                 name, status = line.split(None, 1)
             else:
-                name, status = line,'FATAL'
+                name, status = line, 'FATAL'
             if status not in {'active', 'backup'}:
                 err_msg = "{node}:{service} - {status}".format(
                     node=node, service=name, status=status)
diff --git a/cvp_checks/tests/test_galera_cluster.py b/cvp_checks/tests/test_galera_cluster.py
index 003b0d6..5a74bdd 100644
--- a/cvp_checks/tests/test_galera_cluster.py
+++ b/cvp_checks/tests/test_galera_cluster.py
@@ -1,3 +1,6 @@
+import pytest
+
+
 def test_galera_cluster_status(local_salt_client):
     gs = local_salt_client.cmd(
         'galera:*',
diff --git a/cvp_checks/tests/test_k8s.py b/cvp_checks/tests/test_k8s.py
index d7aed4b..2ff3383 100644
--- a/cvp_checks/tests/test_k8s.py
+++ b/cvp_checks/tests/test_k8s.py
@@ -1,6 +1,7 @@
 import pytest
 import json
 
+
 def test_k8s_get_cs_status(local_salt_client):
     result = local_salt_client.cmd(
         'etcd:server', 'cmd.run',
@@ -17,11 +18,11 @@
                 continue
             else:
                 if 'Healthy' not in line:
-                    errors.append (line)
+                    errors.append(line)
         break
     assert not errors, 'k8s is not healthy: {}'.format(json.dumps(
-                                                             errors,
-                                                             indent=4))
+                                                       errors,
+                                                       indent=4))
 
 
 def test_k8s_get_nodes_status(local_salt_client):
@@ -40,8 +41,8 @@
                 continue
             else:
                 if 'Ready' not in line:
-                    errors.append (line)
+                    errors.append(line)
         break
     assert not errors, 'k8s is not healthy: {}'.format(json.dumps(
-                                                             errors,
-                                                             indent=4))
+                                                       errors,
+                                                       indent=4))
diff --git a/cvp_checks/tests/test_mtu.py b/cvp_checks/tests/test_mtu.py
index be17237..8d76cef 100644
--- a/cvp_checks/tests/test_mtu.py
+++ b/cvp_checks/tests/test_mtu.py
@@ -9,10 +9,12 @@
     utils.get_groups(os.path.basename(__file__))
 )
 def test_mtu(local_salt_client, group):
+    testname = os.path.basename(__file__).split('.')[0]
     if "skipped" in group:
         pytest.skip("skipped in config")
     config = utils.get_configuration()
-    skipped_ifaces = config["skipped_ifaces"]
+    skipped_ifaces = config.get(testname)["skipped_ifaces"] or \
+        ["bonding_masters", "lo", "veth", "tap", "cali"]
     total = {}
     network_info = local_salt_client.cmd(
         group, 'cmd.run', ['ls /sys/class/net/'], expr_form='pcre')
@@ -68,4 +70,3 @@
     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
index b900e12..09b323f 100644
--- a/cvp_checks/tests/test_ntp_sync.py
+++ b/cvp_checks/tests/test_ntp_sync.py
@@ -17,9 +17,10 @@
         'cmd.run',
         ['date +%s'],
         expr_form='compound')
+    diff = config.get(testname)["time_deviation"] or 30
     for node, time in nodes_time.iteritems():
-        if (int(time) - saltmaster_time) > config.get(testname)["time_deviation"] or \
-                (int(time) - saltmaster_time) < -config.get(testname)["time_deviation"]:
+        if (int(time) - saltmaster_time) > diff or \
+                (int(time) - saltmaster_time) < -diff:
             fail[node] = time
 
     assert not fail, 'SaltMaster time: {}\n' \
diff --git a/cvp_checks/tests/test_rabbit_cluster.py b/cvp_checks/tests/test_rabbit_cluster.py
index 94de975..acd4a96 100644
--- a/cvp_checks/tests/test_rabbit_cluster.py
+++ b/cvp_checks/tests/test_rabbit_cluster.py
@@ -1,6 +1,3 @@
-import re
-
-
 def test_checking_rabbitmq_cluster(local_salt_client):
     # disable config for this test
     # it may be reintroduced in future
diff --git a/cvp_checks/tests/test_repo_list.py b/cvp_checks/tests/test_repo_list.py
index bd3214c..07f16d0 100644
--- a/cvp_checks/tests/test_repo_list.py
+++ b/cvp_checks/tests/test_repo_list.py
@@ -19,9 +19,10 @@
         ['cat /etc/apt/sources.list.d/*;'
          'cat /etc/apt/sources.list|grep deb|grep -v "#"'],
         expr_form='pcre')
-    actual_repo_list = [item.replace('/ ', ' ').replace('[arch=amd64] ','')
+    actual_repo_list = [item.replace('/ ', ' ').replace('[arch=amd64] ', '')
                         for item in raw_actual_info.values()[0].split('\n')]
-    expected_salt_data = [repo['source'].replace('/ ', ' ').replace('[arch=amd64] ','')
+    expected_salt_data = [repo['source'].replace('/ ', ' ')
+                                        .replace('[arch=amd64] ', '')
                           for repo in info_salt.values()[0]
                           ['linux:system:repo'].values()]
 
@@ -44,6 +45,6 @@
             diff[repo] = rows
     assert fail_counter == 0, \
         "Several problems found for {0} group: {1}".format(
-        group, json.dumps(diff, indent=4))
+            group, json.dumps(diff, indent=4))
     if fail_counter == 0 and len(diff) > 0:
         print "\nWarning: nodes contain more repos than reclass"
diff --git a/cvp_checks/utils/__init__.py b/cvp_checks/utils/__init__.py
index 85f5a61..4475683 100644
--- a/cvp_checks/utils/__init__.py
+++ b/cvp_checks/utils/__init__.py
@@ -2,19 +2,25 @@
 import yaml
 import requests
 import re
-import pytest
+
 
 class salt_remote:
-    def cmd(self, tgt, fun, param=None,expr_form=None,tgt_type=None):
+    def cmd(self, tgt, fun, param=None, expr_form=None, tgt_type=None):
         config = get_configuration()
-        headers = {'Accept':'application/json'}
-        login_payload = {'username':config['SALT_USERNAME'],'password':config['SALT_PASSWORD'],'eauth':'pam'}
-        accept_key_payload = {'fun': fun,'tgt':tgt,'client':'local','expr_form':expr_form,'tgt_type':tgt_type}
+        headers = {'Accept': 'application/json'}
+        login_payload = {'username': config['SALT_USERNAME'],
+                         'password': config['SALT_PASSWORD'], 'eauth': 'pam'}
+        accept_key_payload = {'fun': fun, 'tgt': tgt, 'client': 'local',
+                              'expr_form': expr_form, 'tgt_type': tgt_type}
         if param:
-            accept_key_payload['arg']=param
+            accept_key_payload['arg'] = param
 
-        login_request = requests.post(os.path.join(config['SALT_URL'],'login'),headers=headers,data=login_payload)
-        request = requests.post(config['SALT_URL'],headers=headers,data=accept_key_payload,cookies=login_request.cookies)
+        login_request = requests.post(os.path.join(config['SALT_URL'],
+                                                   'login'),
+                                      headers=headers, data=login_payload)
+        request = requests.post(config['SALT_URL'], headers=headers,
+                                data=accept_key_payload,
+                                cookies=login_request.cookies)
         return request.json()['return'][0]
 
 
@@ -40,12 +46,12 @@
         if 'skipped_nodes' in config.get(testname).keys():
             skipped_nodes += config.get(testname)['skipped_nodes'] or []
 
-    if skipped_nodes:
+    if skipped_nodes != ['']:
         print "\nNotice: {0} nodes will be skipped".format(skipped_nodes)
         nodes = local_salt_client.cmd(
-        '* and not '+list_to_target_string(skipped_nodes, 'and not'),
-        'test.ping',
-        expr_form='compound')
+            '* and not ' + list_to_target_string(skipped_nodes, 'and not'),
+            'test.ping',
+            expr_form='compound')
     else:
         nodes = local_salt_client.cmd('*', 'test.ping')
     return nodes
@@ -76,8 +82,8 @@
             if group_name not in skipped_groups:
                 groups.append(group_name)
             else:
-                if group_name+" - skipped" not in groups:
-                    groups.append(group_name+" - skipped")
+                if group_name + " - skipped" not in groups:
+                    groups.append(group_name + " - skipped")
 
     return groups
 
@@ -92,10 +98,10 @@
     for param in global_config.keys():
         if param in os.environ.keys():
             if ',' in os.environ[param]:
-                global_config[param]=[]
+                global_config[param] = []
                 for item in os.environ[param].split(','):
                     global_config[param].append(item)
             else:
-                global_config[param]=os.environ[param]
+                global_config[param] = os.environ[param]
 
     return global_config
