diff --git a/tcp_tests/tests/system/test_offline.py b/tcp_tests/tests/system/test_offline.py
index 6c083cb..4d73e84 100644
--- a/tcp_tests/tests/system/test_offline.py
+++ b/tcp_tests/tests/system/test_offline.py
@@ -13,8 +13,8 @@
 #    under the License.
 import pytest
 import time
-
-from collections import Counter
+import socket
+import urlparse
 
 from tcp_tests import logger
 from tcp_tests.managers.jenkins.client import JenkinsClient
@@ -103,6 +103,12 @@
         LOG.info(r)
         LOG.info(f)
 
+        r, f = day1_cfg_config.salt.enforce_state(
+            'cfg01*',
+            'maas.machines.storage')
+        LOG.info(r)
+        LOG.info(f)
+
         # show_step(9)
         underlay.check_call(
             node_name=cfg_node, verbose=verbose,
@@ -169,28 +175,21 @@
 
         LOG.info("*************** DONE **************")
 
-    def test_deploy_day1(self, show_step, config, underlay, hardware,
-                         core_deployed, salt_deployed):
+    def test_deploy_day1_pike(self, show_step, config, underlay, hardware,
+                              core_deployed, salt_deployed, tempest_actions):
         """Test for deploying an mcp from day01 images
 
         Scenario:
             1. Wait salt master
-            2. Addition config of MaaS
-            3. Wait dhcpd server
-            4. Start comissioning node via MaaS
-            5. Wait of comissioning node by MaaS
-            6. Start deploing node via MaaS
-            7. Wait of deploing node by
-            8. Accept all keys
-            9. Configure and baremetal nodes after MaaS deployment
-            10. Run deploy OS job
+            2. Run deploy OS job
+            3. Add test and root keys
+            2. Run deploy CVP sanity job
 
         """
         # group = hardware._get_default_node_group()
         nodes = underlay.node_names()
         LOG.info("Nodes - {}".format(nodes))
-        cfg_node = 'cfg01.offline-ocata-vxlan.local'
-        tempest_node = 'gtw01.offline-ocata-vxlan.local'
+        cfg_node = 'cfg01.mcp-offline-vxlan.local'
         verbose = True
         ssh_test_key = config.underlay.ssh_keys[0]['public']
 
@@ -201,203 +200,33 @@
             cmd="""timeout 300s /bin/bash -c """
                 """'while ! salt-call test.ping; do """
                 """echo "salt master still isnt running"; sleep 10; done'"""
-        )  # noqa
+        )
 
         show_step(2)
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt-call saltutil.sync_all')
-
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd="salt '*' ssh.set_auth_key root '{}'".format(ssh_test_key))
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt "*" ssh.set_auth_key root '
-                '"$(ssh-keygen -y -f ~/.ssh/id_rsa | cut -d " " -f 2)"')
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd="salt '*' ssh.set_auth_key ubuntu '{}'".format(ssh_test_key))
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt "*" ssh.set_auth_key ubuntu '
-                '"$(ssh-keygen -y -f ~/.ssh/id_rsa | cut -d " " -f 2)"')
-
-        # underlay.check_call(
-        #     node_name=cfg_node,
-        #     verbose=verbose,
-        #     cmd='salt-call state.sls maas.region')
-        # underlay.check_call(
-        #     node_name=cfg_node,
-        #     verbose=verbose,
-        #     cmd='maas logout mirantis && '
-        #     'maas login mirantis '
-        #     'http://localhost:5240/MAAS/api/2.0/ '
-        #     'FTvqwe7ybBp68gPar2:5mcctTAXVL8mns4ef4:zrA9LZwu2tMc8BAZpsPUfwWwTyQnAtDN'  # noqa
-        # )
-
-        # underlay.check_call(
-        #     node_name=cfg_node,
-        #     verbose=verbose,
-        #     cmd="maas mirantis maas set-config "
-        #         "name=upstream_dns value='10.10.0.15 8.8.8.8 8.8.4.4'")
-
-        # underlay.check_call(
-        #     node_name=cfg_node,
-        #     verbose=verbose,
-        #     cmd="maas mirantis ipranges create "
-        #         "type=dynamic start_ip=10.10.191.255 end_ip=10.10.255.254 "
-        #         "subnet=$(maas mirantis subnets read | jq '.[] | "
-        #         "select(.name==\"10.10.0.0/16\") | .id')")
-
-        # underlay.check_call(
-        #     node_name=cfg_node,
-        #     verbose=verbose,
-        #     cmd="maas mirantis vlan update "
-        #         "$(maas mirantis subnets read | jq '.[] | "
-        #         "select(.name==\"10.10.0.0/16\") | .vlan.fabric_id') "
-        #         "0 dhcp_on=True primary_rack='cfg01'")
-
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd="ssh-keygen -y -f ~root/.ssh/id_rsa > ~root/.ssh/id_rsa.pub")
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='maas mirantis sshkeys create '
-                'key="$(cat ~root/.ssh/id_rsa.pub)"')
-
-        show_step(3)
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd="""timeout 90s /bin/bash -c 'while ! pidof dhcpd; do """
-                """echo "dhcpd still isnt running"; sleep 10; done'""")
-
-        show_step(4)
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt-call state.sls maas.machines')
-        show_step(5)
-        # cmd = """   timeout 1200s bash -c 'hosts=$(maas mirantis nodes read | jq -r ".[] | select(.node_type_name==\\"Machine\\") | select(.status_name==\\"Ready\\") | .hostname "); while ! [ $(echo "$hosts" | wc -w) -eq 10 ]; do echo "Ready hosts:\n$hosts"; sleep 30; hosts=$(maas mirantis nodes read | jq -r ".[] | select(.node_type_name==\\"Machine\\") | select(.status_name==\\"Ready\\") | .hostname "); done '   """  # noqa
-        cmd = """salt-call state.sls maas.machines.wait_for_ready"""
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-        underlay.check_call(
-            node_name=cfg_node, verbose=verbose, cmd='salt-key')
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt-call state.sls maas.machines.assign_ip')
-        show_step(6)
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt-call state.sls maas.machines.deploy')
-        show_step(7)
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt-call state.sls maas.machines.wait_for_deployed')
-        underlay.check_call(
-            node_name=cfg_node, verbose=verbose, cmd='salt-key')
-
-        show_step(8)
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            expected=[0, 1],
-            cmd='salt-key -A -y --include-denied --include-rejected')
-        underlay.check_call(
-            node_name=cfg_node, verbose=verbose, cmd='salt-key')
-
-        show_step(9)
-        cmd = "salt '*' saltutil.refresh_pillar"
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-        cmd = "salt '*' saltutil.sync_all"
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-
-        underlay.check_call(
-            node_name=cfg_node, verbose=verbose, cmd="reclass-salt --top")
-
-        cmd = "salt -C " \
-              "'I@salt:control or I@nova:compute or I@ceph:osd' " \
-              "cmd.run 'touch /run/is_rebooted'"
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-
-        cmd = "salt --async -C " \
-              "'I@salt:control' cmd.run 'salt-call state.sls " \
-              "linux.system.user,openssh,linux.network;reboot'"
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-
-        cmd = "salt --async -C " \
-              "'I@nova:compute' cmd.run 'salt-call state.sls " \
-              "linux.system.user,openssh,linux.network;reboot'"
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-
-        cmd = "salt --async -C " \
-              "'I@ceph:osd' cmd.run 'salt-call state.sls " \
-              "linux.system.user,openssh,linux.network;reboot'"
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-
-        time.sleep(360)  # TODO: Add ssh waiter
-
-        cmd = "salt -C " \
-              "'I@salt:control or I@nova:compute or I@ceph:osd'" \
-              " test.ping"
-        underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-
-        cmd = """salt -C """ \
-              """'I@salt:control or I@nova:compute or I@ceph:osd' """ \
-              """cmd.run '[ -f "/run/is_rebooted" ] && """ \
-              """echo "Has not been rebooted!" || echo "Rebooted"' """
-        ret = underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
-        count = Counter(ret['stdout_str'].split())
-
-        assert count['Rebooted'] == 13, "Should be rebooted 13 baremetal nodes"
-
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd="salt '*' ssh.set_auth_key root '{}'".format(ssh_test_key))
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt "*" ssh.set_auth_key root '
-                '"$(ssh-keygen -y -f ~/.ssh/id_rsa | cut -d " " -f 2)"')
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd="salt '*' ssh.set_auth_key ubuntu '{}'".format(ssh_test_key))
-        underlay.check_call(
-            node_name=cfg_node,
-            verbose=verbose,
-            cmd='salt "*" ssh.set_auth_key ubuntu '
-                '"$(ssh-keygen -y -f ~/.ssh/id_rsa | cut -d " " -f 2)"')
 
         salt_api = \
             salt_deployed.get_pillar(cfg_node, '_param:jenkins_salt_api_url')
         salt_api = salt_api[0].get(cfg_node)
 
