diff --git a/cvp_checks/global_config.yaml b/cvp_checks/global_config.yaml
index 9edfc0d..5b8e6c2 100644
--- a/cvp_checks/global_config.yaml
+++ b/cvp_checks/global_config.yaml
@@ -1,14 +1,25 @@
 ---
 # MANDATORY: Credentials for Salt master
-#SALT_URL: <salt_url> 
-#SALT_USERNAME: <salt_usr>
-#SALT_PASSWORD: <salt_pwd>
+SALT_URL: <salt_url>
+SALT_USERNAME: <salt_usr>
+SALT_PASSWORD: <salt_pwd>
 
-# List of nodes to skip in tests
-skipped_nodes: []
+# List of nodes (full fqdn) to skip in all tests
+# TEMPORARY: please do not comment this setting.
+skipped_nodes: [""]
+
+# List of groups (short name, e.g. dbs) to skip in group tests
+# TEMPORARY: please do not comment this setting.
+skipped_groups: [""]
+
+# Some tests may skip groups
+#test_mtu: {"skipped_groups": ["dbs"]}
 
 # ntp test setting
-time_deviation: 30
+# this test may skip specific node (use fqdn)
+test_ntp_sync:
+  { #"skipped_nodes": [""],
+    "time_deviation": 30}
 
 # mtu test setting
 # mask for interfaces to skip
diff --git a/cvp_checks/tests/test_default_gateway.py b/cvp_checks/tests/test_default_gateway.py
index 57a6d7b..b6c74c2 100644
--- a/cvp_checks/tests/test_default_gateway.py
+++ b/cvp_checks/tests/test_default_gateway.py
@@ -1,15 +1,16 @@
 import json
 import pytest
-
+import os
 from cvp_checks import utils
 
 
 @pytest.mark.parametrize(
     "group",
-    utils.get_groups(utils.get_configuration(__file__))
+    utils.get_groups(os.path.basename(__file__))
 )
 def test_check_default_gateways(local_salt_client, group):
-    config = utils.get_configuration(__file__)
+    if "skipped" in group:
+        pytest.skip("skipped in config")
     netstat_info = local_salt_client.cmd(
         group, 'cmd.run', ['ip r | sed -n 1p'], expr_form='pcre')
 
diff --git a/cvp_checks/tests/test_mtu.py b/cvp_checks/tests/test_mtu.py
index f3c3511..be17237 100644
--- a/cvp_checks/tests/test_mtu.py
+++ b/cvp_checks/tests/test_mtu.py
@@ -1,14 +1,17 @@
 import pytest
 import json
 from cvp_checks import utils
+import os
 
 
 @pytest.mark.parametrize(
     "group",
-    utils.get_groups(utils.get_configuration(__file__))
+    utils.get_groups(os.path.basename(__file__))
 )
 def test_mtu(local_salt_client, group):
-    config = utils.get_configuration(__file__)
+    if "skipped" in group:
+        pytest.skip("skipped in config")
+    config = utils.get_configuration()
     skipped_ifaces = config["skipped_ifaces"]
     total = {}
     network_info = local_salt_client.cmd(
diff --git a/cvp_checks/tests/test_ntp_sync.py b/cvp_checks/tests/test_ntp_sync.py
index 10eb130..b900e12 100644
--- a/cvp_checks/tests/test_ntp_sync.py
+++ b/cvp_checks/tests/test_ntp_sync.py
@@ -1,21 +1,25 @@
 from cvp_checks import utils
+import os
 
 
 def test_ntp_sync(local_salt_client):
-    config = utils.get_configuration(__file__)
+    testname = os.path.basename(__file__).split('.')[0]
+    active_nodes = utils.get_active_nodes(os.path.basename(__file__))
+    config = utils.get_configuration()
     fail = {}
     saltmaster_time = int(local_salt_client.cmd(
         'salt:master',
         'cmd.run',
         ['date +%s'],
         expr_form='pillar').values()[0])
-
     nodes_time = local_salt_client.cmd(
-        '*', 'cmd.run', ['date +%s'])
-
+        utils.list_to_target_string(active_nodes, 'or'),
+        'cmd.run',
+        ['date +%s'],
+        expr_form='compound')
     for node, time in nodes_time.iteritems():
