diff --git a/change-config.groovy b/change-config.groovy
new file mode 100644
index 0000000..69f7519
--- /dev/null
+++ b/change-config.groovy
@@ -0,0 +1,93 @@
+/**
+ * Make change to the node(s) configuration
+ *
+ * Expected parameters:
+ *   SALT_MASTER_CREDENTIALS    Credentials to the Salt API.
+ *   SALT_MASTER_URL            Full Salt API address [https://10.10.10.1:8000].
+ *   TARGET_SERVERS             Salt compound target to match nodes to be updated [*, G@osfamily:debian].
+ *   TARGET_STATES              States to be applied, empty string means running highstate [linux, linux,openssh, salt.minion.grains].
+ *   TARGET_SUBSET_TEST         Number of nodes to test config changes, empty string means all targetted nodes.
+ *   TARGET_SUBSET_LIVE         Number of selected noded to live apply selected config changes.
+ *   TARGET_BATCH_LIVE          Batch size for the complete live config changes on all nodes, empty string means apply to all targetted nodes.
+ *
+**/
+
+def common = new com.mirantis.mk.Common()
+def salt = new com.mirantis.mk.Salt()
+
+def saltMaster
+def targetAll = ['expression': TARGET_SERVERS, 'type': 'compound']
+def targetTestSubset
+def targetLiveSubset
+def targetLiveAll
+def minions
+def result
+def states
+
+node() {
+    try {
+
+        if (TARGET_STATES != "") {
+            states = TARGET_STATES
+        }
+        else {
+            states = null
+        }
+
+        stage('Connect to Salt master') {
+            saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
+        }
+
+        stage('List target servers') {
+            minions = salt.getMinions(saltMaster, targetAll)
+            if (TARGET_SUBSET_TEST != "") {
+                targetTestSubset = ['expression': minions.subList(0, Integer.valueOf(TARGET_SUBSET_TEST)).join(' or '), 'type': 'compound']
+            }
+            else {
+                targetTestSubset = ['expression': minions.join(' or '), 'type': 'compound']
+            }
+            targetLiveSubset = ['expression': minions.subList(0, Integer.valueOf(TARGET_SUBSET_LIVE)).join(' or '), 'type': 'compound']
+            targetLiveAll = ['expression': minions.join(' or '), 'type': 'compound']
+            common.infoMsg("Found nodes: ${targetLiveAll.expression}")
+            common.infoMsg("Selected test nodes: ${targetTestSubset.expression}")
+            common.infoMsg("Selected sample nodes: ${targetLiveSubset.expression}")
+        }
+
+        stage('Test config changes') {
+            def kwargs = [
+                'test': true
+            ]
+            result = salt.runSaltCommand(saltMaster, 'local', targetTestSubset, 'state.apply', null, states, kwargs)
+            salt.printSaltStateResult(result)
+        }
+
+        stage('Confirm live changes on sample') {
+            timeout(time: 2, unit: 'HOURS') {
+               input message: "Approve live config change on ${targetLiveSubset.expression} nodes?"
+            }
+        }
+
+        stage('Apply config changes on sample') {
+            result = salt.runSaltCommand(saltMaster, 'local', targetLiveSubset, 'state.apply', null, states)
+            salt.printSaltStateResult(result)
+        }
+
+        stage('Confirm live changes on all nodes') {
+            timeout(time: 2, unit: 'HOURS') {
+               input message: "Approve live config change on ${targetLiveAll.expression} nodes?"
+            }
+        }
+
+        stage('Apply config changes on all nodes') {
+            result = salt.runSaltCommand(saltMaster, 'local', targetLiveAll, 'state.apply', null, states)
+            salt.printSaltStateResult(result)
+        }
+
+    } catch (Throwable e) {
+        currentBuild.result = 'FAILURE'
+        throw e
+    } finally {
+        // send notification
+        //common.sendNotification(currentBuild.result,HEAT_STACK_NAME,["slack"])
+    }
+}
diff --git a/update-package.groovy b/update-package.groovy
index e2ce9e4..b17eb01 100644
--- a/update-package.groovy
+++ b/update-package.groovy
@@ -1,48 +1,103 @@
 /**
- * Update packages pipeline script
+ * Update packages on given nodes
  *
  * Expected parameters:
- * SALT_MASTER_CREDENTIALS     Credentials to the Salt API (str)
- * SALT_MASTER_URL             URL of Salt-API (str)
- *
- * UPDATE_SERVERS              Salt target for updated servers (str)
- * UPDATE_COMMIT               Confirm update should be performed (boot)
- * UPDATE_PACKAGES             List of packages to update
+ *   SALT_MASTER_CREDENTIALS    Credentials to the Salt API.
+ *   SALT_MASTER_URL            Full Salt API address [https://10.10.10.1:8000].
+ *   TARGET_SERVERS             Salt compound target to match nodes to be updated [*, G@osfamily:debian].
+ *   TARGET_PACKAGES            Space delimited list of packages to be updates [package1=version package2=version], empty string means all updating all packages to the latest version.
+ *   TARGET_SIZE_TEST           Number of nodes to list package updates, empty string means all targetted nodes.
+ *   TARGET_SIZE_SAMPLE         Number of selected noded to live apply selected package update.
+ *   TARGET_SIZE_BATCH          Batch size for the complete live package update on all nodes, empty string means apply to all targetted nodes.
  *
 **/
 
