diff --git a/release-mcp-version.groovy b/release-mcp-version.groovy
index 744936f..ea528ed 100644
--- a/release-mcp-version.groovy
+++ b/release-mcp-version.groovy
@@ -20,88 +20,88 @@
  *   NOTIFY_RECIPIENTS
  *   NOTIFY_TEXT
  *
- */
+*/
 
 common = new com.mirantis.mk.Common()
 git = new com.mirantis.mk.Git()
 
 def triggerAptlyPromoteJob(aptlyUrl, components, diffOnly, dumpPublish, packages, recreate, source, storages, target){
   build job: "aptly-promote-all-testing-stable", parameters: [
-    [$class: 'StringParameterValue', name: 'APTLY_URL', value: aptlyUrl],
-    [$class: 'StringParameterValue', name: 'COMPONENTS', value: components],
-    [$class: 'BooleanParameterValue', name: 'DIFF_ONLY', value: diffOnly],
-    [$class: 'BooleanParameterValue', name: 'DUMP_PUBLISH', value: dumpPublish],
-    [$class: 'StringParameterValue', name: 'PACKAGES', value: packages],
-    [$class: 'BooleanParameterValue', name: 'RECREATE', value: recreate],
-    [$class: 'StringParameterValue', name: 'SOURCE', value: source],
-    [$class: 'StringParameterValue', name: 'STORAGES', value: storages],
-    [$class: 'StringParameterValue', name: 'TARGET', value: target]
+  [$class: 'StringParameterValue', name: 'APTLY_URL', value: aptlyUrl],
+  [$class: 'StringParameterValue', name: 'COMPONENTS', value: components],
+  [$class: 'BooleanParameterValue', name: 'DIFF_ONLY', value: diffOnly],
+  [$class: 'BooleanParameterValue', name: 'DUMP_PUBLISH', value: dumpPublish],
+  [$class: 'StringParameterValue', name: 'PACKAGES', value: packages],
+  [$class: 'BooleanParameterValue', name: 'RECREATE', value: recreate],
+  [$class: 'StringParameterValue', name: 'SOURCE', value: source],
+  [$class: 'StringParameterValue', name: 'STORAGES', value: storages],
+  [$class: 'StringParameterValue', name: 'TARGET', value: target]
   ]
 }
 
 def triggerDockerMirrorJob(dockerCredentials, dockerRegistryUrl, targetTag, imageList, sourceImageTag) {
   build job: "docker-images-mirror", parameters: [
-    [$class: 'StringParameterValue', name: 'TARGET_REGISTRY_CREDENTIALS_ID', value: dockerCredentials],
-    [$class: 'StringParameterValue', name: 'REGISTRY_URL', value: dockerRegistryUrl],
-    [$class: 'StringParameterValue', name: 'IMAGE_TAG', value: targetTag],
-    [$class: 'StringParameterValue', name: 'IMAGE_LIST', value: imageList],
-    [$class: 'StringParameterValue', name: 'SOURCE_IMAGE_TAG', value: sourceImageTag]
+  [$class: 'StringParameterValue', name: 'TARGET_REGISTRY_CREDENTIALS_ID', value: dockerCredentials],
+  [$class: 'StringParameterValue', name: 'REGISTRY_URL', value: dockerRegistryUrl],
+  [$class: 'StringParameterValue', name: 'IMAGE_TAG', value: targetTag],
+  [$class: 'StringParameterValue', name: 'IMAGE_LIST', value: imageList],
+  [$class: 'StringParameterValue', name: 'SOURCE_IMAGE_TAG', value: sourceImageTag]
   ]
 }
 
 def triggerMirrorRepoJob(snapshotId, snapshotName) {
   build job: "mirror-snapshot-name-all", parameters: [
-    [$class: 'StringParameterValue', name: 'SNAPSHOT_NAME', value: snapshotName],
-    [$class: 'StringParameterValue', name: 'SNAPSHOT_ID', value: snapshotId]
+  [$class: 'StringParameterValue', name: 'SNAPSHOT_NAME', value: snapshotName],
+  [$class: 'StringParameterValue', name: 'SNAPSHOT_ID', value: snapshotId]
   ]
 }
 