-        if (int(time) - saltmaster_time) > config["time_deviation"] or \
-                (int(time) - saltmaster_time) < -config["time_deviation"]:
+        if (int(time) - saltmaster_time) > config.get(testname)["time_deviation"] or \
+                (int(time) - saltmaster_time) < -config.get(testname)["time_deviation"]:
             fail[node] = time
 
     assert not fail, 'SaltMaster time: {}\n' \
diff --git a/cvp_checks/tests/test_packet_checker.py b/cvp_checks/tests/test_packet_checker.py
index 79915ec..2556bcf 100644
--- a/cvp_checks/tests/test_packet_checker.py
+++ b/cvp_checks/tests/test_packet_checker.py
@@ -1,15 +1,16 @@
 import pytest
 import json
+import os
 from cvp_checks import utils
 
 
 @pytest.mark.parametrize(
     "group",
-    utils.get_groups(utils.get_configuration(__file__))
+    utils.get_groups(os.path.basename(__file__))
 )
 def test_check_package_versions(local_salt_client, group):
-    config = utils.get_configuration(__file__)
-
+    if "skipped" in group:
+        pytest.skip("skipped in config")
     output = local_salt_client.cmd(group, 'lowpkg.list_pkgs', expr_form='pcre')
 
     if len(output.keys()) < 2:
@@ -43,11 +44,11 @@
 
 @pytest.mark.parametrize(
     "group",
-    utils.get_groups(utils.get_configuration(__file__))
+    utils.get_groups(os.path.basename(__file__))
 )
 def test_check_module_versions(local_salt_client, group):
-    config = utils.get_configuration(__file__)
-
+    if "skipped" in group:
+        pytest.skip("skipped in config")
     pre_check = local_salt_client.cmd(
         group, 'cmd.run', ['dpkg -l | grep "python-pip "'], expr_form='pcre')
     if pre_check.values().count('') > 0:
diff --git a/cvp_checks/tests/test_repo_list.py b/cvp_checks/tests/test_repo_list.py
index 0970fdc..bd3214c 100644
--- a/cvp_checks/tests/test_repo_list.py
+++ b/cvp_checks/tests/test_repo_list.py
@@ -1,12 +1,15 @@
 import pytest
+import os
 from cvp_checks import utils
 
 
 @pytest.mark.parametrize(
     "group",
-    utils.get_groups(utils.get_configuration(__file__))
+    utils.get_groups(os.path.basename(__file__))
 )
 def test_list_of_repo_on_nodes(local_salt_client, group):
+    if "skipped" in group:
+        pytest.skip("skipped in config")
     info_salt = local_salt_client.cmd(
         group, 'pillar.data', ['linux:system:repo'], expr_form='pcre')
 
diff --git a/cvp_checks/tests/test_services.py b/cvp_checks/tests/test_services.py
index 3d90218..7f04578 100644
--- a/cvp_checks/tests/test_services.py
+++ b/cvp_checks/tests/test_services.py
@@ -1,15 +1,16 @@
 import pytest
 import json
+import os
 from cvp_checks import utils
 
 
 @pytest.mark.parametrize(
     "group",
-    utils.get_groups(utils.get_configuration(__file__))
+    utils.get_groups(os.path.basename(__file__))
 )
 def test_check_services(local_salt_client, group):
-    config = utils.get_configuration(__file__)
-
+    if "skipped" in group:
+        pytest.skip("skipped in config")
     output = local_salt_client.cmd(group, 'service.get_all', expr_form='pcre')
 
     if len(output.keys()) < 2:
diff --git a/cvp_checks/tests/test_single_vip.py b/cvp_checks/tests/test_single_vip.py
index 9e0f16e..60d1894 100644
--- a/cvp_checks/tests/test_single_vip.py
+++ b/cvp_checks/tests/test_single_vip.py
@@ -1,13 +1,16 @@
 import pytest
 from cvp_checks import utils
+import os
 from collections import Counter
 
 
 @pytest.mark.parametrize(
     "group",
-    utils.get_groups(utils.get_configuration(__file__))
+    utils.get_groups(os.path.basename(__file__))
 )
 def test_single_vip(local_salt_client, group):
+    if "skipped" in group:
+        pytest.skip("skipped in config")
     local_salt_client.cmd(group, 'saltutil.sync_all', expr_form='pcre')
     nodes_list = local_salt_client.cmd(
         group, 'grains.item', ['ipv4'], expr_form='pcre')