-        show_step(10)
         jenkins = JenkinsClient(
             host='http://172.16.44.33:8081',
             username='admin',
             password='r00tme')
         params = jenkins.make_defults_params('deploy_openstack')
         params['SALT_MASTER_URL'] = salt_api
-        params['STACK_INSTALL'] = \
-            'core,kvm,ceph,cicd,openstack,stacklight,finalize'
+        if settings.STACK_INSTALL:
+            params['STACK_INSTALL'] = settings.STACK_INSTALL
+        else:
+            params['STACK_INSTALL'] = \
+                'core,kvm,ceph,cicd,ovs,openstack,stacklight,finalize'
+        params['STATIC_MGMT_NETWORK'] = 'true'
         build = jenkins.run_build('deploy_openstack', params)
 
+        LOG.info("Take a look deploy progress here - %s. Build #%s",
+                 "http://172.16.44.33:8081/job/deploy_openstack/", build[1])
+
         jenkins.wait_end_of_build(
-            name=build[0], build_id=build[1], timeout=60 * 60 * 4)
+            name=build[0], build_id=build[1], timeout=60 * 60 * 5)
 
         with open("{path}/cfg01_jenkins_deploy_openstack_console.log".format(
                 path=settings.LOGS_DIR), 'w') as f:
@@ -411,6 +240,7 @@
                 name=build[0], build_id=build[1])['result'] == 'SUCCESS', \
             "Deploy openstack was failed"
 
