diff --git a/src/com/mirantis/mk/Common.groovy b/src/com/mirantis/mk/Common.groovy
index a605b44..c515124 100644
--- a/src/com/mirantis/mk/Common.groovy
+++ b/src/com/mirantis/mk/Common.groovy
@@ -101,7 +101,7 @@
  * @param color Colorful output or not
  */
 def warningMsg(msg, color = true) {
-    printMsg(msg, "blue")
+    printMsg(msg, "yellow")
 }
 
 /**
diff --git a/src/com/mirantis/mk/Salt.groovy b/src/com/mirantis/mk/Salt.groovy
index f6f5554..af90a08 100644
--- a/src/com/mirantis/mk/Salt.groovy
+++ b/src/com/mirantis/mk/Salt.groovy
@@ -1,7 +1,7 @@
 package com.mirantis.mk
 
-import static groovy.json.JsonOutput.prettyPrint;
-import static groovy.json.JsonOutput.toJson;
+import static groovy.json.JsonOutput.prettyPrint
+import static groovy.json.JsonOutput.toJson
 
 /**
  * Salt functions
@@ -194,6 +194,18 @@
 }
 
 /**
+ * Get running minions IDs according to the target
+ * @param master Salt connection object
+ * @param target Get minions target
+ * @return list of active minions fitin
+ */
+def getMinions(master, target) {
+    def minionsRaw = runSaltCommand(master, 'local', target, 'test.ping')
+    return new ArrayList<String>(minionsRaw['return'][0].keySet())
+}
+
+
+/**
  * Generates node key using key.gen_accept call
  * @param master Salt connection object
  * @param target Key generating target
@@ -264,41 +276,45 @@
  */
 def checkResult(result, failOnError = true) {
     def common = new com.mirantis.mk.Common()
-    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 (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
+    if(result != null){
+        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}")
                     }
-                    resource = node[resKey]
-                    common.debugMsg("checkResult: 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}")
+                }
+                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.debugMsg("checkResult: 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}")
         }
     }else{
-        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
+        common.errorMsg("Cannot check salt result, given result is null")
     }
 }
 
@@ -306,23 +322,66 @@
  * Print Salt state run results in human-friendly form
  *
  * @param result        Parsed response of Salt API
- * @param onlyChanges   If true (default), print only changed resources
- *                      parsing
+  * @param onlyChanges   If true (default), print only changed resources
  */
 def printSaltStateResult(result, onlyChanges = true) {
     def common = new com.mirantis.mk.Common()
-     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.debugMsg("printSaltStateResult: printing salt state entry: ${entry}")
-                def nodeKey = entry.keySet()[j]
-                def node=entry[nodeKey]
-                common.infoMsg(String.format("Node %s changes:\n%s",nodeKey,prettyPrint(toJson(node))))
+    if(result != null){
+        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.debugMsg("printSaltStateResult: printing salt command entry: ${entry}")
+                    def nodeKey = entry.keySet()[j]
+                    def node=entry[nodeKey]
+                    common.infoMsg("Node ${nodeKey} changes:")
+                    if(node instanceof Map || node instanceof List){
+                        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 Map && resource.keySet().contains("result")){
+                                //clean unnesaccary fields
+                                if(resource.keySet().contains("__run_num__")){
+                                    resource.remove("__run_num__")
+                                }
+                                if(resource.keySet().contains("__id__")){
+                                    resource.remove("__id__")
+                                }
+                                if(resource.keySet().contains("pchanges")){
+                                    resource.remove("pchanges")
+                                }
+
+                                if(!resource["result"] || (resource["result"] instanceof String && resource["result"] != "true")){
+                                    if(resource["result"] != null){
+                                        common.errorMsg(String.format("Resource: %s\n%s", resKey, prettyPrint(toJson(resource)).replace('\\n', System.getProperty('line.separator'))))
+                                    }else{
+                                        common.warningMsg(String.format("Resource: %s\n%s", resKey, prettyPrint(toJson(resource)).replace('\\n', System.getProperty('line.separator'))))
+                                    }
+                                }else{
+                                    if(!onlyChanges || resource.changes.size() > 0){
+                                        common.successMsg(String.format("Resource: %s\n%s", resKey, prettyPrint(toJson(resource)).replace('\\n', System.getProperty('line.separator'))))
+                                    }
+                                }
+                            }else{
+                                common.infoMsg(String.format("Resource: %s\n%s", resKey, prettyPrint(toJson(resource)).replace('\\n', System.getProperty('line.separator'))))
+                            }
+                        }
+                    }else{
+                        common.infoMsg(prettyPrint(toJson(node)))
+                    }
+                }
             }
+        }else{
+            common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
         }
     }else{
-        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
+        common.errorMsg("Cannot print salt state result, given result is null")
     }
 }
 
@@ -333,17 +392,21 @@
  */
 def printSaltCommandResult(result) {
     def common = new com.mirantis.mk.Common()
-    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.debugMsg("printSaltCommandResult: printing salt command entry: ${entry}")
-                def nodeKey = entry.keySet()[j]
-                def node=entry[nodeKey]
-                common.infoMsg(String.format("Node %s changes:\n%s", nodeKey, prettyPrint(toJson(node))))
+    if(result != null){
+        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.debugMsg("printSaltCommandResult: printing salt command entry: ${entry}")
+                    def nodeKey = entry.keySet()[j]
+                    def node=entry[nodeKey]
+                    common.infoMsg(String.format("Node %s changes:\n%s",nodeKey,prettyPrint(toJson(node)).replace('\\n', System.getProperty('line.separator'))))
+                }
             }
+        }else{
+            common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
         }
     }else{
-        common.errorMsg("Salt result hasn't return attribute! Result: ${result}")
+        common.errorMsg("Cannot print salt command result, given result is null")
     }
 }
