diff --git a/packer-image-buid.groovy b/packer-image-buid.groovy
index 3f05f44..32c499d 100644
--- a/packer-image-buid.groovy
+++ b/packer-image-buid.groovy
@@ -36,40 +36,27 @@
 
 // Load shared libs
 def common = new com.mirantis.mk.Common()
-def McpCommon = new com.mirantis.mcp.Common()
 def openstack = new com.mirantis.mk.Openstack()
+def gerrit = new com.mirantis.mk.Gerrit()
 def date = new Date()
 def dateTime = date.format("ddMMyyyy-HHmmss")
 //
 def job_env = env.getEnvironment().findAll { k, v -> v }
 
-////
-// To be removed
-//job_env['BUILD_ONLY'] = 'qemu'
-job_env['TIMESTAMP_INAME'] = true
-//job_env['CLEANUP_AFTER'] = false
-//job_env['PACKER_ARGS'] = ' -debug'
-//job_env['BUILD_OS'] = 'ubuntu-16.04'
-//job_env['IMAGE_NAME'] = 'ubuntu-16-04-x64-test'
-//job_env['DEFAULT_GIT_REF'] = 'refs/changes/06/22106/5'
-//job_env['DEFAULT_GIT_URL'] = 'ssh://mcp-jenkins@gerrit.mcp.mirantis.net:29418/mk/packer-templates'
-//job_env['CREDENTIALS_ID'] = 'gerrit'
-//job_env['PUBLISH_BACKEND'] = 'http'
-//job_env['PACKER_URL'] = "https://releases.hashicorp.com/packer/1.2.4/packer_1.2.4_linux_amd64.zip"
-//job_env['PACKER_ZIP_MD5'] = '997274e80ae41102eecf9df2e5b67860'
-//job_env['EXTRA_VARIABLES_YAML'] = "\n" +
-//    "IMAGE_NAME : \"ubuntu-16-04-x64\"\n" +
-//    "UBUNTU_BASEURL: \"http://mirror.mirantis.com/proposed/ubuntu/\"\n" +
-//    "SALTSTACK_REPO: \"deb [arch=amd64] http://mirror.mirantis.com/proposed/saltstack-2017.7/xenial xenial main\"\n" +
-//    "SALTSTACK_GPG: \"https://repo.saltstack.com/apt/ubuntu/16.04/amd64/2017.7/SALTSTACK-GPG-KEY.pub\""
 /////
 extra_vars = readYaml text: job_env.get('EXTRA_VARIABLES_YAML','').trim()
+// FIXME: os_openrc should be refactored.
+os_openrc = readYaml text: job_env.get('OPENSTACK_OPENRC_YAML','').trim()
 if (job_env.get('TIMESTAMP_INAME', false)) {
-  IMAGE_NAME = IMAGE_NAME + "-" + dateTime
+  imageName = job_env.IMAGE_NAME + "-" + dateTime
+}else {
+  imageName = job_env.IMAGE_NAME
 }
 // Overwrite IMAGE_NAME in template.json with expected
-extra_vars['IMAGE_NAME'] = IMAGE_NAME
-def gerrit = new com.mirantis.mk.Gerrit()
+extra_vars['IMAGE_NAME'] = imageName
+job_env['BUILD_ONLY'] = job_env.BUILD_ONLY.toLowerCase()
+job_env['PUBLISH_BACKEND'] = job_env.PUBLISH_BACKEND.toLowerCase()
+//
 defaultGitRef = job_env.get('DEFAULT_GIT_REF', 'HEAD')
 defaultGitUrl = job_env.get('DEFAULT_GIT_URL', null)
 
@@ -84,30 +71,28 @@
 /**
  * Convert dict in bash-like list
  */
-
   def data_list = []
-
   for (i = 0; i < input_map.size(); i++) {
     data = ''
     data = input_map.keySet()[i] + "=" + input_map.values()[i]
     data_list.add(data)
   }
-
   return data_list
