diff --git a/src/com/mirantis/mk/Common.groovy b/src/com/mirantis/mk/Common.groovy
index a44bcdf..33d4831 100644
--- a/src/com/mirantis/mk/Common.groovy
+++ b/src/com/mirantis/mk/Common.groovy
@@ -188,30 +188,30 @@
     }
 }
 
+def getColorizedString(msg, color){
+  def  colorMap = [
+    'red'   : '\u001B[31m',
+    'black' : '\u001B[30m',
+    'green' : '\u001B[32m',
+    'yellow': '\u001B[33m',
+    'blue'  : '\u001B[34m',
+    'purple': '\u001B[35m',
+    'cyan'  : '\u001B[36m',
+    'white' : '\u001B[37m',
+    'reset' : '\u001B[0m'
+  ]
+
+  return "${colorMap[color]}${msg}${colorMap.reset}"
+}
+
 /**
  * Print message
  *
  * @param msg Message to be printed
- * @param level Level of message (default INFO)
- * @param color Color to use for output or false (default)
+ * @param color Color to use for output
  */
-def printMsg(msg, color = false) {
-    colors = [
-        'red'   : '\u001B[31m',
-        'black' : '\u001B[30m',
-        'green' : '\u001B[32m',
-        'yellow': '\u001B[33m',
-        'blue'  : '\u001B[34m',
-        'purple': '\u001B[35m',
-        'cyan'  : '\u001B[36m',
-        'white' : '\u001B[37m',
-        'reset' : '\u001B[0m'
-    ]
-    if (color != false) {
-        print "${colors[color]}${msg}${colors.reset}"
-    } else {
-        print "[${level}] ${msg}"
-    }
+def printMsg(msg, color) {
+    print getColorizedString(msg, color)
 }
 
 /**
@@ -714,4 +714,89 @@
         filename = filename.take(filename.lastIndexOf(remove_ext.toString()))
     }
     return filename
-}
\ No newline at end of file
+}
+
+/**
+* Return colored string of specific stage in stageMap
+*
+* @param stageMap  LinkedHashMap object.
+* @param stageName The name of current stage we are going to execute.
+* @param color     Text color
+**/
+def getColoredStageView(stageMap, stageName, color){
+  def stage = stageMap[stageName]
+  def banner = []
+  def currentStageIndex = new ArrayList<String>(stageMap.keySet()).indexOf(stageName)
+  def numberOfStages = stageMap.keySet().size() - 1
+
+  banner.add(getColorizedString(
+    "=========== Stage ${currentStageIndex}/${numberOfStages}: ${stageName} ===========", color))
+  for (stage_item in stage.keySet()){
+    banner.add(getColorizedString(
+    "${stage_item}: ${stage[stage_item]}", color))
+  }
+  banner.add('\n')
+
+  return banner
+}
+
+/**
+* Pring stageMap to console with specified color
+*
+* @param stageMap        LinkedHashMap object with stages information.
+* @param currentStage    The name of current stage we are going to execute.
+*
+**/
+def printCurrentStage(stageMap, currentStage){
+  print getColoredStageView(stageMap, currentStage, "cyan").join('\n')
+}
+
+/**
+* Pring stageMap to console with specified color
+*
+* @param stageMap   LinkedHashMap object.
+* @param baseColor  Text color (default white)
+**/
+def printStageMap(stageMap, baseColor="white"){
+  def banner = []
+  def index = 0
+  for (stage_name in stageMap.keySet()){
+    banner.addAll(getColoredStageView(stageMap, stage_name,  baseColor))
+  }
+  print banner.join('\n')
+}
+
+/**
+* Wrap provided code in stage, and do interactive retires if needed.
+*
+* @param stageMap        LinkedHashMap object with stages information.
+* @param currentStage    The name of current stage we are going to execute.
+* @param target          Target host to execute stage on.
+* @param interactive     Boolean flag to specify if interaction with user is enabled.
+* @param body            Command to be in stage block.
+**/
+def stageWrapper(stageMap, currentStage, target, interactive=true, Closure body) {
+  def common = new com.mirantis.mk.Common()
+  def banner = []
+
+  printCurrentStage(stageMap, currentStage)
+
+  stage(currentStage){
+    input message: getColorizedString("We are going to execute stage \'${currentStage}\' on the following target ${target}.\nPlease review stage information above.", "yellow")
+    try {
+      return body.call()
+      stageMap[currentStage]['Status'] = "SUCCESS"
+    } catch (Exception err) {
+      def msg = "Stage ${currentStage} failed with the following exception:\n${err}"
+      print getColorizedString(msg, "yellow")
+      common.errorMsg(err)
+      if (interactive){
+        input message: getColorizedString("Please make sure problem is fixed to proceed with retry. Ready to proceed?", "yellow")
+        stageMap[currentStage]['Status'] = "RETRYING"
+        stageWrapper(stageMap, currentStage, target, interactive, body)
+      } else {
+        error(msg)
+      }
+    }
+  }
+}
diff --git a/src/com/mirantis/mk/Openstack.groovy b/src/com/mirantis/mk/Openstack.groovy
index fa60053..37fc73e 100644
--- a/src/com/mirantis/mk/Openstack.groovy
+++ b/src/com/mirantis/mk/Openstack.groovy
@@ -426,7 +426,7 @@
     def salt = new com.mirantis.mk.Salt()
     def common = new com.mirantis.mk.Common()
     for (s in services) {
-        def outputServicesStr = salt.getReturnValues(salt.cmdRun(env, "${probe}*", "service --status-all | grep ${s} | awk \'{print \$4}\'"))
+        def outputServicesStr = salt.getReturnValues(salt.cmdRun(env, probe, "service --status-all | grep ${s} | awk \'{print \$4}\'"))
         def servicesList = outputServicesStr.tokenize("\n").init()
         if (confirm) {
             if (servicesList) {
@@ -434,7 +434,7 @@
                     input message: "Click PROCEED to stop ${servicesList}. Otherwise click ABORT to skip stopping them."
                     for (name in servicesList) {
                         if (!name.contains('Salt command')) {
-                            salt.runSaltProcessStep(env, "${target}*", 'service.stop', ["${name}"])
+                            salt.runSaltProcessStep(env, target, 'service.stop', ["${name}"])
                         }
                     }
                 } catch (Exception er) {
@@ -445,7 +445,7 @@
             if (servicesList) {
                 for (name in servicesList) {
                     if (!name.contains('Salt command')) {
-                        salt.runSaltProcessStep(env, "${target}*", 'service.stop', ["${name}"])
+                        salt.runSaltProcessStep(env, target, 'service.stop', ["${name}"])
                     }
                 }
             }
diff --git a/src/com/mirantis/mk/Orchestrate.groovy b/src/com/mirantis/mk/Orchestrate.groovy
index 1157083..b2dfe18 100644
--- a/src/com/mirantis/mk/Orchestrate.groovy
+++ b/src/com/mirantis/mk/Orchestrate.groovy
@@ -255,6 +255,15 @@
         }
         salt.enforceState(master, "I@redis:server ${extra_tgt}", 'redis')
     }
+
+    // Install DNS services
+    if (salt.testTarget(master, "I@bind:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@bind:server ${extra_tgt}", 'bind.server')
+    }
+    if (salt.testTarget(master, "I@powerdns:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@powerdns:server ${extra_tgt}", 'powerdns.server')
+    }
+
     installBackup(master, 'common', extra_tgt)
 }
 
@@ -397,12 +406,6 @@
 
     // Install designate services
     if (salt.testTarget(master, "I@designate:server:enabled ${extra_tgt}")) {
-        if (salt.testTarget(master, "I@designate:server:backend:bind9 ${extra_tgt}")) {
-            salt.enforceState(master, "I@bind:server ${extra_tgt}", 'bind.server')
-        }
-        if (salt.testTarget(master, "I@designate:server:backend:pdns4 ${extra_tgt}")) {
-            salt.enforceState(master, "I@powerdns:server ${extra_tgt}", 'powerdns.server')
-        }
         salt.enforceState(master, "I@designate:server and *01* ${extra_tgt}", 'designate.server')
         salt.enforceState(master, "I@designate:server ${extra_tgt}", 'designate')
     }
diff --git a/src/com/mirantis/mk/Salt.groovy b/src/com/mirantis/mk/Salt.groovy
index eb7b168..e2f4189 100644
--- a/src/com/mirantis/mk/Salt.groovy
+++ b/src/com/mirantis/mk/Salt.groovy
@@ -599,7 +599,7 @@
  */
 def getFirstMinion(saltId, target) {
     def minionsSorted = getMinionsSorted(saltId, target)
-    return minionsSorted[0].split("\\.")[0]
+    return minionsSorted[0]
 }
 
 /**
