diff --git a/.gitignore b/.gitignore
index f8b92c3..d075acf 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,2 +1,5 @@
+.idea
 .gradle
 build
+gradlew*
+gradle/
diff --git a/src/com/mirantis/mk/Galera.groovy b/src/com/mirantis/mk/Galera.groovy
index e5ffe12..3b6f626 100644
--- a/src/com/mirantis/mk/Galera.groovy
+++ b/src/com/mirantis/mk/Galera.groovy
@@ -378,8 +378,8 @@
 
     if (restoreDb) {
         def timestamp = common.getDatetime()
-        salt.cmdRun(env, lastNodeTarget, "mkdir -p /root/mysql")
-        def bakDir = salt.getReturnValues(salt.cmdRun(env, lastNodeTarget, "mktemp -d --suffix='_${timestamp}' /root/mysql/mysql.bak.XXXXXX", false))
+        def bakDir = "/root/mysql/mysql.bak.${timestamp}".toString()
+        salt.cmdRun(env, lastNodeTarget, "mkdir -p ${bakDir}")
         salt.cmdRun(env, lastNodeTarget, "mv /var/lib/mysql/* ${bakDir} || echo 'Nothing to backup from directory /var/lib/mysql/'")
     }
     if (total) {
diff --git a/src/com/mirantis/mk/Gerrit.groovy b/src/com/mirantis/mk/Gerrit.groovy
index 954600b..85b0411 100644
--- a/src/com/mirantis/mk/Gerrit.groovy
+++ b/src/com/mirantis/mk/Gerrit.groovy
@@ -370,6 +370,7 @@
  */
 def postGerritReview(credentialsId, virtualEnv, repoDir, gitName, gitEmail, gitRemote, gitTopic, gitBranch) {
     def python = new com.mirantis.mk.Python()
+    def common = new com.mirantis.mk.Common()
     def cmdText = """
                     GIT_COMMITTER_NAME=${gitName} \
                     GIT_COMMITTER_EMAIL=${gitEmail} \
@@ -379,7 +380,8 @@
                   """
     sshagent([credentialsId]) {
         dir(repoDir) {
-            python.runVirtualenvCommand(virtualEnv, cmdText)
+            res = python.runVirtualenvCommand(virtualEnv, cmdText)
+            common.infoMsg(res)
         }
     }
 }
diff --git a/src/com/mirantis/mk/Helm.groovy b/src/com/mirantis/mk/Helm.groovy
index 72d95cb..61ff48a 100644
--- a/src/com/mirantis/mk/Helm.groovy
+++ b/src/com/mirantis/mk/Helm.groovy
@@ -64,10 +64,14 @@
 def generateChartVersionFromGit(repoDir, devVersion = true, increment = false, defaultVersion = '0.1.0', tagSuffix = 'mcp') {
     def common = new com.mirantis.mk.Common()
     def git = new com.mirantis.mk.Git()
-    String initialVersion = "${defaultVersion}-${tagSuffix}"
+    String initialVersion = "${defaultVersion}"
     String countRange
     String versionData
-    String tagPattern = "[0-9]*-${tagSuffix}"
+    String tagPattern = "[0-9]*"
+    if (tagSuffix) {
+        tagPattern = "${tagPattern}-${tagSuffix}"
+        initialVersion = "${initialVersion}-${tagSuffix}"
+    }
     dir(repoDir){
         Map cmd = common.shCmdStatus("git describe --tags --first-parent --abbrev=0 --match ${tagPattern}")
         String lastTag = cmd['stdout'].trim()
@@ -86,26 +90,29 @@
         }
         List versionParts = versionData.tokenize('-')
 
-        if (versionParts.size() == 2 && common.isSemVer(versionData) && versionParts[1] == tagSuffix){
-            String commitsSinceTag = sh(script: "git rev-list --count ${countRange}", returnStdout: true).trim()
-            String commitSha = sh(script: 'git rev-parse --short=7 HEAD', returnStdout: true).trim()
-
-            if (commitsSinceTag == '0'){
-                return versionData
-            }
-
-            if (devVersion){
-                versionParts.add(commitSha)
-            } else {
-                versionParts.add(commitsSinceTag)
-            }
-            // Patch version will be incremented e.g. 0.1.0 -> 0.1.1
-            if (increment) {
-                versionParts[0] = git.incrementVersion(versionParts[0])
-            }
-            return versionParts.join('-')
+        if (!common.isSemVer(versionData)){
+            error "Version ${versionData} is not in semver2 format"
         }
-        error "Version ${versionData} doesn't contain required suffix ${tagSuffix} or not in semver2 format"
+        if (tagSuffix && versionParts.size() == 2 && versionParts[1] != tagSuffix){
+            error "Tag suffix ${tagSuffix} was specified but not found in ${versionData}"
+        }
+        String commitsSinceTag = sh(script: "git rev-list --count ${countRange}", returnStdout: true).trim()
+        String commitSha = sh(script: 'git rev-parse --short=7 HEAD', returnStdout: true).trim()
+
+        if (commitsSinceTag == '0'){
+            return versionData
+        }
+
+        if (devVersion){
+            versionParts.add(commitSha)
+        } else {
+            versionParts.add(commitsSinceTag)
+        }
+        // Patch version will be incremented e.g. 0.1.0 -> 0.1.1
+        if (increment) {
+            versionParts[0] = git.incrementVersion(versionParts[0])
+        }
+        return versionParts.join('-')
     }
 }
 