-
 }
 
 timeout(time: 6, unit: 'HOURS') {
   node("jsl15.mcp.mirantis.net") {
     def checkouted = false
-    def creds = ''
-    creds = common.getPasswordCredentials(job_env.OS_CREDENTIALS_ID)
-    rcFile = openstack.createOpenstackEnv(workspace, job_env.OS_URL, job_env.OS_CREDENTIALS_ID, job_env.OS_PROJECT, "default", "", "default", "2", "")
+    def workspace = common.getWorkspace()
+    creds = common.getPasswordCredentials(job_env.CREDENTIALS_ID)
+    if (job_env.BUILD_ONLY == 'openstack' || job_env.PUBLISH_BACKEND == 'glance') {
+      rcFile = openstack.createOpenstackEnv(workspace, os_openrc.OS_AUTH_URL, job_env.OS_TENANT_ID, job_env.OS_TENANT_NAME, "default", "", "default", "2", "")
+      def openstackEnv = "${workspace}/venv"
+    }
 
     try {
-      def workspace = common.getWorkspace()
-      def openstackEnv = "${workspace}/venv"
       def _artifact_dir = "${workspace}/artifacts"
+      def _artifact_list = []
       def ImagesCacheFolder = "${workspace}/../${env.JOB_NAME}_cache/"
       stage("checkout") {
         if (defaultGitRef && defaultGitUrl) {
@@ -146,7 +131,6 @@
       stage("Build Instance") {
         def _packer_args = "${job_env.get(PACKER_ARGS, '')}"
         def _packer_log = "${workspace}/packer.log"
-        def _artifact_list = []
         // clean old log, for correct status grepping
         if (fileExists(_packer_log)) {
           sh "rm -v ${_packer_log}"
@@ -162,8 +146,7 @@
           }
         }
 
-        if (job_env.BUILD_ONLY.toLowerCase() == "openstack") {
-
+        if (job_env.BUILD_ONLY == "openstack") {
           dir("${workspace}/${job_env.BUILD_OS}/") {
             extra_vars_list = MapToList(extra_vars)
             withEnv(["PATH=${env.PATH}:${workspace}/bin",
@@ -191,12 +174,12 @@
 
               common.retry(3, 5) {
                 common.infoMsg("Attempt download openstack image..")
-                openstack.runOpenstackCommand("openstack image save --file ${_artifact_dir}/${job_env.IMAGE_NAME}.qcow2 ${IMAGE_NAME}", rcFile, openstackEnv)
+                openstack.runOpenstackCommand("openstack image save --file ${_artifact_dir}/${imageName}.qcow2 ${imageName}", rcFile, openstackEnv)
               }
             }
           }
 
-        } else if (job_env.BUILD_ONLY.toLowerCase() == 'qemu') {
+        } else if (job_env.BUILD_ONLY == 'qemu') {
 
           dir("${workspace}/${job_env.BUILD_OS}/") {
             extra_vars_list = MapToList(extra_vars)
@@ -219,16 +202,17 @@
               // collect artifacts
               // TODO make it possible, process multiply artifacts by one run.
               dir('images/') {
-                def _files = findFiles(glob: "**/${job_env.IMAGE_NAME}*")
+                def _files = findFiles(glob: "*qemu*/${imageName}*")
                 if (_files.size() > 1) {
                   common.warningMsg("Multiply artifacts detected!Only first one will be processed!")
                 } else if (_files.size() == 0) {
-                  common.warningMsg("No artifacts detected!")
+                  throw new Exception("No artifacts detected!BUILD_ONLY=${env.BUILD_ONLY} failed!")
                 }
                 for (String x : _files) {
                   _file = sh(script: "set -x ; readlink -f ${x}", returnStdout: true)
-                  _artifact_list.add(_file.split('/').last())
-                  sh(script: "mv -v images/${x} ${_artifact_dir}/${job_env.IMAGE_NAME}.qcow2")
+                  sh(script: "mv -v ${x} ${_artifact_dir}/${imageName}.qcow2")
+                  // Save filename to list
+                  _artifact_list.add("${imageName}.qcow2")
                 }
               }
             }
@@ -237,19 +221,17 @@
         } else {
           throw new Exception("Unexpected BUILD_ONLY=${env.BUILD_ONLY} target!")
         }
-
-
       }
 
       stage("Publish artifacts") {
         dir(_artifact_dir) {
           common.infoMsg("Processing md5 for artifacts")
           for (String x : _artifact_list) {
-            _md5 = sh(script: "md5sum ${x} > ${x}.md5", returnStdout: true).trim()
+            _md5 = sh(script: "md5sum ${x} > ${x}.md5; cat ${x}.md5", returnStdout: true).trim()
             _size = sh(script: "ls -alh ${x}", returnStdout: true).trim()
             common.infoMsg("Artifact file: ${_size}\n${_md5}")
           }
-          if (job_env.PUBLISH_BACKEND.toLowerCase() == 'local') {
+          if (job_env.PUBLISH_BACKEND == 'local') {
             common.infoMsg("Uploading to: local")
             common.infoMsg("For local publish target - nothing to do, all files in: ${_artifact_dir}")
             if (job_env.get('CLEANUP_AFTER', false)) {
@@ -257,37 +239,41 @@
               common.warningMsg("Disabling CLEANUP_AFTER option, to save you'r data ;) ")
               job_env.CLEANUP_AFTER = false
             }
-          } else if (job_env.PUBLISH_BACKEND.toLowerCase() == 'glance') {
-            common.infoMsg("Uploading to: openstack")
+          } else if (job_env.PUBLISH_BACKEND == 'glance') {
+            common.infoMsg("Uploading to: glance-openstack")
             if (fileExists("${workspace}/venv")) {
               common.infoMsg("cleaning virtualenv at:${workspace}/venv")
               sh(script: "rm -rf ${workspace}/venv", returnStatus: true)
             }
             openstack.setupOpenstackVirtualenv(openstackEnv, job_env.OS_VERSION)
-            for (String x : findFiles(glob: "${_artifact_dir}/*")) {
-              if (x.endsWith('.md5')) {
-                common.warningMsg("Skipping:${x} from openstack upload!")
-                continue
+              for (String x : findFiles(glob: "*.*")) {
+                if (x.endsWith('.md5')) {
+                  common.warningMsg("Skipping:${x} from openstack upload!")
+                  _md5sum = sh(script: "cat ${x}", returnStdout: true).trim().split()[0]
+                  continue
+                }
+                _property = "--property data=${dateTime} --property md5sum=${_md5sum}"
+                _cmdline = String.format("glance image-create --visibility " +
+                    "public %s --name '%s' %s --file %s", _property, imageShortName, glanceRunArgs, imageName)
+                openstack.runOpenstackCommand(_cmdline, rcFile, openstackEnv)
               }
-              openstack.runOpenstackCommand(String.format("glance image-create --name '%s' %s --file %s", imageShortName, glanceRunArgs, imageName), rcFile, openstackEnv)
-              // do upload
-            }
+            // TODO
+            currentBuild.description = "${imageName}.qcow2 uploaded tenant: "
 
-
-          } else if (job_env.PUBLISH_BACKEND.toLowerCase() == 'http') {
-            for (String u_file : findFiles(glob: "${_artifact_dir}/*")) {
-              common.infoMsg("Uploading image ${IMAGE_NAME}")
+          } else if (job_env.PUBLISH_BACKEND == 'http') {
+            for (String u_file : findFiles(glob: '*.*')) {
+              common.infoMsg("Uploading image ${imageName}")
               def uploadImageStatus = ''
               common.retry(3, 5) {
-                uploadImageStatus = sh(script: "echo curl -f -T ${u_file} ${job_env.UPLOAD_URL}", returnStatus: true)
+                uploadImageStatus = sh(script: "curl -f -T ${u_file} ${job_env.UPLOAD_URL}", returnStatus: true)
                 if (uploadImageStatus != 0) {
                   throw new Exception("Uploading file: ${u_file} failed!")
                 }
               }
-
+              // Fixme for correct path ?
+              currentBuild.description = "<a href='http://ci.mcp.mirantis.net:8085/images/${imageName}.qcow2'>${imageName}.qcow2</a>"
             }
-            // Fixme for correct path ?
-            currentBuild.description = "<a href='http://ci.mcp.mirantis.net:8085/images/${IMAGE_NAME}.qcow2'>${IMAGE_NAME}.qcow2</a>"
+
           } else {
             throw new Exception("Unsupported publish backend:${job_env.PUBLISH_BACKEND}")
           }
@@ -301,10 +287,13 @@
     } finally {
       if (job_env.get('CLEANUP_AFTER', false)) {
         dir(workspace) {
-          sh "find . -mindepth 1 -delete"
+          sh "find . -mindepth 1 -delete || true"
+        }
+        if (job_env.BUILD_ONLY == 'openstack') {
+          common.warningMsg("openstack Env cleanup not implemented yet!")
         }
       } else {
-        common.infoMsg("Env has not been cleaned!")
+        common.warningMsg("Env has not been cleaned!Please cleanup it manualy!")
       }
     }
   }