diff --git a/cvp_checks/utils/__init__.py b/cvp_checks/utils/__init__.py
index e58ed40..85f5a61 100644
--- a/cvp_checks/utils/__init__.py
+++ b/cvp_checks/utils/__init__.py
@@ -2,14 +2,11 @@
 import yaml
 import requests
 import re
-
+import pytest
 
 class salt_remote:
     def cmd(self, tgt, fun, param=None,expr_form=None,tgt_type=None):
-        config = get_configuration(__file__)
-        for salt_cred in ['SALT_USERNAME', 'SALT_PASSWORD', 'SALT_URL']:
-            if os.environ.get(salt_cred):
-                config[salt_cred] = os.environ[salt_cred]
+        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}
@@ -26,25 +23,47 @@
     return local
 
 
-def get_active_nodes(config):
+def list_to_target_string(node_list, separator):
+    result = ''
+    for node in node_list:
+        result += node + ' ' + separator + ' '
+    return result.strip(' ' + separator + ' ')
+
+
+def get_active_nodes(test=None):
+    config = get_configuration()
     local_salt_client = init_salt_client()
 
     skipped_nodes = config.get('skipped_nodes') or []
-    # TODO add skipped nodes to cmd command instead of filtering
-    nodes = local_salt_client.cmd('*', 'test.ping')
-    active_nodes = [
-        node_name for node_name in nodes
-        if nodes[node_name] and node_name not in skipped_nodes
-    ]
-    return active_nodes
+    if test:
+        testname = test.split('.')[0]
+        if 'skipped_nodes' in config.get(testname).keys():
+            skipped_nodes += config.get(testname)['skipped_nodes'] or []
+
+    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')
+    else:
+        nodes = local_salt_client.cmd('*', 'test.ping')
+    return nodes
 
 
-def get_groups(config):
+def get_groups(test):
+    config = get_configuration()
+    testname = test.split('.')[0]
     # assume that node name is like <name>.domain
     # last 1-3 digits of name are index, e.g. 001 in cpu001
     # name doesn't contain dots
-    active_nodes = get_active_nodes(config)
-    skipped_group = config.get('skipped_group') or []
+    active_nodes = get_active_nodes()
+
+    skipped_groups = config.get('skipped_groups') or []
+    if config.get(testname):
+        if 'skipped_groups' in config.get(testname).keys():
+            skipped_groups += config.get(testname)['skipped_groups'] or []
+
     groups = []
 
     for node in active_nodes:
@@ -53,44 +72,30 @@
             group_name = node.split('.')[0][:-len(index.group(0))]
         else:
             group_name = node
-        if group_name not in skipped_group and group_name not in groups:
-            groups.append(group_name)
-    test_groups = []
-    groups_from_config = config.get('groups')
-    # check if config.yaml contains `groups` key
-    if groups_from_config is not None:
-        invalid_groups = []
-        for group in groups_from_config:
-            # check if group name from config
-            # is substring of one of the groups
-            grp = [x for x in groups if group in x]
-            if grp:
-                test_groups.append(grp[0])
+        if group_name not in groups:
+            if group_name not in skipped_groups:
+                groups.append(group_name)
             else:
-                invalid_groups.append(group)
-        if invalid_groups:
-            raise ValueError('Config file contains'
-                             ' invalid groups name: {}'.format(invalid_groups))
-
-    groups = test_groups if test_groups else groups
+                if group_name+" - skipped" not in groups:
+                    groups.append(group_name+" - skipped")
 
     return groups
 
 
-def get_configuration(path_to_test):
+def get_configuration():
     """function returns configuration for environment
-
     and for test if it's specified"""
     global_config_file = os.path.join(
         os.path.dirname(os.path.abspath(__file__)), "../global_config.yaml")
     with open(global_config_file, 'r') as file:
         global_config = yaml.load(file)
-
-    config_file = os.path.join(
-        os.path.dirname(os.path.abspath(path_to_test)), "config.yaml")
-
-    if os.path.exists(config_file):
-        with open(config_file, 'r') as file:
-            global_config.update(yaml.load(file))
+    for param in global_config.keys():
+        if param in os.environ.keys():
+            if ',' in os.environ[param]:
+                global_config[param]=[]
+                for item in os.environ[param].split(','):
+                    global_config[param].append(item)
+            else:
+                global_config[param]=os.environ[param]
 
     return global_config