-
-
 def common = new com.mirantis.mk.Common()
 def salt = new com.mirantis.mk.Salt()
-timestamps {
-    node() {
-      try {
 
-        stage("Connect to Salt master") {
-          saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
+def saltMaster
+def targetAll = ['expression': TARGET_SERVERS, 'type': 'compound']
+def targetTestSubset
+def targetLiveSubset
+def targetLiveAll
+def minions
+def result
+def command
+def packages
+
+node() {
+    try {
+
+        if (TARGET_PACKAGES != "") {
+            command = "pkg.install"
+            packages = TARGET_PACKAGES.tokenize(' ')
+        }
+        else {
+            command = "pkg.upgrade"
+            packages = null
         }
 
-        stage("Get package versions") {
-          salt.runSaltProcessStep(saltMaster, UPDATE_SERVERS, 'pkg.list_upgrades', [], null, true)
+        stage('Connect to Salt master') {
+            saltMaster = salt.connection(SALT_MASTER_URL, SALT_MASTER_CREDENTIALS)
         }
 
-        if (UPDATE_COMMIT.toBoolean() == true) {
-          stage("Update packages") {
-            if (UPDATE_PACKAGES == "") {
-              salt.runSaltProcessStep(saltMaster, UPDATE_SERVERS, 'pkg.install', [], null, true)
-            } else {
-              salt.runSaltProcessStep(saltMaster, UPDATE_SERVERS, 'pkg.install', UPDATE_PACKAGES.split(' '), null, true)
+        stage('List target servers') {
+            minions = salt.getMinions(saltMaster, targetAll)
+            if (TARGET_SUBSET_TEST != "") {
+                targetTestSubset = minions.subList(0, Integer.valueOf(TARGET_SUBSET_TEST)).join(' or ')
             }
-          }
+            else {
+                targetTestSubset = minions.join(' or ')
+            }
+            targetLiveSubset = minions.subList(0, Integer.valueOf(TARGET_SUBSET_LIVE)).join(' or ')
+            targetLiveAll = minions.join(' or ')
+            common.infoMsg("Found nodes: ${targetLiveAll}")
+            common.infoMsg("Selected test nodes: ${targetTestSubset}")
+            common.infoMsg("Selected sample nodes: ${targetLiveSubset}")
         }
 
-      } catch (Throwable e) {
-         // If there was an error or exception thrown, the build failed
-         currentBuild.result = "FAILURE"
-         throw e
-      } finally {
-         // common.sendNotification(currentBuild.result,"",["slack"])
-      }
+        stage("List package upgrades") {
+            salt.runSaltProcessStep(saltMaster, targetTestSubset, 'pkg.list_upgrades', [], null, true)
+        }
+
+        stage('Confirm live package upgrades on sample') {
+            if(TARGET_PACKAGES==""){
+                timeout(time: 2, unit: 'HOURS') {
+                    def userInput = input(
+                     id: 'userInput', message: 'Insert package names for update', parameters: [
+                     [$class: 'TextParameterDefinition', defaultValue: '', description: 'Package names (or *)', name: 'packages']
+                    ])
+                    if(userInput['packages'] != ""){
+                        packages = userInput['packages'].tokenize(" ")
+                    }
+                }
+            }else{
+                timeout(time: 2, unit: 'HOURS') {
+                   input message: "Approve live package upgrades on ${targetLiveSubset} nodes?"
+                }
+            }
+        }
+
+        stage('Apply package upgrades on sample') {
+            salt.runSaltProcessStep(saltMaster, targetLiveSubset, command, packages, null, true)
+
+        }
+
+        stage('Confirm package upgrades on all nodes') {
+            timeout(time: 2, unit: 'HOURS') {
+               input message: "Approve live package upgrades on ${targetLiveAll} nodes?"
+            }
+        }
+
+        stage('Apply package upgrades on all nodes') {
+            salt.runSaltProcessStep(saltMaster, targetLiveAll, command, packages, null, true)
+        }
+
+    } catch (Throwable e) {
+        // If there was an error or exception thrown, the build failed
+        currentBuild.result = "FAILURE"
+        throw e
+    } finally {
+        // common.sendNotification(currentBuild.result,"",["slack"])
     }
 }
