diff --git a/src/com/mirantis/mk/Salt.groovy b/src/com/mirantis/mk/Salt.groovy
index 92d6727..c1aaacb 100644
--- a/src/com/mirantis/mk/Salt.groovy
+++ b/src/com/mirantis/mk/Salt.groovy
@@ -601,15 +601,44 @@
 */
 def waitForMinion(result) {
     def common = new com.mirantis.mk.Common()
-    def matcher = result =~ /(?s).*salt_minion_service_restart.*?(changes:\[.*?\])/
+    //In order to prevent multiple sleeps use bool variable to catch restart for any minion.
     def isMinionRestarted = false
-    while (matcher.find()) {
-        if (matcher.group(1) != null && matcher.group(1).contains("pid")) {
-            isMinionRestarted = true
+    if(result != null){
+        if(result['return']){
+            for (int i=0;i<result['return'].size();i++) {
+                def entry = result['return'][i]
+                // exit in case of empty response.
+                if (!entry) {
+                    return
+                }
+                // Loop for nodes
+                for (int j=0;j<entry.size();j++) {
+                    def nodeKey = entry.keySet()[j]
+                    def node=entry[nodeKey]
+                    if(node instanceof Map || node instanceof List){
+                        // Loop for node resources
+                        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(resKey.contains("salt_minion_service_restart") && resource instanceof Map && resource.keySet().contains("result")){
+                                if((resource["result"] instanceof Boolean && resource["result"]) || (resource["result"] instanceof String && resource["result"] == "true")){
+                                    if(resource.changes.size() > 0){
+                                        isMinionRestarted=true
+                                    }
+                                }
+                            }
+                        }
+                    }
+                }
+            }
         }
     }
-    // There is an exception when use sleep after defined Matcher. Therefore destroy the matcher.
-    matcher = null
     if (isMinionRestarted){
         common.infoMsg("Salt minion service restart detected. Sleep 10 seconds to wait minion restart")
         sleep(10)
