diff --git a/test_set/cvp-sanity/tests/test_cinder_services.py b/test_set/cvp-sanity/tests/test_cinder_services.py
index 16c764f..e6b8c8e 100644
--- a/test_set/cvp-sanity/tests/test_cinder_services.py
+++ b/test_set/cvp-sanity/tests/test_cinder_services.py
@@ -1,7 +1,6 @@
 import pytest
 
 
-@pytest.mark.xfail
 def test_cinder_services(local_salt_client):
     cinder_backends_info = local_salt_client.cmd(
         'cinder:controller',
diff --git a/test_set/cvp-sanity/tests/test_drivetrain.py b/test_set/cvp-sanity/tests/test_drivetrain.py
index b6c238a..bd81a82 100644
--- a/test_set/cvp-sanity/tests/test_drivetrain.py
+++ b/test_set/cvp-sanity/tests/test_drivetrain.py
@@ -11,6 +11,7 @@
 import ldap
 import ldap.modlist as modlist
 
+
 def join_to_gerrit(local_salt_client, gerrit_user, gerrit_password):
     gerrit_port = local_salt_client.cmd(
         'I@gerrit:client and not I@salt:master',
@@ -27,6 +28,7 @@
     rest = GerritRestAPI(url=url, auth=auth)
     return rest
 
+
 def join_to_jenkins(local_salt_client, jenkins_user, jenkins_password):
     jenkins_port = local_salt_client.cmd(
         'I@jenkins:client and not I@salt:master',
@@ -42,6 +44,7 @@
     server = jenkins.Jenkins(jenkins_url, username=jenkins_user, password=jenkins_password)
     return server
 
+
 def get_password(local_salt_client,service):
     password = local_salt_client.cmd(
         service,
@@ -50,6 +53,7 @@
         expr_form='pillar').values()[0]
     return password
 
+
 def test_drivetrain_gerrit(local_salt_client):
     gerrit_password = get_password(local_salt_client,'gerrit:client')
     gerrit_error = ''
@@ -109,6 +113,7 @@
     assert gerrit_error == '',\
         'Something is wrong with Gerrit'.format(gerrit_error)
 
+
 def test_drivetrain_openldap(local_salt_client):
     '''Create a test user 'DT_test_user' in openldap,
     add the user to admin group, login using the user to Jenkins.
@@ -207,6 +212,7 @@
     assert ldap_result !=[], \
         '''Test user was not found'''
 
+
 def test_drivetrain_jenkins_job(local_salt_client):
     jenkins_password = get_password(local_salt_client,'jenkins:client')
     server = join_to_jenkins(local_salt_client,'admin',jenkins_password)
@@ -266,7 +272,7 @@
 def test_drivetrain_components_and_versions(local_salt_client):
     config = utils.get_configuration()
     if not config['drivetrain_version']:
-        version = \
+        expected_version = \
             local_salt_client.cmd(
                 'I@salt:master',
                 'pillar.get',
@@ -277,34 +283,34 @@
                 'pillar.get',
                 ['_param:apt_mk_version'],
                 expr_form='compound').values()[0]
-        if not version:
+        if not expected_version:
             pytest.skip("drivetrain_version is not defined. Skipping")
     else:
-        version = config['drivetrain_version']
-    salt_output = local_salt_client.cmd(
-        'I@gerrit:client',
-        'cmd.run',
-        ['docker service ls'],
-        expr_form='compound')
-    #  'ldap_server' removed because it is an external component now v 1.1.8
-    not_found_services = ['gerrit_db', 'gerrit_server', 'jenkins_master',
-                          'jenkins_slave01', 'jenkins_slave02',
-                          'jenkins_slave03', 'ldap_admin', 'docker_registry',
-                          'docker_visualizer']
-    version_mismatch = []
-    for line in salt_output[salt_output.keys()[0]].split('\n'):
-        for service in not_found_services:
-            if service in line:
-                not_found_services.remove(service)
-                if version != line.split()[4].split(':')[1]:
-                    version_mismatch.append("{0}: expected "
-                        "version is {1}, actual - {2}".format(service,version,
-                                                              line.split()[4].split(':')[1]))
-                continue
-    assert len(not_found_services) == 0, \
-        '''Some DriveTrain components are not found:
-              {}'''.format(json.dumps(not_found_services, indent=4))
-    assert len(version_mismatch) == 0, \
+        expected_version = config['drivetrain_version']
+    table_with_docker_services = local_salt_client.cmd('I@gerrit:client',
+                                                       'cmd.run',
+                                                       ['docker service ls --format "{{.Image}}"'],
+                                                       expr_form='compound')
+    table_from_pillar = local_salt_client.cmd('I@gerrit:client',
+                                              'pillar.get',
+                                              ['docker:client:images'],
+                                              expr_form='compound')
+
+    expected_images = table_from_pillar[table_from_pillar.keys()[0]]
+    actual_images = table_with_docker_services[table_with_docker_services.keys()[0]].split('\n')
+
+    # ---------------- Check that all docker services are found regarding the 'pillar.get docker:client:images' ----
+    not_found_services = list(set(expected_images) - set(actual_images))
+    assert not_found_services.__len__() == 0, \
+        ''' Some DriveTrain components are not found: {}'''.format(json.dumps(not_found_services, indent=4))
+
+    # ---------- Check that all docker services has label that equals to mcp_version (except of external images) ----
+    version_mismatch = [
+        "{image}: expected version - {expected_version}, actual - {version}".format(version=image.split(":")[-1], **locals())
+        for image in actual_images
+        if image.split(":")[-1] != expected_version and "mirantis/external" not in image]
+
+    assert version_mismatch.__len__() == 0, \
         '''Version mismatch found:
               {}'''.format(json.dumps(version_mismatch, indent=4))
 
@@ -316,9 +322,9 @@
     drivetrain_version = config.get('drivetrain_version', '')
     if not drivetrain_version:
         pytest.skip("drivetrain_version is not defined. Skipping")
-    jenkins_password = get_password(local_salt_client,'jenkins:client')
+    jenkins_password = get_password(local_salt_client, 'jenkins:client')
     version_mismatch = []
-    server = join_to_jenkins(local_salt_client,'admin',jenkins_password)
+    server = join_to_jenkins(local_salt_client, 'admin', jenkins_password)
     for job_instance in server.get_jobs():
         job_name = job_instance.get('name')
         if job_name in excludes:
diff --git a/test_set/cvp-sanity/tests/test_duplicate_ips.py b/test_set/cvp-sanity/tests/test_duplicate_ips.py
index 90e6d60..afe1afe 100644
--- a/test_set/cvp-sanity/tests/test_duplicate_ips.py
+++ b/test_set/cvp-sanity/tests/test_duplicate_ips.py
@@ -15,9 +15,7 @@
     return dup_ifaces
 
 
-@pytest.mark.xfail
 def test_duplicate_ips(local_salt_client):
-    # It doesn't work for test_drivetrain job
     active_nodes = utils.get_active_nodes()
 
     testname = os.path.basename(__file__).split('.')[0]
