diff --git a/src/com/mirantis/mk/Common.groovy b/src/com/mirantis/mk/Common.groovy
index 7167b08..8dc2bf6 100644
--- a/src/com/mirantis/mk/Common.groovy
+++ b/src/com/mirantis/mk/Common.groovy
@@ -564,39 +564,39 @@
 
  */
 def diffCheckMultidir(diffData) {
-  common = new com.mirantis.mk.Common()
-  // Some global constants. Don't change\move them!
-  keyNew = 'new'
-  keyRemoved = 'removed'
-  keyDiff = 'diff'
-  def output = [
-      new    : [],
-      removed: [],
-      diff   : [],
-  ]
-  String pathSep = '/'
-  diffData.each { line ->
-    def job_file = ''
-    def job_type = ''
-    if (line.startsWith('Files old/')) {
-      job_file = new File(line.replace('Files old/', '').tokenize()[0])
-      job_type = keyDiff
-    } else if (line.startsWith('Only in new/')) {
-      // get clean normalized filepath, under new/
-      job_file = new File(line.replace('Only in new/', '').replace(': ', pathSep)).toString()
-      job_type = keyNew
-    } else if (line.startsWith('Only in old/')) {
-      // get clean normalized filepath, under old/
-      job_file = new File(line.replace('Only in old/', '').replace(': ', pathSep)).toString()
-      job_type = keyRemoved
-    } else {
-      common.warningMsg("Not parsed diff line: ${line}!")
+    common = new com.mirantis.mk.Common()
+    // Some global constants. Don't change\move them!
+    keyNew = 'new'
+    keyRemoved = 'removed'
+    keyDiff = 'diff'
+    def output = [
+        new    : [],
+        removed: [],
+        diff   : [],
+    ]
+    String pathSep = '/'
+    diffData.each { line ->
+        def job_file = ''
+        def job_type = ''
+        if (line.startsWith('Files old/')) {
+            job_file = new File(line.replace('Files old/', '').tokenize()[0])
+            job_type = keyDiff
+        } else if (line.startsWith('Only in new/')) {
+            // get clean normalized filepath, under new/
+            job_file = new File(line.replace('Only in new/', '').replace(': ', pathSep)).toString()
+            job_type = keyNew
+        } else if (line.startsWith('Only in old/')) {
+            // get clean normalized filepath, under old/
+            job_file = new File(line.replace('Only in old/', '').replace(': ', pathSep)).toString()
+            job_type = keyRemoved
+        } else {
+            common.warningMsg("Not parsed diff line: ${line}!")
+        }
+        if (job_file != '') {
+            output[job_type].push(job_file)
+        }
     }
-    if (job_file != '') {
-      output[job_type].push(job_file)
-    }
-  }
-  return output
+    return output
 }
 
 /**
@@ -614,88 +614,101 @@
  * TODO: implement proper regex?
  **/
 def comparePillars(compRoot, b_url, findRegEx) {
-  common = new com.mirantis.mk.Common()
-  //  findRegEx = '.*.infra/secrets.yml'
-  //  if (findRegEx) {
-  //    withEnv(["S_REGEX=${findRegEx}"]) {
-  //      sh(script: """
-  //        find ${dir1} ${dir2} -type f \\(  -regex '${findRegEx}' \\) > diff_exclude.list
-  //
-  //        """)
-  //      cmdline = '--exclude-from=diff_exclude.list'
-  //    }
-  //  }
-  // Some global constants. Don't change\move them!
-  keyNew = 'new'
-  keyRemoved = 'removed'
-  keyDiff = 'diff'
-  def diff_status = 0
-  // FIXME
-  httpWS = b_url + '/artifact/'
-  dir(compRoot) {
-    diff_status = sh(
-        // If diff empty - exit 0
-        script: """
+    common = new com.mirantis.mk.Common()
+    //  findRegEx = '.*.infra/secrets.yml'
+    //  if (findRegEx) {
+    //    withEnv(["S_REGEX=${findRegEx}"]) {
+    //      sh(script: """
+    //        find ${dir1} ${dir2} -type f \\(  -regex '${findRegEx}' \\) > diff_exclude.list
+    //
+    //        """)
+    //      cmdline = '--exclude-from=diff_exclude.list'
+    //    }
+    //  }
+    // Some global constants. Don't change\move them!
+    keyNew = 'new'
+    keyRemoved = 'removed'
+    keyDiff = 'diff'
+    def diff_status = 0
+    // FIXME
+    httpWS = b_url + '/artifact/'
+    dir(compRoot) {
+        diff_status = sh(
+            // If diff empty - exit 0
+            script: """
           diff -q -r old/ new/  > pillar.diff
           """,
-        returnStatus: true,
-    )
-  }
-  // Set job description
-  String description = ''
-  if (diff_status == 1) {
-    // Analyse output file and prepare array with results
-    String data_ = readFile file: "${compRoot}/pillar.diff"
-    def diff_list = diffCheckMultidir(data_.split("\\r?\\n"))
-    common.infoMsg(diff_list)
-    dir(compRoot) {
-      if (diff_list[keyDiff].size() > 0) {
-        if (!fileExists('diff')) {
-          sh('mkdir -p diff')
-        }
-        description += '<b>CHANGED</b><ul>'
-        common.infoMsg('Changed items:')
-        for (item in diff_list[keyDiff]) {
-          // We don't want to handle sub-dirs structure. So, simply make diff 'flat'
-          item_f = item.toString().replace('/', '_')
-          description += "<li><a href=\"${httpWS}/diff/${item_f}/*view*/\">${item}</a></li>"
-          // Generate diff file
-          def diff_exit_code = sh([
-              script      : "diff -U 50 old/${item} new/${item} > diff/${item_f}",
-              returnStdout: false,
-              returnStatus: true,
-          ])
-          // catch normal errors, diff should always return 1
-          if (diff_exit_code != 1) {
-            error 'Error with diff file generation'
-          }
-        }
-      }
-      if (diff_list[keyNew].size() > 0) {
-        description += '<b>ADDED</b><ul>'
-        for (item in diff_list[keyNew]) {
-          description += "<li><a href=\"${httpWS}/new/${item}/*view*/\">${item}</a></li>"
-        }
-      }
-      if (diff_list[keyRemoved].size() > 0) {
-        description += '<b>DELETED</b><ul>'
-        for (item in diff_list[keyRemoved]) {
-          description += "<li><a href=\"${httpWS}/old/${item}/*view*/\">${item}</a></li>"
-        }
-      }
-
+            returnStatus: true,
+        )
     }
-  }
+    // Set job description
+    String description = ''
+    if (diff_status == 1) {
+        // Analyse output file and prepare array with results
+        String data_ = readFile file: "${compRoot}/pillar.diff"
+        def diff_list = diffCheckMultidir(data_.split("\\r?\\n"))
+        common.infoMsg(diff_list)
+        dir(compRoot) {
+            if (diff_list[keyDiff].size() > 0) {
+                if (!fileExists('diff')) {
+                    sh('mkdir -p diff')
+                }
+                description += '<b>CHANGED</b><ul>'
+                common.infoMsg('Changed items:')
+                for (item in diff_list[keyDiff]) {
+                    // We don't want to handle sub-dirs structure. So, simply make diff 'flat'
+                    item_f = item.toString().replace('/', '_')
+                    description += "<li><a href=\"${httpWS}/diff/${item_f}/*view*/\">${item}</a></li>"
+                    // Generate diff file
+                    def diff_exit_code = sh([
+                        script      : "diff -U 50 old/${item} new/${item} > diff/${item_f}",
+                        returnStdout: false,
+                        returnStatus: true,
+                    ])
+                    // catch normal errors, diff should always return 1
+                    if (diff_exit_code != 1) {
+                        error 'Error with diff file generation'
+                    }
+                }
+            }
+            if (diff_list[keyNew].size() > 0) {
+                description += '<b>ADDED</b><ul>'
+                for (item in diff_list[keyNew]) {
+                    description += "<li><a href=\"${httpWS}/new/${item}/*view*/\">${item}</a></li>"
+                }
+            }
+            if (diff_list[keyRemoved].size() > 0) {
+                description += '<b>DELETED</b><ul>'
+                for (item in diff_list[keyRemoved]) {
+                    description += "<li><a href=\"${httpWS}/old/${item}/*view*/\">${item}</a></li>"
+                }
+            }
 
-  if (description != '') {
-    dir(compRoot) {
-      archiveArtifacts([
-          artifacts        : '**',
-          allowEmptyArchive: true,
-      ])
+        }
     }
-    return description.toString()
-  } else {
-    return 'No job changes'
-  }
+
+    if (description != '') {
+        dir(compRoot) {
+            archiveArtifacts([
+                artifacts        : '**',
+                allowEmptyArchive: true,
+            ])
+        }
+        return description.toString()
+    } else {
+        return 'No job changes'
+    }
 }
+
+/**
+ * Simple function, to get basename from string.
+ * line - path-string
+ * remove_ext - string, optionl. Drop file extenstion.
+ **/
+def GetBaseName(line, remove_ext) {
+    filename = line.toString().split('/').last()
+    if (remove_ext && filename.endsWith(remove_ext.toString())) {
+        filename = filename.take(filename.lastIndexOf(remove_ext.toString()))
+    }
+    return filename
+}
\ No newline at end of file