+        show_step(3)
         underlay.check_call(
             node_name=cfg_node,
             verbose=verbose,
@@ -432,15 +262,54 @@
 
         salt_deployed.update_ssh_data_from_minions()
 
+        show_step(4)
+        params = jenkins.make_defults_params('cvp-sanity')
+        params['TESTS_SETTINGS'] = 'drivetrain_version=proposed'
+        build = jenkins.run_build('cvp-sanity', params)
+        LOG.info("Take a look test progress here - %s. Build #%s",
+                 "http://172.16.44.33:8081/job/cvp-sanity/", build[1])
+
+        jenkins.wait_end_of_build(
+            name=build[0], build_id=build[1], timeout=60 * 60 * 5)
+
+        assert \
+            jenkins.build_info(
+                name=build[0], build_id=build[1])['result'] == 'SUCCESS', \
+            "CVP sanity was failed"
+
         time.sleep(120)  # debug sleep
         cmd = "salt '*' test.ping"
         underlay.check_call(node_name=cfg_node, verbose=verbose, cmd=cmd)
 
-        openstack = managers.openstack_manager.OpenstackManager(
-            config, underlay, hardware, salt_deployed)
-
         if settings.RUN_TEMPEST:
-            openstack.run_tempest(
-                pattern=settings.PATTERN,
-                node_name=tempest_node)
-            openstack.download_tempest_report()
+            pillar = tempest_actions.runtest_pillar
+            params = [
+                'glance_image_cirros_location',
+                'glance_image_fedora_location',
+                'glance_image_manila_location']
+
+            urls = []
+            for p in params:
+                url = pillar.get('parameters', {}).get('_param', {}).get(p)
+                if url:
+                    urls.append(url)
+
+            LOG.info("Found url with images - %s", urls)
+
+            hosts = set()
+            hosts.add(settings.TEMPEST_IMAGE.split('/')[0])
+            for u in urls:
+                host = urlparse.urlparse(u)
+                hosts.add(host.netloc.split(':')[0])  # drop port if exists
+
+            records = []
+            for h in hosts:
+                ip = socket.gethostbyname(h)
+                records.append((ip, h))
+
+            for ip, h in records:
+                salt_deployed.local(cfg_node, 'hosts.add_host', args=(ip, h))
+
+            tempest_actions.prepare_and_run_tempest()
+
+    test_deploy_day1_queens = test_deploy_day1_pike
