diff --git a/src/com/mirantis/mk/Common.groovy b/src/com/mirantis/mk/Common.groovy
index a44bcdf..336b4dc 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/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')
     }
