diff --git a/src/com/mirantis/mk/Common.groovy b/src/com/mirantis/mk/Common.groovy
index 6a01a12..be9540b 100644
--- a/src/com/mirantis/mk/Common.groovy
+++ b/src/com/mirantis/mk/Common.groovy
@@ -32,9 +32,15 @@
  *
  * @param id    Credentials name
  */
-def getCredentials(id) {
+def getCredentials(id, cred_type = "username_password") {
+    def credClass;
+    if(cred_type == "username_password"){
+        credClass = com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials.class
+    }else if(cred_type == "key"){
+        credClass = com.cloudbees.jenkins.plugins.sshcredentials.impl.BasicSSHUserPrivateKey.class
+    }
     def creds = com.cloudbees.plugins.credentials.CredentialsProvider.lookupCredentials(
-                    com.cloudbees.plugins.credentials.common.StandardUsernamePasswordCredentials.class,
+                    credClass,
                     jenkins.model.Jenkins.instance
                 )
 
@@ -99,6 +105,23 @@
 }
 
 /**
+ * Print debug message, this message will show only if DEBUG global variable is present
+ * @param msg
+ * @param color Colorful output or not
+ */
+def debugMsg(msg, color = true){
+    def debugEnabled
+    try {
+        debugEnabled = DEBUG
+    } catch (MissingPropertyException e) {
+        debugEnabled = false
+    }
+    if(debugEnabled){
+        printMsg(msg, "red")
+    }
+}
+
+/**
  * Print message
  *
  * @param msg        Message to be printed
diff --git a/src/com/mirantis/mk/Salt.groovy b/src/com/mirantis/mk/Salt.groovy
index 91da71f..285de00 100644
--- a/src/com/mirantis/mk/Salt.groovy
+++ b/src/com/mirantis/mk/Salt.groovy
@@ -261,25 +261,41 @@
  */
 def checkResult(result, failOnError = true) {
     def common = new com.mirantis.mk.Common()
-    for (entry in result['return']) {
-        if (!entry) {
-            if (failOnError) {
-                throw new Exception("Salt API returned empty response: ${result}")
-            } else {
-                common.errorMsg("Salt API returned empty response: ${result}")
+    if(result['return']){
+        for (int i=0;i<result['return'].size();i++) {
+            def entry = result['return'][i]
+            if (!entry) {
+                if (failOnError) {
+                    throw new Exception("Salt API returned empty response: ${result}")
+                } else {
+                    common.errorMsg("Salt API returned empty response: ${result}")
+                }
             }
-        }
-        for (node in entry) {
-            for (resource in node.value) {
-                if(!resource[result] || resource[result] != "true") {
-                    if (failOnError) {
-                        throw new Exception("Salt state on node ${node.key} failed: ${node.value}")
-                    } else {
-                        common.errorMsg("Salt state on node ${node.key} failed: ${node.value}")
+            for (int j=0;j<entry.size();j++) {
+                def nodeKey = entry.keySet()[j]
+                def node=entry[nodeKey]
+                for (int k=0;k<node.size();k++) {
+                    def resource;
+                    def resKey;
+                    if(node instanceof Map){
+                        resKey = node.keySet()[k]
+                    }else if(node instanceof List){
+                        resKey = k
+                    }
+                    resource = node[resKey]
+                    common.errorMsg("Checking resource: ${resource}")
+                    if(resource instanceof String || !resource["result"] || (resource["result"] instanceof String && resource["result"] != "true")){
+                        if (failOnError) {
+                            throw new Exception("Salt state on node ${nodeKey} failed: ${resource}. State output: ${node}")
+                        } else {
+                            common.errorMsg("Salt state on node ${nodeKey} failed: ${resource}. State output: ${node}")
+                        }
                     }
                 }
             }
         }
+    }else{
+        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
     }
 }
 
@@ -293,30 +309,49 @@
 def printSaltStateResult(result, onlyChanges = true) {
     def common = new com.mirantis.mk.Common()
     def out = [:]
-    for (entry in result['return']) {
-        for (node in entry) {
-            out[node.key] = [:]
-            for (resource in node.value) {
-                if (resource instanceof String) {
-                    out[node.key] = node.value
-                } else if (resource.value.result.toString().toBoolean() == false || resource.value.changes || onlyChanges == false) {
-                    out[node.key][resource.key] = resource.value
-
-                    //if (resource.value.result.toString().toBoolean() == false && resource.key instanceof String && node.key instanceof String) {
-                    //    common.warningMsg("Resource ${resource.key} failed on node ${node.key}!")
-                    //}
+    if(result['return']){
+        for (int i=0; i<result['return'].size(); i++) {
+            def entry = result['return'][i]
+            for (int j=0; j<entry.size(); j++) {
+                common.errorMsg("Entry is: ${entry}")
+                def nodeKey = entry.keySet()[j]
+                def node=entry[nodeKey]
+                out[nodeKey] = [:]
+                if(node instanceof Iterable){
+                    for (int k=0; k<node.size(); k++) {
+                        def resource;
+                        def resKey;
+                        if(node instanceof Map){
+                            resKey = node.keySet()[k]
+                        }else if(node instanceof List){
+                            resKey=k
+                        }
+                        resource = node[resKey]
+                        if (resource instanceof String) {
+                            //ORIGINAL??out[node.key] = node.value
+                            out[nodeKey][resKey] = resource
+                        } else if (resource.result.toString().toBoolean() == false || resource.changes || onlyChanges == false) {
+                            out[nodeKey][resKey] = resource.value
+                        }
+                    }
+                } else {
+                    out[nodeKey] = node.toString();
                 }
             }
         }
-    }
 
-    for (node in out) {
-        if (node.value) {
-            println "Node ${node.key} changes:"
-            print new groovy.json.JsonBuilder(node.value).toPrettyString().replace('\\n', System.getProperty('line.separator'))
-        } else {
-            println "No changes for node ${node.key}"
+        for (int i=0; i<out.size(); i++) {
+            def nodeKey = out.keySet()[i]
+            def node=out[nodeKey]
+            if (node) {
+                println "Node ${nodeKey} changes:"
+                print new groovy.json.JsonBuilder(node).toPrettyString().replace('\\n', System.getProperty('line.separator'))
+            } else {
+                println "No changes for node ${nodeKey}"
+            }
         }
+    }else{
+        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
     }
 }
 
@@ -326,22 +361,46 @@
  * @param result        Parsed response of Salt API
  */
 def printSaltCommandResult(result) {
+    def common = new com.mirantis.mk.Common()
     def out = [:]
-    for (entry in result['return']) {
-        for (node in entry) {
-            out[node.key] = [:]
-            for (resource in node.value) {
-                out[node.key] = node.value
+    if(result['return']){
+        for (int i=0; i<result['return'].size(); i++) {
+            def entry = result['return'][i]
+            for (int j=0; j<entry.size(); j++) {
+                common.errorMsg("Entry is: ${entry}")
+                def nodeKey = entry.keySet()[j]
+                def node=entry[nodeKey]
+                out[nodeKey] = [:]
+                if(node instanceof Iterable){
+                    for (int k=0; k<node.size(); k++) {
+                        def resource;
+                        def resKey;
+                        if(node instanceof Map){
+                            resKey = node.keySet()[k]
+                        }else if(node instanceof List){
+                            resKey=k
+                        }
+                        resource = node[resKey]
+                        //ORIGINAL??out[node.key] = node.value
+                        out[nodeKey][resKey] = resource
+                    }
+                } else {
+                    out[nodeKey] = node.toString();
+                }
             }
         }
-    }
 
-    for (node in out) {
-        if (node.value) {
-            println "Node ${node.key} changes:"
-            print new groovy.json.JsonBuilder(node.value).toPrettyString()
-        } else {
-            println "No changes for node ${node.key}"
+        for (int i=0; i<out.size(); i++) {
+            def nodeKey = out.keySet()[i]
+            def node = out[nodeKey]
+            if (node) {
+                common.infoMsg("Node ${nodeKey} changes:")
+                common.infoMsg(new groovy.json.JsonBuilder(node).toPrettyString())
+            } else {
+                common.infoMsg("No changes for node ${nodeKey}")
+            }
         }
+    }else{
+        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
     }
 }