-def triggerGitTagJob(gitRepoList, gitCredentials, tag, source_tag) {
+def triggerGitTagJob(gitRepoList, gitCredentials, tag, sourceTag) {
   build job: "tag-git-repos-stable", parameters: [
-    [$class: 'StringParameterValue', name: 'GIT_REPO_LIST', value: gitRepoList],
-    [$class: 'StringParameterValue', name: 'GIT_CREDENTIALS', value: gitCredentials],
-    [$class: 'StringParameterValue', name: 'TAG', value: tag],
-    [$class: 'StringParameterValue', name: 'SOURCE_TAG', value: source_tag],
+  [$class: 'StringParameterValue', name: 'GIT_REPO_LIST', value: gitRepoList],
+  [$class: 'StringParameterValue', name: 'GIT_CREDENTIALS', value: gitCredentials],
+  [$class: 'StringParameterValue', name: 'TAG', value: tag],
+  [$class: 'StringParameterValue', name: 'SOURCE_TAG', value: sourceTag]
   ]
 }
 
 timeout(time: 12, unit: 'HOURS') {
-    node() {
-        try {
-            stage("Promote"){
-                if(RELEASE_APTLY.toBoolean())
-                {
-                    common.infoMsg("Promoting Aptly")
-                    triggerAptlyPromoteJob(APTLY_URL, 'all', false, true, 'all', false, "(.*)/${SOURCE_REVISION}", APTLY_STORAGES, "{0}/${TARGET_REVISION}")
-                }
+  node() {
+    try {
+      stage("Promote"){
+        if(RELEASE_APTLY.toBoolean())
+        {
+          common.infoMsg("Promoting Aptly")
+          triggerAptlyPromoteJob(APTLY_URL, 'all', false, true, 'all', false, "(.*)/${SOURCE_REVISION}", APTLY_STORAGES, "{0}/${TARGET_REVISION}")
+        }
 
-                if(RELEASE_DEB_MIRRORS.toBoolean()){
-                    common.infoMsg("Promoting Debmirrors")
-                    triggerMirrorRepoJob(SOURCE_REVISION, TARGET_REVISION)
-                }
+        if(RELEASE_DEB_MIRRORS.toBoolean()){
+          common.infoMsg("Promoting Debmirrors")
+          triggerMirrorRepoJob(SOURCE_REVISION, TARGET_REVISION)
+        }
 
-                if(RELEASE_DOCKER.toBoolean())
-                {
-                    common.infoMsg("Promoting Docker images")
-                    triggerDockerMirrorJob(DOCKER_CREDENTIALS, DOCKER_URL, TARGET_REVISION, DOCKER_IMAGES, SOURCE_REVISION)
-                }
+        if(RELEASE_DOCKER.toBoolean())
+        {
+          common.infoMsg("Promoting Docker images")
+          triggerDockerMirrorJob(DOCKER_CREDENTIALS, DOCKER_URL, TARGET_REVISION, DOCKER_IMAGES, SOURCE_REVISION)
+        }
 
-                if(RELEASE_GIT.toBoolean())
-                {
-                    common.infoMsg("Promoting Git repositories")
-                    triggerGitTagJob(GIT_REPO_LIST, GIT_CREDENTIALS, TARGET_REVISION)
+        if(RELEASE_GIT.toBoolean())
+        {
+          common.infoMsg("Promoting Git repositories")
+          triggerGitTagJob(GIT_REPO_LIST, GIT_CREDENTIALS, TARGET_REVISION, SOURCE_REVISION)
 
-                }
-                if (EMAIL_NOTIFY.toBoolean()) {
-                    emailext(to: NOTIFY_RECIPIENTS,
-                        body: NOTIFY_TEXT,
-                        subject: "MCP Promotion has been done")
-                }
-            }
-        } catch (Throwable e) {
+        }
+        if (EMAIL_NOTIFY.toBoolean()) {
+          emailext(to: NOTIFY_RECIPIENTS,
+            body: NOTIFY_TEXT,
+            subject: "MCP Promotion has been done")
+        }
+      }
+      } catch (Throwable e) {
             // If there was an error or exception thrown, the build failed
             currentBuild.result = "FAILURE"
             throw e
+          }
         }
-    }
-}
\ No newline at end of file
+      }
\ No newline at end of file
diff --git a/tag-git-repos.groovy b/tag-git-repos.groovy
index 68229a6..dabbb7f 100644
--- a/tag-git-repos.groovy
+++ b/tag-git-repos.groovy
@@ -1,55 +1,58 @@
+
 /**
- *
- * Tag Git repositories
- *
- * Expected parameters:
- *   GIT_REPO_LIST
- *   GIT_CREDENTIALS
- *   TAG
- *   SOURCE_TAG initial commit\tag to be tagged with TAG
- *
- */
+*
+* Tag Git repositories
+*
+* Expected parameters:
+*   GIT_REPO_LIST
+*   GIT_CREDENTIALS
+*   TAG
+*   SOURCE_TAG initial commit\tag to be tagged with TAG
+*
+*/
 
 common = new com.mirantis.mk.Common()
 git = new com.mirantis.mk.Git()
 
 def gitRepoAddTag(repoURL, repoName, tag, credentials, ref = "HEAD"){
-    git.checkoutGitRepository(repoName, repoURL, "master", credentials)
-    dir(repoName) {
-        sh "git tag -f -a ${tag} ${ref} -m \"Release of mcp version ${tag}\""
-        sshagent([credentials]) {
-            sh "git push -f origin ${tag}:refs/tags/${tag}"
-        }
+  common.infoMsg("Tagging: ${repoURL} ${ref} => ${tag}")
+  git.checkoutGitRepository(repoName, repoURL, "master", credentials)
+  dir(repoName) {
+    sh "git tag -f -a ${tag} ${ref} -m \"Release of mcp version ${tag}\""
+    sshagent([credentials]) {
+      sh "git push -f origin ${tag}:refs/tags/${tag}"
     }
+  }
 }
 
 timeout(time: 12, unit: 'HOURS') {
-    node() {
-        try {
-            def repos = GIT_REPO_LIST.tokenize('\n')
-            def repoUrl, repoName, repoCommit, repoArray
-            for (repo in repos){
-                if(repo.startsWith('#'))
-                  common.warningMsg("Skipping:" + repo.toString())
-                  continue
-                if(repo.trim().indexOf(' ') == -1){
-                    throw new IllegalArgumentException("Wrong format of repository and commit input")
-                }
-                repoArray = repo.trim().tokenize(' ')
-                repoName = repoArray[0]
-                repoUrl = repoArray[1]
-                repoCommit = repoArray[2]
-                if (repoCommit.contains('SUBS_SOURCE_REF')) {
-                    common.warningMsg("Replacing SUBS_SOURCE_REF => ${SOURCE_TAG}")
-                    repoCommit.replace('SUBS_SOURCE_REF', SOURCE_TAG
-                        )
-                }
-                gitRepoAddTag(repoUrl, repoName, TAG, GIT_CREDENTIALS, repoCommit)
-            }
-        } catch (Throwable e) {
+  node() {
+    try {
+      def repos = GIT_REPO_LIST.tokenize('\n')
+      def repoUrl, repoName, repoCommit, repoArray
+      for (repo in repos){
+        if(repo.startsWith('#')){
+          common.warningMsg("Skipping repo ${repo}")
+          continue
+        }
+        if(repo.trim().indexOf(' ') == -1){
+          throw new IllegalArgumentException("Wrong format of repository and commit input")
+        }
+        repoArray = repo.trim().tokenize(' ')
+        repoName = repoArray[0]
+        repoUrl = repoArray[1]
+        repoCommit = repoArray[2]
+        if (repoCommit.contains('SUBS_SOURCE_REF')) {
+          common.warningMsg("Replacing SUBS_SOURCE_REF => ${SOURCE_TAG}")
+          repoCommit.replace('SUBS_SOURCE_REF', SOURCE_TAG
+            )
+        }
+        gitRepoAddTag(repoUrl, repoName, TAG, GIT_CREDENTIALS, repoCommit)
+      }
+      } catch (Throwable e) {
             // If there was an error or exception thrown, the build failed
             currentBuild.result = "FAILURE"
             throw e
+          }
         }
-    }
-}
+      }
