diff --git a/src/com/mirantis/mk/Orchestrate.groovy b/src/com/mirantis/mk/Orchestrate.groovy
index 41ec1d0..1b736cd 100644
--- a/src/com/mirantis/mk/Orchestrate.groovy
+++ b/src/com/mirantis/mk/Orchestrate.groovy
@@ -4,76 +4,81 @@
  *
 */
 
-def validateFoundationInfra(master) {
+/**
+ * Function runs Salt states to check infra
+ * @param master Salt Connection object or pepperEnv
+ * @param extra_tgt Extra target - adds ability to address commands using extra targeting to different clouds, e.g.: salt -C 'I@keystone:server and *ogrudev-deploy-heat-os-ha-ovs-82*' ...
+ */
+def validateFoundationInfra(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
-    salt.cmdRun(master, 'I@salt:master' ,'salt-key')
-    salt.runSaltProcessStep(master, 'I@salt:minion', 'test.version')
-    salt.cmdRun(master, 'I@salt:master' ,'reclass-salt --top')
-    salt.runSaltProcessStep(master, 'I@reclass:storage', 'reclass.inventory')
-    salt.runSaltProcessStep(master, 'I@salt:minion', 'state.show_top')
+    salt.cmdRun(master, "I@salt:master ${extra_tgt}" ,'salt-key')
+    salt.runSaltProcessStep(master, "I@salt:minion ${extra_tgt}", 'test.version')
+    salt.cmdRun(master, "I@salt:master ${extra_tgt}" ,'reclass-salt --top')
+    salt.runSaltProcessStep(master, "I@reclass:storage ${extra_tgt}", 'reclass.inventory')
+    salt.runSaltProcessStep(master, "I@salt:minion ${extra_tgt}", 'state.show_top')
 }
 
-def installFoundationInfra(master, staticMgmtNet=false) {
+def installFoundationInfra(master, staticMgmtNet=false, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     def common = new com.mirantis.mk.Common()
 
     // NOTE(vsaienko) Apply reclass first, it may update cluster model
     // apply linux and salt.master salt.minion states afterwards to make sure
     // correct cluster model is used.
-    salt.enforceState(master, 'I@salt:master', ['reclass'])
+    salt.enforceState(master, "I@salt:master ${extra_tgt}", ['reclass'])
 
-    salt.enforceState(master, 'I@salt:master', ['linux.system'])
-    salt.enforceState(master, 'I@salt:master', ['salt.master'], true, false, null, false, 120, 2)
-    salt.fullRefresh(master, "*")
+    salt.enforceState(master, "I@salt:master ${extra_tgt}", ['linux.system'])
+    salt.enforceState(master, "I@salt:master ${extra_tgt}", ['salt.master'], true, false, null, false, 120, 2)
+    salt.fullRefresh(master, "* ${extra_tgt}")
 
-    salt.enforceState(master, 'I@salt:master', ['salt.minion'], true, false, null, false, 60, 2)
-    salt.enforceState(master, 'I@salt:master', ['salt.minion'])
-    salt.fullRefresh(master, "*")
-    salt.enforceState(master, '*', ['linux.network.proxy'], true, false, null, false, 60, 2)
+    salt.enforceState(master, "I@salt:master ${extra_tgt}", ['salt.minion'], true, false, null, false, 60, 2)
+    salt.enforceState(master, "I@salt:master ${extra_tgt}", ['salt.minion'])
+    salt.fullRefresh(master, "* ${extra_tgt}")
+    salt.enforceState(master, "* ${extra_tgt}", ['linux.network.proxy'], true, false, null, false, 60, 2)
     try {
-        salt.enforceState(master, '*', ['salt.minion.base'], true, false, null, false, 60, 2)
+        salt.enforceState(master, "* ${extra_tgt}", ['salt.minion.base'], true, false, null, false, 60, 2)
         sleep(5)
     } catch (Throwable e) {
         common.warningMsg('Salt state salt.minion.base is not present in the Salt-formula yet.')
     }
     common.retry(2,5){
-        salt.enforceState(master, '*', ['linux.system'])
+        salt.enforceState(master, "* ${extra_tgt}", ['linux.system'])
     }
     if (staticMgmtNet) {
-        salt.runSaltProcessStep(master, '*', 'cmd.shell', ["salt-call state.sls linux.network; salt-call service.restart salt-minion"], null, true, 60)
+        salt.runSaltProcessStep(master, "* ${extra_tgt}", 'cmd.shell', ["salt-call state.sls linux.network; salt-call service.restart salt-minion"], null, true, 60)
     }
-    salt.enforceState(master, 'I@linux:network:interface', ['linux.network.interface'])
+    salt.enforceState(master, "I@linux:network:interface ${extra_tgt}", ['linux.network.interface'])
     sleep(5)
-    salt.enforceState(master, 'I@linux:system', ['linux', 'openssh', 'ntp', 'rsyslog'])
-    salt.enforceState(master, '*', ['salt.minion'], true, false, null, false, 60, 2)
+    salt.enforceState(master, "I@linux:system ${extra_tgt}", ['linux', 'openssh', 'ntp', 'rsyslog'])
+    salt.enforceState(master, "* ${extra_tgt}", ['salt.minion'], true, false, null, false, 60, 2)
     sleep(5)
 
-    salt.fullRefresh(master, "*")
-    salt.runSaltProcessStep(master, '*', 'mine.update', [], null, true)
-    salt.enforceState(master, '*', ['linux.network.host'])
+    salt.fullRefresh(master, "* ${extra_tgt}")
+    salt.runSaltProcessStep(master, "* ${extra_tgt}", 'mine.update', [], null, true)
+    salt.enforceState(master, "* ${extra_tgt}", ['linux.network.host'])
 
     // Install and configure iptables
-    if (salt.testTarget(master, 'I@iptables:service')) {
-        salt.enforceState(master, 'I@iptables:service', 'iptables')
+    if (salt.testTarget(master, "I@iptables:service ${extra_tgt}")) {
+        salt.enforceState(master, "I@iptables:service ${extra_tgt}", 'iptables')
     }
 
     // Install and configure logrotate
-    if (salt.testTarget(master, 'I@logrotate:server')) {
-        salt.enforceState(master, 'I@logrotate:server', 'logrotate')
+    if (salt.testTarget(master, "I@logrotate:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@logrotate:server ${extra_tgt}", 'logrotate')
     }
 
     // Install and configure auditd
-    if (salt.testTarget(master, 'I@auditd:service')) {
-        salt.enforceState(master, 'I@auditd:service', 'auditd')
+    if (salt.testTarget(master, "I@auditd:service ${extra_tgt}")) {
+        salt.enforceState(master, "I@auditd:service ${extra_tgt}", 'auditd')
     }
 }
 
-def installFoundationInfraOnTarget(master, target, staticMgmtNet=false) {
+def installFoundationInfraOnTarget(master, target, staticMgmtNet=false, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     def common = new com.mirantis.mk.Common()
 
-    salt.enforceState(master, 'I@salt:master', ['reclass'], true, false, null, false, 120, 2)
+    salt.enforceState(master, "I@salt:master ${extra_tgt}", ['reclass'], true, false, null, false, 120, 2)
     salt.fullRefresh(master, target)
     salt.enforceState(master, target, ['linux.network.proxy'], true, false, null, false, 60, 2)
     try {
@@ -100,19 +105,19 @@
     salt.enforceState(master, target, ['linux.network.host'])
 }
 
-def installInfraKvm(master) {
+def installInfraKvm(master, extra_tgt = '') {
     def common = new com.mirantis.mk.Common()
     def salt = new com.mirantis.mk.Salt()
-    def infra_compound = 'I@salt:control'
+    def infra_compound = "I@salt:control ${extra_tgt}"
     def minions = []
     def wait_timeout = 10
     def retries = wait_timeout * 30
 
-    salt.fullRefresh(master, 'I@linux:system')
-    salt.enforceState(master, 'I@salt:control', ['salt.minion'], true, false, null, false, 60, 2)
-    salt.enforceState(master, 'I@salt:control', ['linux.system', 'linux.network', 'ntp', 'rsyslog'])
-    salt.enforceState(master, 'I@salt:control', 'libvirt')
-    salt.enforceState(master, 'I@salt:control', 'salt.control')
+    salt.fullRefresh(master, "I@linux:system ${extra_tgt}")
+    salt.enforceState(master, "I@salt:control ${extra_tgt}", ['salt.minion'], true, false, null, false, 60, 2)
+    salt.enforceState(master, "I@salt:control ${extra_tgt}", ['linux.system', 'linux.network', 'ntp', 'rsyslog'])
+    salt.enforceState(master, "I@salt:control ${extra_tgt}", 'libvirt')
+    salt.enforceState(master, "I@salt:control ${extra_tgt}", 'salt.control')
 
     common.infoMsg("Building minions list...")
     if (salt.testTarget(master, infra_compound)) {
@@ -146,387 +151,387 @@
 
     common.infoMsg("Waiting for next minions to register within ${wait_timeout} minutes: " + minions_compound)
     timeout(time: wait_timeout, unit: 'MINUTES') {
-        salt.minionsPresentFromList(master, 'I@salt:master', minions, true, null, true, retries, 1)
+        salt.minionsPresentFromList(master, "I@salt:master ${extra_tgt}", minions, true, null, true, retries, 1)
     }
 
     common.infoMsg('Waiting for minions to respond')
     timeout(time: wait_timeout, unit: 'MINUTES') {
-        salt.minionsReachable(master, 'I@salt:master', minions_compound)
+        salt.minionsReachable(master, "I@salt:master ${extra_tgt}", minions_compound)
     }
 
     common.infoMsg("All minions are up.")
-    salt.fullRefresh(master, '* and not kvm*')
+    salt.fullRefresh(master, "* and not kvm* ${extra_tgt}")
 
 }
 
-def installInfra(master) {
+def installInfra(master, extra_tgt = '') {
     def common = new com.mirantis.mk.Common()
     def salt = new com.mirantis.mk.Salt()
 
     // Install glusterfs
-    if (salt.testTarget(master, 'I@glusterfs:server')) {
-        salt.enforceState(master, 'I@glusterfs:server', 'glusterfs.server.service')
+    if (salt.testTarget(master, "I@glusterfs:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@glusterfs:server ${extra_tgt}", 'glusterfs.server.service')
 
-        salt.enforceState(master, 'I@glusterfs:server and *01*', 'glusterfs.server.setup', true, true, null, false, -1, 5)
+        salt.enforceState(master, "I@glusterfs:server and *01* ${extra_tgt}", 'glusterfs.server.setup', true, true, null, false, -1, 5)
         sleep(10)
-        salt.cmdRun(master, 'I@glusterfs:server', "gluster peer status; gluster volume status")
+        salt.cmdRun(master, "I@glusterfs:server ${extra_tgt}", "gluster peer status; gluster volume status")
     }
 
     // Ensure glusterfs clusters is ready
-    if (salt.testTarget(master, 'I@glusterfs:client')) {
-        salt.enforceState(master, 'I@glusterfs:client', 'glusterfs.client', true, true, null, false, -1, 2)
+    if (salt.testTarget(master, "I@glusterfs:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@glusterfs:client ${extra_tgt}", 'glusterfs.client', true, true, null, false, -1, 2)
     }
 
     // Install galera
-    if (salt.testTarget(master, 'I@galera:master') || salt.testTarget(master, 'I@galera:slave')) {
-        salt.enforceState(master, 'I@galera:master', 'galera', true, true, null, false, -1, 2)
-        salt.enforceState(master, 'I@galera:slave', 'galera', true, true, null, false, -1, 2)
+    if (salt.testTarget(master, "I@galera:master ${extra_tgt}") || salt.testTarget(master, "I@galera:slave ${extra_tgt}")) {
+        salt.enforceState(master, "I@galera:master ${extra_tgt}", 'galera', true, true, null, false, -1, 2)
+        salt.enforceState(master, "I@galera:slave ${extra_tgt}", 'galera', true, true, null, false, -1, 2)
 
         // Check galera status
-        salt.runSaltProcessStep(master, 'I@galera:master', 'mysql.status')
-        salt.runSaltProcessStep(master, 'I@galera:slave', 'mysql.status')
+        salt.runSaltProcessStep(master, "I@galera:master ${extra_tgt}", 'mysql.status')
+        salt.runSaltProcessStep(master, "I@galera:slave ${extra_tgt}", 'mysql.status')
     // If galera is not enabled check if we need to install mysql:server
-    } else if (salt.testTarget(master, 'I@mysql:server')){
-        salt.enforceState(master, 'I@mysql:server', 'mysql.server')
-        if (salt.testTarget(master, 'I@mysql:client')){
-            salt.enforceState(master, 'I@mysql:client', 'mysql.client')
+    } else if (salt.testTarget(master, "I@mysql:server ${extra_tgt}")){
+        salt.enforceState(master, "I@mysql:server ${extra_tgt}", 'mysql.server')
+        if (salt.testTarget(master, "I@mysql:client ${extra_tgt}")){
+            salt.enforceState(master, "I@mysql:client ${extra_tgt}", 'mysql.client')
         }
     }
-    installBackup(master, 'mysql')
+    installBackup(master, 'mysql', extra_tgt)
 
     // Install docker
-    if (salt.testTarget(master, 'I@docker:host')) {
-        salt.enforceState(master, 'I@docker:host', 'docker.host')
-        salt.cmdRun(master, 'I@docker:host', 'docker ps')
+    if (salt.testTarget(master, "I@docker:host ${extra_tgt}")) {
+        salt.enforceState(master, "I@docker:host ${extra_tgt}", 'docker.host')
+        salt.cmdRun(master, "I@docker:host ${extra_tgt}", 'docker ps')
     }
 
     // Install keepalived
-    if (salt.testTarget(master, 'I@keepalived:cluster')) {
-        salt.enforceState(master, 'I@keepalived:cluster and *01*', 'keepalived')
-        salt.enforceState(master, 'I@keepalived:cluster', 'keepalived')
+    if (salt.testTarget(master, "I@keepalived:cluster ${extra_tgt}")) {
+        salt.enforceState(master, "I@keepalived:cluster and *01* ${extra_tgt}", 'keepalived')
+        salt.enforceState(master, "I@keepalived:cluster ${extra_tgt}", 'keepalived')
     }
 
     // Install rabbitmq
-    if (salt.testTarget(master, 'I@rabbitmq:server')) {
-        salt.enforceState(master, 'I@rabbitmq:server', 'rabbitmq', true, true, null, false, -1, 2)
+    if (salt.testTarget(master, "I@rabbitmq:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@rabbitmq:server ${extra_tgt}", 'rabbitmq', true, true, null, false, -1, 2)
 
         // Check the rabbitmq status
         common.retry(3,5){
-             salt.cmdRun(master, 'I@rabbitmq:server', 'rabbitmqctl cluster_status')
+             salt.cmdRun(master, "I@rabbitmq:server ${extra_tgt}", 'rabbitmqctl cluster_status')
         }
     }
 
     // Install haproxy
-    if (salt.testTarget(master, 'I@haproxy:proxy')) {
-        salt.enforceState(master, 'I@haproxy:proxy', 'haproxy')
-        salt.runSaltProcessStep(master, 'I@haproxy:proxy', 'service.status', ['haproxy'])
-        salt.runSaltProcessStep(master, 'I@haproxy:proxy', 'service.restart', ['rsyslog'])
+    if (salt.testTarget(master, "I@haproxy:proxy ${extra_tgt}")) {
+        salt.enforceState(master, "I@haproxy:proxy ${extra_tgt}", 'haproxy')
+        salt.runSaltProcessStep(master, "I@haproxy:proxy ${extra_tgt}", 'service.status', ['haproxy'])
+        salt.runSaltProcessStep(master, "I@haproxy:proxy ${extra_tgt}", 'service.restart', ['rsyslog'])
     }
 
     // Install memcached
-    if (salt.testTarget(master, 'I@memcached:server')) {
-        salt.enforceState(master, 'I@memcached:server', 'memcached')
+    if (salt.testTarget(master, "I@memcached:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@memcached:server ${extra_tgt}", 'memcached')
     }
 
     // Install etcd
-    if (salt.testTarget(master, 'I@etcd:server')) {
-        salt.enforceState(master, 'I@etcd:server', 'etcd.server.service')
+    if (salt.testTarget(master, "I@etcd:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@etcd:server ${extra_tgt}", 'etcd.server.service')
         common.retry(3,5){
-            salt.cmdRun(master, 'I@etcd:server', '. /var/lib/etcd/configenv && etcdctl cluster-health')
+            salt.cmdRun(master, "I@etcd:server ${extra_tgt}", '. /var/lib/etcd/configenv && etcdctl cluster-health')
         }
     }
 
     // Install redis
-    if (salt.testTarget(master, 'I@redis:server')) {
-        if (salt.testTarget(master, 'I@redis:cluster:role:master')) {
-            salt.enforceState(master, 'I@redis:cluster:role:master', 'redis')
+    if (salt.testTarget(master, "I@redis:server ${extra_tgt}")) {
+        if (salt.testTarget(master, "I@redis:cluster:role:master ${extra_tgt}")) {
+            salt.enforceState(master, "I@redis:cluster:role:master ${extra_tgt}", 'redis')
         }
-        salt.enforceState(master, 'I@redis:server', 'redis')
+        salt.enforceState(master, "I@redis:server ${extra_tgt}", 'redis')
     }
-    installBackup(master, 'common')
+    installBackup(master, 'common', extra_tgt)
 }
 
-def installOpenstackInfra(master) {
+def installOpenstackInfra(master, extra_tgt = '') {
     def common = new com.mirantis.mk.Common()
     common.warningMsg("You calling orchestrate.installOpenstackInfra(). This function is deprecated please use orchestrate.installInfra() directly")
-    installInfra(master)
+    installInfra(master, extra_tgt)
 }
 
 
-def installOpenstackControl(master) {
+def installOpenstackControl(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     def common = new com.mirantis.mk.Common()
 
     // Install horizon dashboard
-    if (salt.testTarget(master, 'I@horizon:server')) {
-        salt.enforceState(master, 'I@horizon:server', 'horizon')
+    if (salt.testTarget(master, "I@horizon:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@horizon:server ${extra_tgt}", 'horizon')
     }
     // Install sphinx server
-    if (salt.testTarget(master, 'I@sphinx:server')) {
-        salt.enforceState(master, 'I@sphinx:server', 'sphinx')
+    if (salt.testTarget(master, "I@sphinx:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@sphinx:server ${extra_tgt}", 'sphinx')
     }
-    if (salt.testTarget(master, 'I@nginx:server')) {
-        salt.enforceState(master, 'I@nginx:server', 'salt.minion')
-        salt.enforceState(master, 'I@nginx:server', 'nginx')
+    if (salt.testTarget(master, "I@nginx:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@nginx:server ${extra_tgt}", 'salt.minion')
+        salt.enforceState(master, "I@nginx:server ${extra_tgt}", 'nginx')
     }
 
     // setup keystone service
-    if (salt.testTarget(master, 'I@keystone:server')) {
-        salt.enforceState(master, 'I@keystone:server and *01*', 'keystone.server')
-        salt.enforceState(master, 'I@keystone:server', 'keystone.server')
+    if (salt.testTarget(master, "I@keystone:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@keystone:server and *01* ${extra_tgt}", 'keystone.server')
+        salt.enforceState(master, "I@keystone:server ${extra_tgt}", 'keystone.server')
         // populate keystone services/tenants/roles/users
 
         // keystone:client must be called locally
         //salt.runSaltProcessStep(master, 'I@keystone:client', 'cmd.run', ['salt-call state.sls keystone.client'], null, true)
-        salt.runSaltProcessStep(master, 'I@keystone:server', 'service.restart', ['apache2'])
+        salt.runSaltProcessStep(master, "I@keystone:server ${extra_tgt}", 'service.restart', ['apache2'])
         sleep(30)
     }
-    if (salt.testTarget(master, 'I@keystone:client')) {
-        salt.enforceState(master, 'I@keystone:client and *01*', 'keystone.client')
-        salt.enforceState(master, 'I@keystone:client', 'keystone.client')
+    if (salt.testTarget(master, "I@keystone:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@keystone:client and *01* ${extra_tgt}", 'keystone.client')
+        salt.enforceState(master, "I@keystone:client ${extra_tgt}", 'keystone.client')
     }
-    if (salt.testTarget(master, 'I@keystone:server')) {
+    if (salt.testTarget(master, "I@keystone:server ${extra_tgt}")) {
         common.retry(3,5){
-            salt.cmdRun(master, 'I@keystone:server', '. /root/keystonercv3; openstack service list')
+            salt.cmdRun(master, "I@keystone:server ${extra_tgt}", '. /root/keystonercv3; openstack service list')
         }
     }
 
     // Install glance
-    if (salt.testTarget(master, 'I@glance:server')) {
+    if (salt.testTarget(master, "I@glance:server ${extra_tgt}")) {
         //runSaltProcessStep(master, 'I@glance:server', 'state.sls', ['glance.server'], 1)
-        salt.enforceState(master, 'I@glance:server and *01*', 'glance.server')
-       salt.enforceState(master, 'I@glance:server', 'glance.server')
+        salt.enforceState(master, "I@glance:server and *01* ${extra_tgt}", 'glance.server')
+       salt.enforceState(master, "I@glance:server ${extra_tgt}", 'glance.server')
     }
 
     // Check glance service
-    if (salt.testTarget(master, 'I@glance:server')){
+    if (salt.testTarget(master, "I@glance:server ${extra_tgt}")) {
         common.retry(3,5){
-            salt.cmdRun(master, 'I@keystone:server','. /root/keystonercv3; glance image-list')
+            salt.cmdRun(master, "I@keystone:server ${extra_tgt}", '. /root/keystonercv3; glance image-list')
         }
     }
 
     // Create glance resources
-    if (salt.testTarget(master, 'I@glance:client')) {
-        salt.enforceState(master, 'I@glance:client', 'glance.client')
+    if (salt.testTarget(master, "I@glance:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@glance:client ${extra_tgt}", 'glance.client')
     }
 
     // Install and check nova service
-    if (salt.testTarget(master, 'I@nova:controller')) {
+    if (salt.testTarget(master, "I@nova:controller ${extra_tgt}")) {
         // run on first node first
-        salt.enforceState(master, 'I@nova:controller and *01*', 'nova.controller')
-        salt.enforceState(master, 'I@nova:controller', 'nova.controller')
-        if (salt.testTarget(master, 'I@keystone:server')) {
+        salt.enforceState(master, "I@nova:controller and *01* ${extra_tgt}", 'nova.controller')
+        salt.enforceState(master, "I@nova:controller ${extra_tgt}", 'nova.controller')
+        if (salt.testTarget(master, "I@keystone:server ${extra_tgt}")) {
            common.retry(3,5){
-               salt.cmdRun(master, 'I@keystone:server', '. /root/keystonercv3; nova service-list')
+               salt.cmdRun(master, "I@keystone:server ${extra_tgt}", '. /root/keystonercv3; nova service-list')
            }
         }
     }
 
     // Create nova resources
-    if (salt.testTarget(master, 'I@nova:client')) {
-        salt.enforceState(master, 'I@nova:client', 'nova.client')
+    if (salt.testTarget(master, "I@nova:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@nova:client ${extra_tgt}", 'nova.client')
     }
 
     // Install and check cinder service
-    if (salt.testTarget(master, 'I@cinder:controller')) {
+    if (salt.testTarget(master, "I@cinder:controller ${extra_tgt}")) {
         // run on first node first
-        salt.enforceState(master, 'I@cinder:controller and *01*', 'cinder')
-        salt.enforceState(master, 'I@cinder:controller', 'cinder')
-        if (salt.testTarget(master, 'I@keystone:server')) {
+        salt.enforceState(master, "I@cinder:controller and *01* ${extra_tgt}", 'cinder')
+        salt.enforceState(master, "I@cinder:controller ${extra_tgt}", 'cinder')
+        if (salt.testTarget(master, "I@keystone:server ${extra_tgt}")) {
             common.retry(3,5){
-                salt.cmdRun(master, 'I@keystone:server', '. /root/keystonercv3; cinder list')
+                salt.cmdRun(master, "I@keystone:server ${extra_tgt}", '. /root/keystonercv3; cinder list')
             }
         }
     }
 
     // Install neutron service
-    if (salt.testTarget(master, 'I@neutron:server')) {
+    if (salt.testTarget(master, "I@neutron:server ${extra_tgt}")) {
         // run on first node first
-        salt.enforceState(master, 'I@neutron:server and *01*', 'neutron.server')
-        salt.enforceState(master, 'I@neutron:server', 'neutron.server')
-        if (salt.testTarget(master, 'I@keystone:server')) {
+        salt.enforceState(master, "I@neutron:server and *01* ${extra_tgt}", 'neutron.server')
+        salt.enforceState(master, "I@neutron:server ${extra_tgt}", 'neutron.server')
+        if (salt.testTarget(master, "I@keystone:server ${extra_tgt}")) {
             common.retry(3,5){
-                salt.cmdRun(master, 'I@keystone:server','. /root/keystonercv3; neutron agent-list')
+                salt.cmdRun(master, "I@keystone:server ${extra_tgt}",'. /root/keystonercv3; neutron agent-list')
             }
         }
     }
 
     // Install heat service
-    if (salt.testTarget(master, 'I@heat:server')) {
+    if (salt.testTarget(master, "I@heat:server ${extra_tgt}")) {
         // run on first node first
-        salt.enforceState(master, 'I@heat:server and *01*', 'heat')
-        salt.enforceState(master, 'I@heat:server', 'heat')
-        if (salt.testTarget(master, 'I@keystone:server')) {
+        salt.enforceState(master, "I@heat:server and *01* ${extra_tgt}", 'heat')
+        salt.enforceState(master, "I@heat:server ${extra_tgt}", 'heat')
+        if (salt.testTarget(master, "I@keystone:server ${extra_tgt}")) {
             common.retry(3,5){
-                salt.cmdRun(master, 'I@keystone:server', '. /root/keystonercv3; heat resource-type-list')
+                salt.cmdRun(master, "I@keystone:server ${extra_tgt}", '. /root/keystonercv3; heat resource-type-list')
             }
         }
     }
 
     // Restart nova api
-    if (salt.testTarget(master, 'I@nova:controller')) {
-        salt.runSaltProcessStep(master, 'I@nova:controller', 'service.restart', ['nova-api'])
+    if (salt.testTarget(master, "I@nova:controller ${extra_tgt}")) {
+        salt.runSaltProcessStep(master, "I@nova:controller ${extra_tgt}", 'service.restart', ['nova-api'])
     }
 
     // Install ironic service
-    if (salt.testTarget(master, 'I@ironic:api')) {
-        salt.enforceState(master, 'I@ironic:api and *01*', 'ironic.api')
-        salt.enforceState(master, 'I@ironic:api', 'ironic.api')
+    if (salt.testTarget(master, "I@ironic:api ${extra_tgt}")) {
+        salt.enforceState(master, "I@ironic:api and *01* ${extra_tgt}", 'ironic.api')
+        salt.enforceState(master, "I@ironic:api ${extra_tgt}", 'ironic.api')
     }
 
     // Install manila service
-    if (salt.testTarget(master, 'I@manila:api')) {
-        salt.enforceState(master, 'I@manila:api and *01*', 'manila.api')
-        salt.enforceState(master, 'I@manila:api', 'manila.api')
+    if (salt.testTarget(master, "I@manila:api ${extra_tgt}")) {
+        salt.enforceState(master, "I@manila:api and *01* ${extra_tgt}", 'manila.api')
+        salt.enforceState(master, "I@manila:api ${extra_tgt}", 'manila.api')
     }
-    if (salt.testTarget(master, 'I@manila:scheduler')) {
-        salt.enforceState(master, 'I@manila:scheduler', 'manila.scheduler')
+    if (salt.testTarget(master, "I@manila:scheduler ${extra_tgt}")) {
+        salt.enforceState(master, "I@manila:scheduler ${extra_tgt}", 'manila.scheduler')
     }
 
     // Install designate services
-    if (salt.testTarget(master, 'I@designate:server:enabled')) {
-        if (salt.testTarget(master, 'I@designate:server:backend:bind9')) {
-            salt.enforceState(master, 'I@bind:server', 'bind.server')
+    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')) {
-            salt.enforceState(master, 'I@powerdns:server', 'powerdns.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*', 'designate.server')
-        salt.enforceState(master, 'I@designate:server', 'designate')
+        salt.enforceState(master, "I@designate:server and *01* ${extra_tgt}", 'designate.server')
+        salt.enforceState(master, "I@designate:server ${extra_tgt}", 'designate')
     }
 
     // Install octavia api service
-    if (salt.testTarget(master, 'I@octavia:api')) {
-        salt.enforceState(master, 'I@octavia:api and *01*', 'octavia')
-        salt.enforceState(master, 'I@octavia:api', 'octavia')
+    if (salt.testTarget(master, "I@octavia:api ${extra_tgt}")) {
+        salt.enforceState(master, "I@octavia:api and *01* ${extra_tgt}", 'octavia')
+        salt.enforceState(master, "I@octavia:api ${extra_tgt}", 'octavia')
     }
 
     // Install DogTag server service
-    if (salt.testTarget(master, 'I@dogtag:server')) {
-        salt.enforceState(master, 'I@dogtag:server and *01*', 'dogtag.server')
-        salt.enforceState(master, 'I@dogtag:server', 'dogtag.server')
+    if (salt.testTarget(master, "I@dogtag:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@dogtag:server and *01* ${extra_tgt}", 'dogtag.server')
+        salt.enforceState(master, "I@dogtag:server ${extra_tgt}", 'dogtag.server')
     }
 
     // Install barbican server service
-    if (salt.testTarget(master, 'I@barbican:server')) {
-        salt.enforceState(master, 'I@barbican:server and *01*', 'barbican.server')
-        salt.enforceState(master, 'I@barbican:server', 'barbican.server')
+    if (salt.testTarget(master, "I@barbican:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@barbican:server and *01* ${extra_tgt}", 'barbican.server')
+        salt.enforceState(master, "I@barbican:server ${extra_tgt}", 'barbican.server')
     }
     // Install barbican client
-    if (salt.testTarget(master, 'I@barbican:client')) {
-        salt.enforceState(master, 'I@barbican:client', 'barbican.client')
+    if (salt.testTarget(master, "I@barbican:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@barbican:client ${extra_tgt}", 'barbican.client')
     }
 
     // Install gnocchi server
-    if (salt.testTarget(master, 'I@gnocchi:server')) {
-        salt.enforceState(master, 'I@gnocchi:server and *01*', 'gnocchi.server')
-        salt.enforceState(master, 'I@gnocchi:server', 'gnocchi.server')
+    if (salt.testTarget(master, "I@gnocchi:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@gnocchi:server and *01* ${extra_tgt}", 'gnocchi.server')
+        salt.enforceState(master, "I@gnocchi:server ${extra_tgt}", 'gnocchi.server')
     }
 
     // Install gnocchi statsd
-    if (salt.testTarget(master, 'I@gnocchi:statsd')) {
-        salt.enforceState(master, 'I@gnocchi:statsd and *01*', 'gnocchi.statsd')
-        salt.enforceState(master, 'I@gnocchi:statsd', 'gnocchi.statsd')
+    if (salt.testTarget(master, "I@gnocchi:statsd ${extra_tgt}")) {
+        salt.enforceState(master, "I@gnocchi:statsd and *01* ${extra_tgt}", 'gnocchi.statsd')
+        salt.enforceState(master, "I@gnocchi:statsd ${extra_tgt}", 'gnocchi.statsd')
     }
 
     // Install panko server
-    if (salt.testTarget(master, 'I@panko:server')) {
-        salt.enforceState(master, 'I@panko:server and *01*', 'panko')
-        salt.enforceState(master, 'I@panko:server', 'panko')
+    if (salt.testTarget(master, "I@panko:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@panko:server and *01* ${extra_tgt}", 'panko')
+        salt.enforceState(master, "I@panko:server ${extra_tgt}", 'panko')
     }
 
     // Install ceilometer server
-    if (salt.testTarget(master, 'I@ceilometer:server')) {
-        salt.enforceState(master, 'I@ceilometer:server and *01*', 'ceilometer')
-        salt.enforceState(master, 'I@ceilometer:server', 'ceilometer')
+    if (salt.testTarget(master, "I@ceilometer:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@ceilometer:server and *01* ${extra_tgt}", 'ceilometer')
+        salt.enforceState(master, "I@ceilometer:server ${extra_tgt}", 'ceilometer')
     }
 
     // Install aodh server
-    if (salt.testTarget(master, 'I@aodh:server')) {
-        salt.enforceState(master, 'I@aodh:server and *01*', 'aodh')
-        salt.enforceState(master, 'I@aodh:server', 'aodh')
+    if (salt.testTarget(master, "I@aodh:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@aodh:server and *01* ${extra_tgt}", 'aodh')
+        salt.enforceState(master, "I@aodh:server ${extra_tgt}", 'aodh')
     }
 }
 
 
-def installIronicConductor(master){
+def installIronicConductor(master, extra_tgt = ''){
     def salt = new com.mirantis.mk.Salt()
 
-    if (salt.testTarget(master, 'I@ironic:conductor')) {
-        salt.enforceState(master, 'I@ironic:conductor', 'ironic.conductor')
-        salt.enforceState(master, 'I@ironic:conductor', 'apache')
+    if (salt.testTarget(master, "I@ironic:conductor ${extra_tgt}")) {
+        salt.enforceState(master, "I@ironic:conductor ${extra_tgt}", 'ironic.conductor')
+        salt.enforceState(master, "I@ironic:conductor ${extra_tgt}", 'apache')
     }
-    if (salt.testTarget(master, 'I@tftpd_hpa:server')) {
-        salt.enforceState(master, 'I@tftpd_hpa:server', 'tftpd_hpa')
+    if (salt.testTarget(master, "I@tftpd_hpa:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@tftpd_hpa:server ${extra_tgt}", 'tftpd_hpa')
     }
 
-    if (salt.testTarget(master, 'I@nova:compute')) {
-        salt.runSaltProcessStep(master, 'I@nova:compute', 'service.restart', ['nova-compute'])
+    if (salt.testTarget(master, "I@nova:compute ${extra_tgt}")) {
+        salt.runSaltProcessStep(master, "I@nova:compute ${extra_tgt}", 'service.restart', ['nova-compute'])
     }
 
-    if (salt.testTarget(master, 'I@baremetal_simulator:enabled')) {
-        salt.enforceState(master, 'I@baremetal_simulator:enabled', 'baremetal_simulator')
+    if (salt.testTarget(master, "I@baremetal_simulator:enabled ${extra_tgt}")) {
+        salt.enforceState(master, "I@baremetal_simulator:enabled ${extra_tgt}", 'baremetal_simulator')
     }
-    if (salt.testTarget(master, 'I@ironic:client')) {
-        salt.enforceState(master, 'I@ironic:client', 'ironic.client')
+    if (salt.testTarget(master, "I@ironic:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@ironic:client ${extra_tgt}", 'ironic.client')
     }
 }
 
-def installManilaShare(master){
+def installManilaShare(master, extra_tgt = ''){
     def salt = new com.mirantis.mk.Salt()
 
-    if (salt.testTarget(master, 'I@manila:share')) {
-        salt.enforceState(master, 'I@manila:share', 'manila.share')
+    if (salt.testTarget(master, "I@manila:share ${extra_tgt}")) {
+        salt.enforceState(master, "I@manila:share ${extra_tgt}", 'manila.share')
     }
-    if (salt.testTarget(master, 'I@manila:data')) {
-        salt.enforceState(master, 'I@manila:data', 'manila.data')
+    if (salt.testTarget(master, "I@manila:data ${extra_tgt}")) {
+        salt.enforceState(master, "I@manila:data ${extra_tgt}", 'manila.data')
     }
 
-    if (salt.testTarget(master, 'I@manila:client')) {
-        salt.enforceState(master, 'I@manila:client', 'manila.client')
+    if (salt.testTarget(master, "I@manila:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@manila:client ${extra_tgt}", 'manila.client')
     }
 }
 
 
-def installOpenstackNetwork(master, physical = "false") {
+def installOpenstackNetwork(master, physical = "false", extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     //run full neutron state on neutron.gateway - this will install
     //neutron agents in addition to neutron server. Once neutron agents
     //are up neutron resources can be created without hitting the situation when neutron resources are created
     //prior to neutron agents which results in creating ports in non-usable state
-    if (salt.testTarget(master, 'I@neutron:gateway')) {
-            salt.enforceState(master, 'I@neutron:gateway', 'neutron')
+    if (salt.testTarget(master, "I@neutron:gateway ${extra_tgt}")) {
+            salt.enforceState(master, "I@neutron:gateway ${extra_tgt}", 'neutron')
     }
 
     // Create neutron resources - this step was moved here to ensure that
     //neutron resources are created after neutron agens are up. In this case neutron ports will be in
     //usable state. More information: https://bugs.launchpad.net/neutron/+bug/1399249
-    if (salt.testTarget(master, 'I@neutron:client')) {
-        salt.enforceState(master, 'I@neutron:client', 'neutron.client')
+    if (salt.testTarget(master, "I@neutron:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@neutron:client ${extra_tgt}", 'neutron.client')
     }
 
-    salt.enforceHighstate(master, 'I@neutron:gateway')
+    salt.enforceHighstate(master, "I@neutron:gateway ${extra_tgt}")
 
     // install octavia manager services
-    if (salt.testTarget(master, 'I@octavia:manager')) {
-        salt.runSaltProcessStep(master, 'I@salt:master', 'mine.update', ['*'])
-        salt.enforceState(master, 'I@octavia:manager', 'octavia')
-        salt.enforceState(master, 'I@octavia:manager', 'salt.minion.ca')
-        salt.enforceState(master, 'I@octavia:manager', 'salt.minion.cert')
+    if (salt.testTarget(master, "I@octavia:manager ${extra_tgt}")) {
+        salt.runSaltProcessStep(master, "I@salt:master ${extra_tgt}", 'mine.update', ['*'])
+        salt.enforceState(master, "I@octavia:manager ${extra_tgt}", 'octavia')
+        salt.enforceState(master, "I@octavia:manager ${extra_tgt}", 'salt.minion.ca')
+        salt.enforceState(master, "I@octavia:manager ${extra_tgt}", 'salt.minion.cert')
     }
 }
 
 
-def installOpenstackCompute(master) {
+def installOpenstackCompute(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     // Configure compute nodes
-    def compute_compound = 'I@nova:compute'
+    def compute_compound = "I@nova:compute ${extra_tgt}"
     if (salt.testTarget(master, compute_compound)) {
         // In case if infrastructure nodes are used as nova computes too
-        def gluster_compound = 'I@glusterfs:server'
-        def salt_ca_compound = 'I@salt:minion:ca:salt_master_ca'
+        def gluster_compound = "I@glusterfs:server ${extra_tgt}"
+        def salt_ca_compound = "I@salt:minion:ca:salt_master_ca ${extra_tgt}"
         // Enforce highstate asynchronous only on compute nodes which are not glusterfs and not salt ca servers
-        def hightstateTarget = "${compute_compound} and not ${gluster_compound} and not ${salt_ca_compound}"
+        def hightstateTarget = "${compute_compound} and not (${gluster_compound}) and not (${salt_ca_compound})"
         if (salt.testTarget(master, hightstateTarget)) {
             retry(2) {
                 salt.enforceHighstateWithExclude(master, hightstateTarget, 'opencontrail.client')
@@ -559,144 +564,144 @@
     }
 
     // Run nova:controller to map cmp with cells
-    if (salt.testTarget(master, 'I@nova:controller')) {
-      salt.enforceState(master, 'I@nova:controller and *01*', 'nova.controller')
+    if (salt.testTarget(master, "I@nova:controller ${extra_tgt}")) {
+      salt.enforceState(master, "I@nova:controller and *01* ${extra_tgt}", 'nova.controller')
     }
 }
 
 
-def installContrailNetwork(master) {
+def installContrailNetwork(master, extra_tgt = '') {
     def common = new com.mirantis.mk.Common()
     def salt = new com.mirantis.mk.Salt()
 
 
     // Install opencontrail database services
-    salt.enforceState(master, 'I@opencontrail:database and *01*', 'opencontrail.database')
-    salt.enforceState(master, 'I@opencontrail:database', 'opencontrail.database')
+    salt.enforceState(master, "I@opencontrail:database and *01* ${extra_tgt}", 'opencontrail.database')
+    salt.enforceState(master, "I@opencontrail:database ${extra_tgt}", 'opencontrail.database')
 
     // Install opencontrail control services
-    salt.enforceStateWithExclude(master, "I@opencontrail:control and *01*", "opencontrail", "opencontrail.client")
-    salt.enforceStateWithExclude(master, "I@opencontrail:control", "opencontrail", "opencontrail.client")
-    salt.enforceStateWithExclude(master, "I@opencontrail:collector and *01*", "opencontrail", "opencontrail.client")
-    salt.enforceStateWithExclude(master, "I@opencontrail:collector", "opencontrail", "opencontrail.client")
+    salt.enforceStateWithExclude(master, "I@opencontrail:control and *01* ${extra_tgt}", "opencontrail", "opencontrail.client")
+    salt.enforceStateWithExclude(master, "I@opencontrail:control ${extra_tgt}", "opencontrail", "opencontrail.client")
+    salt.enforceStateWithExclude(master, "I@opencontrail:collector and *01* ${extra_tgt}", "opencontrail", "opencontrail.client")
+    salt.enforceStateWithExclude(master, "I@opencontrail:collector ${extra_tgt}", "opencontrail", "opencontrail.client")
 
-    if (salt.testTarget(master, 'I@docker:client and I@opencontrail:control')) {
-        salt.enforceState(master, 'I@opencontrail:control or I@opencontrail:collector', 'docker.client')
+    if (salt.testTarget(master, "I@docker:client and I@opencontrail:control ${extra_tgt}")) {
+        salt.enforceState(master, "I@opencontrail:control or I@opencontrail:collector ${extra_tgt}", 'docker.client')
     }
-    installBackup(master, 'contrail')
+    installBackup(master, 'contrail', extra_tgt)
 }
 
 
-def installContrailCompute(master) {
+def installContrailCompute(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     def common = new com.mirantis.mk.Common()
     // Configure compute nodes
     // Provision opencontrail control services
-    salt.enforceState(master, 'I@opencontrail:database:id:1', 'opencontrail.client')
+    salt.enforceState(master, "I@opencontrail:database:id:1 ${extra_tgt}", 'opencontrail.client')
     // Provision opencontrail virtual routers
 
     // Generate script /usr/lib/contrail/if-vhost0 for up vhost0
-    if (salt.testTarget(master, 'I@opencontrail:compute')) {
-        salt.enforceStateWithExclude(master, "I@opencontrail:compute", "opencontrail", "opencontrail.client")
+    if (salt.testTarget(master, "I@opencontrail:compute ${extra_tgt}")) {
+        salt.enforceStateWithExclude(master, "I@opencontrail:compute ${extra_tgt}", "opencontrail", "opencontrail.client")
     }
 
-    if (salt.testTarget(master, 'I@nova:compute')) {
-        salt.cmdRun(master, 'I@nova:compute', 'exec 0>&-; exec 1>&-; exec 2>&-; nohup bash -c "ip link | grep vhost && echo no_reboot || sleep 5 && reboot & "', false)
+    if (salt.testTarget(master, "I@nova:compute ${extra_tgt}")) {
+        salt.cmdRun(master, "I@nova:compute ${extra_tgt}", 'exec 0>&-; exec 1>&-; exec 2>&-; nohup bash -c "ip link | grep vhost && echo no_reboot || sleep 5 && reboot & "', false)
     }
 
     sleep(300)
-    if (salt.testTarget(master, 'I@opencontrail:compute')) {
-        salt.enforceState(master, 'I@opencontrail:compute', 'opencontrail.client')
-        salt.enforceState(master, 'I@opencontrail:compute', 'opencontrail')
+    if (salt.testTarget(master, "I@opencontrail:compute ${extra_tgt}")) {
+        salt.enforceState(master, "I@opencontrail:compute ${extra_tgt}", 'opencontrail.client')
+        salt.enforceState(master, "I@opencontrail:compute ${extra_tgt}", 'opencontrail')
     }
 }
 
 
-def installKubernetesInfra(master) {
+def installKubernetesInfra(master, extra_tgt = '') {
     def common = new com.mirantis.mk.Common()
     common.warningMsg("You calling orchestrate.installKubernetesInfra(). This function is deprecated please use orchestrate.installInfra() directly")
-    installInfra(master)
+    installInfra(master, extra_tgt)
 }
 
 
-def installKubernetesControl(master) {
+def installKubernetesControl(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
     // Install Kubernetes pool and Calico
-    salt.enforceState(master, 'I@kubernetes:master', 'kubernetes.master.kube-addons')
-    salt.enforceState(master, 'I@kubernetes:pool', 'kubernetes.pool')
+    salt.enforceState(master, "I@kubernetes:master ${extra_tgt}", 'kubernetes.master.kube-addons')
+    salt.enforceState(master, "I@kubernetes:pool ${extra_tgt}", 'kubernetes.pool')
 
-    if (salt.testTarget(master, 'I@etcd:server:setup')) {
+    if (salt.testTarget(master, "I@etcd:server:setup ${extra_tgt}")) {
         // Setup etcd server
-        salt.enforceState(master, 'I@kubernetes:master and *01*', 'etcd.server.setup')
+        salt.enforceState(master, "I@kubernetes:master and *01* ${extra_tgt}", 'etcd.server.setup')
     }
 
     // Run k8s master at *01* to simplify namespaces creation
-    salt.enforceStateWithExclude(master, 'I@kubernetes:master and *01*', "kubernetes.master", "kubernetes.master.setup")
+    salt.enforceStateWithExclude(master, "I@kubernetes:master and *01* ${extra_tgt}", "kubernetes.master", "kubernetes.master.setup")
 
     // Run k8s without master.setup
-    salt.enforceStateWithExclude(master, 'I@kubernetes:master', "kubernetes", "kubernetes.master.setup")
+    salt.enforceStateWithExclude(master, "I@kubernetes:master ${extra_tgt}", "kubernetes", "kubernetes.master.setup")
 
     // Run k8s master setup
-    salt.enforceState(master, 'I@kubernetes:master and *01*', 'kubernetes.master.setup')
+    salt.enforceState(master, "I@kubernetes:master and *01* ${extra_tgt}", 'kubernetes.master.setup')
 
     // Restart kubelet
-    salt.runSaltProcessStep(master, 'I@kubernetes:pool', 'service.restart', ['kubelet'])
+    salt.runSaltProcessStep(master, "I@kubernetes:pool ${extra_tgt}", 'service.restart', ['kubelet'])
 }
 
 
-def installKubernetesCompute(master) {
+def installKubernetesCompute(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     salt.fullRefresh(master, "*")
 
     // Bootstrap all nodes
-    salt.enforceState(master, 'I@kubernetes:pool', 'linux')
-    salt.enforceState(master, 'I@kubernetes:pool', 'salt.minion')
-    salt.enforceState(master, 'I@kubernetes:pool', ['openssh', 'ntp'])
+    salt.enforceState(master, "I@kubernetes:pool ${extra_tgt}", 'linux')
+    salt.enforceState(master, "I@kubernetes:pool ${extra_tgt}", 'salt.minion')
+    salt.enforceState(master, "I@kubernetes:pool ${extra_tgt}", ['openssh', 'ntp'])
 
     // Create and distribute SSL certificates for services using salt state
-    salt.enforceState(master, 'I@kubernetes:pool', 'salt.minion.cert')
+    salt.enforceState(master, "I@kubernetes:pool ${extra_tgt}", 'salt.minion.cert')
 
     // Install docker
-    salt.enforceState(master, 'I@docker:host', 'docker.host')
+    salt.enforceState(master, "I@docker:host ${extra_tgt}", 'docker.host')
 
     // Install Kubernetes and Calico
-    salt.enforceState(master, 'I@kubernetes:pool', 'kubernetes.pool')
+    salt.enforceState(master, "I@kubernetes:pool ${extra_tgt}", 'kubernetes.pool')
 
     // Install Tiller and all configured releases
-    if (salt.testTarget(master, 'I@helm:client')) {
-        salt.enforceState(master, 'I@helm:client', 'helm')
+    if (salt.testTarget(master, "I@helm:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@helm:client ${extra_tgt}", 'helm')
     }
 }
 
 
-def installDockerSwarm(master) {
+def installDockerSwarm(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
     //Install and Configure Docker
-    salt.enforceState(master, 'I@docker:swarm', 'docker.host')
-    salt.enforceState(master, 'I@docker:swarm:role:master', 'docker.swarm')
-    salt.enforceState(master, 'I@docker:swarm', 'salt.minion.grains')
-    salt.runSaltProcessStep(master, 'I@docker:swarm', 'mine.update')
-    salt.runSaltProcessStep(master, 'I@docker:swarm', 'saltutil.refresh_modules')
+    salt.enforceState(master, "I@docker:swarm ${extra_tgt}", 'docker.host')
+    salt.enforceState(master, "I@docker:swarm:role:master ${extra_tgt}", 'docker.swarm')
+    salt.enforceState(master, "I@docker:swarm ${extra_tgt}", 'salt.minion.grains')
+    salt.runSaltProcessStep(master, "I@docker:swarm ${extra_tgt}", 'mine.update')
+    salt.runSaltProcessStep(master, "I@docker:swarm ${extra_tgt}", 'saltutil.refresh_modules')
     sleep(5)
-    salt.enforceState(master, 'I@docker:swarm:role:master', 'docker.swarm')
-    salt.enforceState(master, 'I@docker:swarm:role:manager', 'docker.swarm')
+    salt.enforceState(master, "I@docker:swarm:role:master ${extra_tgt}", 'docker.swarm')
+    salt.enforceState(master, "I@docker:swarm:role:manager ${extra_tgt}", 'docker.swarm')
     sleep(10)
-    salt.cmdRun(master, 'I@docker:swarm:role:master', 'docker node ls')
+    salt.cmdRun(master, "I@docker:swarm:role:master ${extra_tgt}", 'docker node ls')
 }
 
 
-def installCicd(master) {
+def installCicd(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     def common = new com.mirantis.mk.Common()
-    def gerrit_compound = 'I@gerrit:client and ci*'
-    def jenkins_compound = 'I@jenkins:client and ci*'
+    def gerrit_compound = "I@gerrit:client and ci* ${extra_tgt}"
+    def jenkins_compound = "I@jenkins:client and ci* ${extra_tgt}"
 
     salt.fullRefresh(master, gerrit_compound)
     salt.fullRefresh(master, jenkins_compound)
 
-    salt.enforceState(master, 'I@docker:swarm:role:master and I@jenkins:client', 'docker.client', true, true, null, false, -1, 2)
+    salt.enforceState(master, "I@docker:swarm:role:master and I@jenkins:client ${extra_tgt}", 'docker.client', true, true, null, false, -1, 2)
 
     // API timeout in minutes
     def wait_timeout = 10
@@ -749,28 +754,28 @@
       salt.cmdRun(master, jenkins_compound, 'timeout ' + (wait_timeout*60+3) + ' /bin/sh -c -- ' + '"' + check_jenkins_cmd + '"')
     }
 
-    if (salt.testTarget(master, 'I@openldap:client')) {
-        salt.enforceState(master, 'I@openldap:client', 'openldap', true, true, null, false, -1, 2)
+    if (salt.testTarget(master, "I@openldap:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@openldap:client ${extra_tgt}", 'openldap', true, true, null, false, -1, 2)
     }
 
-    if (salt.testTarget(master, 'I@python:environment')) {
-        salt.enforceState(master, 'I@python:environment', 'python')
+    if (salt.testTarget(master, "I@python:environment ${extra_tgt}")) {
+        salt.enforceState(master, "I@python:environment ${extra_tgt}", 'python')
     }
 
     withEnv(['ASK_ON_ERROR=false']){
         retry(2){
             try{
-                salt.enforceState(master, 'I@gerrit:client', 'gerrit')
+                salt.enforceState(master, "I@gerrit:client ${extra_tgt}", 'gerrit')
             }catch(e){
-                salt.fullRefresh(master, 'I@gerrit:client')
+                salt.fullRefresh(master, "I@gerrit:client ${extra_tgt}")
                 throw e //rethrow for retry handler
             }
         }
         retry(2){
             try{
-                salt.enforceState(master, 'I@jenkins:client', 'jenkins')
+                salt.enforceState(master, "I@jenkins:client ${extra_tgt}", 'jenkins')
             }catch(e){
-                salt.fullRefresh(master, 'I@jenkins:client')
+                salt.fullRefresh(master, "I@jenkins:client ${extra_tgt}")
                 throw e //rethrow for retry handler
             }
         }
@@ -778,7 +783,7 @@
 }
 
 
-def installStacklight(master) {
+def installStacklight(master, extra_tgt = '') {
     def common = new com.mirantis.mk.Common()
     def salt = new com.mirantis.mk.Salt()
     def retries_wait = 20
@@ -788,51 +793,51 @@
     // HAProxy, Nginx and lusterFS clients
     // In case of OpenStack, those are already installed
     if (common.checkContains('STACK_INSTALL', 'k8s')) {
-        salt.enforceState(master, 'I@haproxy:proxy', 'haproxy')
-        salt.runSaltProcessStep(master, 'I@haproxy:proxy', 'service.status', ['haproxy'])
+        salt.enforceState(master, "I@haproxy:proxy ${extra_tgt}", 'haproxy')
+        salt.runSaltProcessStep(master, "I@haproxy:proxy ${extra_tgt}", 'service.status', ['haproxy'])
 
-        if (salt.testTarget(master, 'I@nginx:server')) {
-            salt.enforceState(master, 'I@nginx:server', 'nginx')
+        if (salt.testTarget(master, "I@nginx:server ${extra_tgt}")) {
+            salt.enforceState(master, "I@nginx:server ${extra_tgt}", 'nginx')
         }
 
-        if (salt.testTarget(master, 'I@glusterfs:client')) {
-            salt.enforceState(master, 'I@glusterfs:client', 'glusterfs.client', true, true, null, false, -1, 2)
+        if (salt.testTarget(master, "I@glusterfs:client ${extra_tgt}")) {
+            salt.enforceState(master, "I@glusterfs:client ${extra_tgt}", 'glusterfs.client', true, true, null, false, -1, 2)
         }
     }
 
     // Install MongoDB for Alerta
-    if (salt.testTarget(master, 'I@mongodb:server')) {
-        salt.enforceState(master, 'I@mongodb:server', 'mongodb.server')
+    if (salt.testTarget(master, "I@mongodb:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@mongodb:server ${extra_tgt}", 'mongodb.server')
 
         // Initialize mongodb replica set
         common.retry(5,20){
-             salt.enforceState(master, 'I@mongodb:server', 'mongodb.cluster')
+             salt.enforceState(master, "I@mongodb:server ${extra_tgt}", 'mongodb.cluster')
         }
     }
 
     //Install Telegraf
-    salt.enforceState(master, 'I@telegraf:agent or I@telegraf:remote_agent', 'telegraf')
+    salt.enforceState(master, "I@telegraf:agent or I@telegraf:remote_agent ${extra_tgt}", 'telegraf')
 
     // Install Prometheus exporters
-    if (salt.testTarget(master, 'I@prometheus:exporters')) {
-        salt.enforceState(master, 'I@prometheus:exporters', 'prometheus')
+    if (salt.testTarget(master, "I@prometheus:exporters ${extra_tgt}")) {
+        salt.enforceState(master, "I@prometheus:exporters ${extra_tgt}", 'prometheus')
     }
 
     //Install Elasticsearch and Kibana
-    salt.enforceState(master, '*01* and  I@elasticsearch:server', 'elasticsearch.server')
-    salt.enforceState(master, 'I@elasticsearch:server', 'elasticsearch.server')
-    salt.enforceState(master, '*01* and I@kibana:server', 'kibana.server')
-    salt.enforceState(master, 'I@kibana:server', 'kibana.server')
+    salt.enforceState(master, "*01* and  I@elasticsearch:server ${extra_tgt}", 'elasticsearch.server')
+    salt.enforceState(master, "I@elasticsearch:server ${extra_tgt}", 'elasticsearch.server')
+    salt.enforceState(master, "*01* and I@kibana:server ${extra_tgt}", 'kibana.server')
+    salt.enforceState(master, "I@kibana:server ${extra_tgt}", 'kibana.server')
 
     // Check ES health cluster status
-    def pillar = salt.getPillar(master, 'I@elasticsearch:client', 'elasticsearch:client:server:host')
+    def pillar = salt.getPillar(master, "I@elasticsearch:client ${extra_tgt}", 'elasticsearch:client:server:host')
     def elasticsearch_vip
     if(!pillar['return'].isEmpty()) {
         elasticsearch_vip = pillar['return'][0].values()[0]
     } else {
         common.errorMsg('[ERROR] Elasticsearch VIP address could not be retrieved')
     }
-    pillar = salt.getPillar(master, 'I@elasticsearch:client', 'elasticsearch:client:server:port')
+    pillar = salt.getPillar(master, "I@elasticsearch:client ${extra_tgt}", 'elasticsearch:client:server:port')
     def elasticsearch_port
     if(!pillar['return'].isEmpty()) {
         elasticsearch_port = pillar['return'][0].values()[0]
@@ -841,76 +846,76 @@
     }
     common.retry(retries,retries_wait) {
         common.infoMsg('Waiting for Elasticsearch to become green..')
-        salt.cmdRun(master, 'I@elasticsearch:client', "curl -sf ${elasticsearch_vip}:${elasticsearch_port}/_cat/health | awk '{print \$4}' | grep green")
+        salt.cmdRun(master, "I@elasticsearch:client ${extra_tgt}", "curl -sf ${elasticsearch_vip}:${elasticsearch_port}/_cat/health | awk '{print \$4}' | grep green")
     }
 
     common.retry(retries,retries_wait) {
-        salt.enforceState(master, 'I@elasticsearch:client', 'elasticsearch.client')
+        salt.enforceState(master, "I@elasticsearch:client ${extra_tgt}", 'elasticsearch.client')
     }
 
     common.retry(retries,retries_wait) {
-        salt.enforceState(master, 'I@kibana:client', 'kibana.client')
+        salt.enforceState(master, "I@kibana:client ${extra_tgt}", 'kibana.client')
     }
 
     //Install InfluxDB
-    if (salt.testTarget(master, 'I@influxdb:server')) {
-        salt.enforceState(master, '*01* and I@influxdb:server', 'influxdb')
-        salt.enforceState(master, 'I@influxdb:server', 'influxdb')
+    if (salt.testTarget(master, "I@influxdb:server ${extra_tgt}")) {
+        salt.enforceState(master, "*01* and I@influxdb:server ${extra_tgt}", 'influxdb')
+        salt.enforceState(master, "I@influxdb:server ${extra_tgt}", 'influxdb')
     }
 
     // Install service for the log collection
-    if (salt.testTarget(master, 'I@fluentd:agent')) {
-        salt.enforceState(master, 'I@fluentd:agent', 'fluentd')
+    if (salt.testTarget(master, "I@fluentd:agent ${extra_tgt}")) {
+        salt.enforceState(master, "I@fluentd:agent ${extra_tgt}", 'fluentd')
     } else {
-        salt.enforceState(master, 'I@heka:log_collector', 'heka.log_collector')
+        salt.enforceState(master, "I@heka:log_collector ${extra_tgt}", 'heka.log_collector')
     }
 
     // Install heka ceilometer collector
-    if (salt.testTarget(master, 'I@heka:ceilometer_collector:enabled')) {
-        salt.enforceState(master, 'I@heka:ceilometer_collector:enabled', 'heka.ceilometer_collector')
-        salt.runSaltProcessStep(master, 'I@heka:ceilometer_collector:enabled', 'service.restart', ['ceilometer_collector'], null, true)
+    if (salt.testTarget(master, "I@heka:ceilometer_collector:enabled ${extra_tgt}")) {
+        salt.enforceState(master, "I@heka:ceilometer_collector:enabled ${extra_tgt}", 'heka.ceilometer_collector')
+        salt.runSaltProcessStep(master, "I@heka:ceilometer_collector:enabled ${extra_tgt}", 'service.restart', ['ceilometer_collector'], null, true)
     }
 
     // Install galera
     if (common.checkContains('STACK_INSTALL', 'k8s')) {
-        salt.enforceState(master, 'I@galera:master', 'galera', true, true, null, false, -1, 2)
-        salt.enforceState(master, 'I@galera:slave', 'galera', true, true, null, false, -1, 2)
+        salt.enforceState(master, "I@galera:master ${extra_tgt}", 'galera', true, true, null, false, -1, 2)
+        salt.enforceState(master, "I@galera:slave ${extra_tgt}", 'galera', true, true, null, false, -1, 2)
 
         // Check galera status
-        salt.runSaltProcessStep(master, 'I@galera:master', 'mysql.status')
-        salt.runSaltProcessStep(master, 'I@galera:slave', 'mysql.status')
+        salt.runSaltProcessStep(master, "I@galera:master ${extra_tgt}", 'mysql.status')
+        salt.runSaltProcessStep(master, "I@galera:slave ${extra_tgt}", 'mysql.status')
     }
 
     //Collect Grains
-    salt.enforceState(master, 'I@salt:minion', 'salt.minion.grains')
-    salt.runSaltProcessStep(master, 'I@salt:minion', 'saltutil.refresh_modules')
-    salt.runSaltProcessStep(master, 'I@salt:minion', 'mine.update')
+    salt.enforceState(master, "I@salt:minion ${extra_tgt}", 'salt.minion.grains')
+    salt.runSaltProcessStep(master, "I@salt:minion ${extra_tgt}", 'saltutil.refresh_modules')
+    salt.runSaltProcessStep(master, "I@salt:minion ${extra_tgt}", 'mine.update')
     sleep(5)
 
     // Configure Prometheus in Docker Swarm
-    salt.enforceState(master, 'I@docker:swarm and I@prometheus:server', 'prometheus')
+    salt.enforceState(master, "I@docker:swarm and I@prometheus:server ${extra_tgt}", 'prometheus')
 
     //Configure Remote Collector in Docker Swarm for Openstack deployments
     if (!common.checkContains('STACK_INSTALL', 'k8s')) {
-        salt.enforceState(master, 'I@docker:swarm and I@prometheus:server', 'heka.remote_collector', true, false)
+        salt.enforceState(master, "I@docker:swarm and I@prometheus:server ${extra_tgt}", 'heka.remote_collector', true, false)
     }
 
     // Launch containers
-    salt.enforceState(master, 'I@docker:swarm:role:master and I@prometheus:server', 'docker.client')
-    salt.runSaltProcessStep(master, 'I@docker:swarm and I@prometheus:server', 'dockerng.ps')
+    salt.enforceState(master, "I@docker:swarm:role:master and I@prometheus:server ${extra_tgt}", 'docker.client')
+    salt.runSaltProcessStep(master, "I@docker:swarm and I@prometheus:server ${extra_tgt}", 'dockerng.ps')
 
     //Install Prometheus LTS
-    if (salt.testTarget(master, 'I@prometheus:relay')) {
-        salt.enforceState(master, 'I@prometheus:relay', 'prometheus')
+    if (salt.testTarget(master, "I@prometheus:relay ${extra_tgt}")) {
+        salt.enforceState(master, "I@prometheus:relay ${extra_tgt}", 'prometheus')
     }
 
     // Install sphinx server
-    if (salt.testTarget(master, 'I@sphinx:server')) {
-        salt.enforceState(master, 'I@sphinx:server', 'sphinx')
+    if (salt.testTarget(master, "I@sphinx:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@sphinx:server ${extra_tgt}", 'sphinx')
     }
 
     //Configure Grafana
-    pillar = salt.getPillar(master, 'ctl01*', '_param:stacklight_monitor_address')
+    pillar = salt.getPillar(master, "ctl01* ${extra_tgt}", '_param:stacklight_monitor_address')
     common.prettyPrint(pillar)
 
     def stacklight_vip
@@ -922,117 +927,117 @@
 
     common.infoMsg("Waiting for service on http://${stacklight_vip}:15013/ to start")
     sleep(120)
-    salt.enforceState(master, 'I@grafana:client', 'grafana.client')
+    salt.enforceState(master, "I@grafana:client ${extra_tgt}", 'grafana.client')
 }
 
-def installStacklightv1Control(master) {
+def installStacklightv1Control(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
     // infra install
     // Install the StackLight backends
-    salt.enforceState(master, '*01* and  I@elasticsearch:server', 'elasticsearch.server')
-    salt.enforceState(master, 'I@elasticsearch:server', 'elasticsearch.server')
+    salt.enforceState(master, "*01* and I@elasticsearch:server ${extra_tgt}", 'elasticsearch.server')
+    salt.enforceState(master, "I@elasticsearch:server ${extra_tgt}", 'elasticsearch.server')
 
-    salt.enforceState(master, '*01* and I@influxdb:server', 'influxdb')
-    salt.enforceState(master, 'I@influxdb:server', 'influxdb')
+    salt.enforceState(master, "*01* and I@influxdb:server ${extra_tgt}", 'influxdb')
+    salt.enforceState(master, "I@influxdb:server ${extra_tgt}", 'influxdb')
 
-    salt.enforceState(master, '*01* and I@kibana:server', 'kibana.server')
-    salt.enforceState(master, 'I@kibana:server', 'kibana.server')
+    salt.enforceState(master, "*01* and I@kibana:server ${extra_tgt}", 'kibana.server')
+    salt.enforceState(master, "I@kibana:server ${extra_tgt}", 'kibana.server')
 
-    salt.enforceState(master, '*01* and I@grafana:server','grafana.server')
-    salt.enforceState(master, 'I@grafana:server','grafana.server')
+    salt.enforceState(master, "*01* and I@grafana:server ${extra_tgt}",'grafana.server')
+    salt.enforceState(master, "I@grafana:server ${extra_tgt}",'grafana.server')
 
-    def alarming_service_pillar = salt.getPillar(master, 'mon*01*', '_param:alarming_service')
+    def alarming_service_pillar = salt.getPillar(master, "mon*01* ${extra_tgt}", '_param:alarming_service')
     def alarming_service = alarming_service_pillar['return'][0].values()[0]
 
     switch (alarming_service) {
         case 'sensu':
             // Update Sensu
-            salt.enforceState(master, 'I@sensu:server and I@rabbitmq:server', 'rabbitmq')
-            salt.enforceState(master, 'I@redis:cluster:role:master', 'redis')
-            salt.enforceState(master, 'I@redis:server', 'redis')
-            salt.enforceState(master, 'I@sensu:server', 'sensu')
+            salt.enforceState(master, "I@sensu:server and I@rabbitmq:server ${extra_tgt}", 'rabbitmq')
+            salt.enforceState(master, "I@redis:cluster:role:master ${extra_tgt}", 'redis')
+            salt.enforceState(master, "I@redis:server ${extra_tgt}", 'redis')
+            salt.enforceState(master, "I@sensu:server ${extra_tgt}", 'sensu')
         default:
             // Update Nagios
-            salt.enforceState(master, 'I@nagios:server', 'nagios.server')
+            salt.enforceState(master, "I@nagios:server ${extra_tgt}", 'nagios.server')
             // Stop the Nagios service because the package starts it by default and it will
             // started later only on the node holding the VIP address
-            salt.runSaltProcessStep(master, 'I@nagios:server', 'service.stop', ['nagios3'], null, true)
+            salt.runSaltProcessStep(master, "I@nagios:server ${extra_tgt}", 'service.stop', ['nagios3'], null, true)
     }
 
-    salt.enforceState(master, 'I@elasticsearch:client', 'elasticsearch.client.service')
-    salt.enforceState(master, 'I@kibana:client', 'kibana.client')
+    salt.enforceState(master, "I@elasticsearch:client ${extra_tgt}", 'elasticsearch.client.service')
+    salt.enforceState(master, "I@kibana:client ${extra_tgt}", 'kibana.client')
 
     sleep(10)
 }
 
-def installStacklightv1Client(master) {
+def installStacklightv1Client(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     def common = new com.mirantis.mk.Common()
 
-    salt.cmdRun(master, 'I@elasticsearch:client', 'salt-call state.sls elasticsearch.client')
-    // salt.enforceState(master, 'I@elasticsearch:client', 'elasticsearch.client', true)
-    salt.cmdRun(master, 'I@kibana:client', 'salt-call state.sls kibana.client')
-    // salt.enforceState(master, 'I@kibana:client', 'kibana.client', true)
+    salt.cmdRun(master, "I@elasticsearch:client ${extra_tgt}", 'salt-call state.sls elasticsearch.client')
+    // salt.enforceState(master, "I@elasticsearch:client", 'elasticsearch.client", true)
+    salt.cmdRun(master, "I@kibana:client ${extra_tgt}", 'salt-call state.sls kibana.client')
+    // salt.enforceState(master, "I@kibana:client", 'kibana.client", true)
 
     // Install collectd, heka and sensu services on the nodes, this will also
     // generate the metadata that goes into the grains and eventually into Salt Mine
-    salt.enforceState(master, '*', 'collectd')
-    salt.enforceState(master, '*', 'salt.minion')
-    salt.enforceState(master, '*', 'heka')
+    salt.enforceState(master, "* ${extra_tgt}", 'collectd')
+    salt.enforceState(master, "* ${extra_tgt}", 'salt.minion')
+    salt.enforceState(master, "* ${extra_tgt}", 'heka')
 
     // Gather the Grafana metadata as grains
-    salt.enforceState(master, 'I@grafana:collector', 'grafana.collector', true)
+    salt.enforceState(master, "I@grafana:collector ${extra_tgt}", 'grafana.collector', true)
 
     // Update Salt Mine
-    salt.enforceState(master, '*', 'salt.minion.grains')
-    salt.runSaltProcessStep(master, '*', 'saltutil.refresh_modules')
-    salt.runSaltProcessStep(master, '*', 'mine.update')
+    salt.enforceState(master, "* ${extra_tgt}", 'salt.minion.grains')
+    salt.runSaltProcessStep(master, "* ${extra_tgt}", 'saltutil.refresh_modules')
+    salt.runSaltProcessStep(master, "* ${extra_tgt}", 'mine.update')
 
     sleep(5)
 
     // Update Heka
-    salt.enforceState(master, 'I@heka:aggregator:enabled:True or I@heka:remote_collector:enabled:True', 'heka')
+    salt.enforceState(master, "I@heka:aggregator:enabled:True or I@heka:remote_collector:enabled:True ${extra_tgt}", 'heka')
 
     // Update collectd
-    salt.enforceState(master, 'I@collectd:remote_client:enabled:True', 'collectd')
+    salt.enforceState(master, "I@collectd:remote_client:enabled:True ${extra_tgt}", 'collectd')
 
-    def alarming_service_pillar = salt.getPillar(master, 'mon*01*', '_param:alarming_service')
+    def alarming_service_pillar = salt.getPillar(master, "mon*01* ${extra_tgt}", '_param:alarming_service')
     def alarming_service = alarming_service_pillar['return'][0].values()[0]
 
     switch (alarming_service) {
         case 'sensu':
             // Update Sensu
             // TODO for stacklight team, should be fixed in model
-            salt.enforceState(master, 'I@sensu:client', 'sensu')
+            salt.enforceState(master, "I@sensu:client ${extra_tgt}", 'sensu')
         default:
             break
             // Default is nagios, and was enforced in installStacklightControl()
     }
 
-    salt.cmdRun(master, 'I@grafana:client and *01*', 'salt-call state.sls grafana.client')
-    // salt.enforceState(master, 'I@grafana:client and *01*', 'grafana.client', true)
+    salt.cmdRun(master, "I@grafana:client and *01* ${extra_tgt}", 'salt-call state.sls grafana.client')
+    // salt.enforceState(master, "I@grafana:client and *01*", 'grafana.client", true)
 
     // Finalize the configuration of Grafana (add the dashboards...)
-    salt.enforceState(master, 'I@grafana:client and *01*', 'grafana.client')
-    salt.enforceState(master, 'I@grafana:client and *02*', 'grafana.client')
-    salt.enforceState(master, 'I@grafana:client and *03*', 'grafana.client')
-    // nw salt -C 'I@grafana:client' --async service.restart salt-minion; sleep 10
+    salt.enforceState(master, "I@grafana:client and *01* ${extra_tgt}", 'grafana.client')
+    salt.enforceState(master, "I@grafana:client and *02* ${extra_tgt}", 'grafana.client')
+    salt.enforceState(master, "I@grafana:client and *03* ${extra_tgt}", 'grafana.client')
+    // nw salt -C "I@grafana:client' --async service.restart salt-minion; sleep 10
 
     // Get the StackLight monitoring VIP addres
     //vip=$(salt-call pillar.data _param:stacklight_monitor_address --out key|grep _param: |awk '{print $2}')
     //vip=${vip:=172.16.10.253}
-    def pillar = salt.getPillar(master, 'ctl01*', '_param:stacklight_monitor_address')
+    def pillar = salt.getPillar(master, "ctl01* ${extra_tgt}", '_param:stacklight_monitor_address')
     common.prettyPrint(pillar)
     def stacklight_vip = pillar['return'][0].values()[0]
 
     if (stacklight_vip) {
         // (re)Start manually the services that are bound to the monitoring VIP
         common.infoMsg("restart services on node with IP: ${stacklight_vip}")
-        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip}", 'service.restart', ['remote_collectd'])
-        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip}", 'service.restart', ['remote_collector'])
-        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip}", 'service.restart', ['aggregator'])
-        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip}", 'service.restart', ['nagios3'])
+        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip} ${extra_tgt}", 'service.restart', ['remote_collectd'])
+        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip} ${extra_tgt}", 'service.restart', ['remote_collector'])
+        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip} ${extra_tgt}", 'service.restart', ['aggregator'])
+        salt.runSaltProcessStep(master, "G@ipv4:${stacklight_vip} ${extra_tgt}", 'service.restart', ['nagios3'])
     } else {
         throw new Exception("Missing stacklight_vip")
     }
@@ -1042,68 +1047,68 @@
 // backups
 //
 
-def installBackup(master, component='common') {
+def installBackup(master, component='common', extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
     if (component == 'common') {
         // Install Backupninja
-        if (salt.testTarget(master, 'I@backupninja:client')) {
-            salt.enforceState(master, 'I@backupninja:client', 'salt.minion.grains')
-            salt.runSaltProcessStep(master, 'I@backupninja:client', 'saltutil.sync_grains')
-            salt.runSaltProcessStep(master, 'I@backupninja:client', 'mine.flush')
-            salt.runSaltProcessStep(master, 'I@backupninja:client', 'mine.update')
-            salt.enforceState(master, 'I@backupninja:client', 'backupninja')
+        if (salt.testTarget(master, "I@backupninja:client ${extra_tgt}")) {
+            salt.enforceState(master, "I@backupninja:client ${extra_tgt}", 'salt.minion.grains')
+            salt.runSaltProcessStep(master, "I@backupninja:client ${extra_tgt}", 'saltutil.sync_grains')
+            salt.runSaltProcessStep(master, "I@backupninja:client ${extra_tgt}", 'mine.flush')
+            salt.runSaltProcessStep(master, "I@backupninja:client ${extra_tgt}", 'mine.update')
+            salt.enforceState(master, "I@backupninja:client ${extra_tgt}", 'backupninja')
         }
-        if (salt.testTarget(master, 'I@backupninja:server')) {
-            salt.enforceState(master, 'I@backupninja:server', 'salt.minion.grains')
-            salt.enforceState(master, 'I@backupninja:server', 'backupninja')
+        if (salt.testTarget(master, "I@backupninja:server ${extra_tgt}")) {
+            salt.enforceState(master, "I@backupninja:server ${extra_tgt}", 'salt.minion.grains')
+            salt.enforceState(master, "I@backupninja:server ${extra_tgt}", 'backupninja')
         }
     } else if (component == 'mysql') {
         // Install Xtrabackup
-        if (salt.testTarget(master, 'I@xtrabackup:client')) {
-            salt.enforceState(master, 'I@xtrabackup:client', 'salt.minion.grains')
-            salt.runSaltProcessStep(master, 'I@xtrabackup:client', 'saltutil.sync_grains')
-            salt.runSaltProcessStep(master, 'I@xtrabackup:client', 'mine.flush')
-            salt.runSaltProcessStep(master, 'I@xtrabackup:client', 'mine.update')
-            salt.enforceState(master, 'I@xtrabackup:client', 'xtrabackup')
+        if (salt.testTarget(master, "I@xtrabackup:client ${extra_tgt}")) {
+            salt.enforceState(master, "I@xtrabackup:client ${extra_tgt}", 'salt.minion.grains')
+            salt.runSaltProcessStep(master, "I@xtrabackup:client ${extra_tgt}", 'saltutil.sync_grains')
+            salt.runSaltProcessStep(master, "I@xtrabackup:client ${extra_tgt}", 'mine.flush')
+            salt.runSaltProcessStep(master, "I@xtrabackup:client ${extra_tgt}", 'mine.update')
+            salt.enforceState(master, "I@xtrabackup:client ${extra_tgt}", 'xtrabackup')
         }
-        if (salt.testTarget(master, 'I@xtrabackup:server')) {
-            salt.enforceState(master, 'I@xtrabackup:server', 'xtrabackup')
+        if (salt.testTarget(master, "I@xtrabackup:server ${extra_tgt}")) {
+            salt.enforceState(master, "I@xtrabackup:server ${extra_tgt}", 'xtrabackup')
         }
     } else if (component == 'contrail') {
 
         // Install Cassandra backup
-        if (salt.testTarget(master, 'I@cassandra:backup:client')) {
-            salt.enforceState(master, 'I@cassandra:backup:client', 'salt.minion.grains')
-            salt.runSaltProcessStep(master, 'I@cassandra:backup:client', 'saltutil.sync_grains')
-            salt.runSaltProcessStep(master, 'I@cassandra:backup:client', 'mine.flush')
-            salt.runSaltProcessStep(master, 'I@cassandra:backup:client', 'mine.update')
-            salt.enforceState(master, 'I@cassandra:backup:client', 'cassandra.backup')
+        if (salt.testTarget(master, "I@cassandra:backup:client ${extra_tgt}")) {
+            salt.enforceState(master, "I@cassandra:backup:client ${extra_tgt}", 'salt.minion.grains')
+            salt.runSaltProcessStep(master, "I@cassandra:backup:client ${extra_tgt}", 'saltutil.sync_grains')
+            salt.runSaltProcessStep(master, "I@cassandra:backup:client ${extra_tgt}", 'mine.flush')
+            salt.runSaltProcessStep(master, "I@cassandra:backup:client ${extra_tgt}", 'mine.update')
+            salt.enforceState(master, "I@cassandra:backup:client ${extra_tgt}", 'cassandra.backup')
         }
-        if (salt.testTarget(master, 'I@cassandra:backup:server')) {
-            salt.enforceState(master, 'I@cassandra:backup:server', 'cassandra.backup')
+        if (salt.testTarget(master, "I@cassandra:backup:server ${extra_tgt}")) {
+            salt.enforceState(master, "I@cassandra:backup:server ${extra_tgt}", 'cassandra.backup')
         }
         // Install Zookeeper backup
-        if (salt.testTarget(master, 'I@zookeeper:backup:client')) {
-            salt.enforceState(master, 'I@zookeeper:backup:client', 'salt.minion.grains')
-            salt.runSaltProcessStep(master, 'I@zookeeper:backup:client', 'saltutil.sync_grains')
-            salt.runSaltProcessStep(master, 'I@zookeeper:backup:client', 'mine.flush')
-            salt.runSaltProcessStep(master, 'I@zookeeper:backup:client', 'mine.update')
-            salt.enforceState(master, 'I@zookeeper:backup:client', 'zookeeper.backup')
+        if (salt.testTarget(master, "I@zookeeper:backup:client ${extra_tgt}")) {
+            salt.enforceState(master, "I@zookeeper:backup:client ${extra_tgt}", 'salt.minion.grains')
+            salt.runSaltProcessStep(master, "I@zookeeper:backup:client ${extra_tgt}", 'saltutil.sync_grains')
+            salt.runSaltProcessStep(master, "I@zookeeper:backup:client ${extra_tgt}", 'mine.flush')
+            salt.runSaltProcessStep(master, "I@zookeeper:backup:client ${extra_tgt}", 'mine.update')
+            salt.enforceState(master, "I@zookeeper:backup:client ${extra_tgt}", 'zookeeper.backup')
         }
-        if (salt.testTarget(master, 'I@zookeeper:backup:server')) {
-            salt.enforceState(master, 'I@zookeeper:backup:server', 'zookeeper.backup')
+        if (salt.testTarget(master, "I@zookeeper:backup:server ${extra_tgt}")) {
+            salt.enforceState(master, "I@zookeeper:backup:server ${extra_tgt}", 'zookeeper.backup')
         }
     } else if (component == 'ceph') {
         // Install Ceph backup
-        if (salt.testTarget(master, 'I@ceph:backup:client')) {
-            salt.enforceState(master, 'I@ceph:backup:client', 'salt.minion.grains')
-            salt.runSaltProcessStep(master, 'I@ceph:backup:client', 'saltutil.sync_grains')
-            salt.runSaltProcessStep(master, 'I@ceph:backup:client', 'mine.flush')
-            salt.runSaltProcessStep(master, 'I@ceph:backup:client', 'mine.update')
-            salt.enforceState(master, 'I@ceph:backup:client', 'ceph.backup')
+        if (salt.testTarget(master, "I@ceph:backup:client ${extra_tgt}")) {
+            salt.enforceState(master, "I@ceph:backup:client ${extra_tgt}", 'salt.minion.grains')
+            salt.runSaltProcessStep(master, "I@ceph:backup:client ${extra_tgt}", 'saltutil.sync_grains')
+            salt.runSaltProcessStep(master, "I@ceph:backup:client ${extra_tgt}", 'mine.flush')
+            salt.runSaltProcessStep(master, "I@ceph:backup:client ${extra_tgt}", 'mine.update')
+            salt.enforceState(master, "I@ceph:backup:client ${extra_tgt}", 'ceph.backup')
         }
-        if (salt.testTarget(master, 'I@ceph:backup:server')) {
-            salt.enforceState(master, 'I@ceph:backup:server', 'ceph.backup')
+        if (salt.testTarget(master, "I@ceph:backup:server ${extra_tgt}")) {
+            salt.enforceState(master, "I@ceph:backup:server ${extra_tgt}", 'ceph.backup')
         }
     }
 
@@ -1113,78 +1118,78 @@
 // Ceph
 //
 
-def installCephMon(master, target='I@ceph:mon') {
+def installCephMon(master, target="I@ceph:mon", extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
-    salt.enforceState(master, 'I@ceph:common', 'salt.minion.grains')
+    salt.enforceState(master, "I@ceph:common ${extra_tgt}", 'salt.minion.grains')
 
     // generate keyrings
-    if (salt.testTarget(master, 'I@ceph:mon:keyring:mon or I@ceph:common:keyring:admin')) {
-        salt.enforceState(master, 'I@ceph:mon:keyring:mon or I@ceph:common:keyring:admin', 'ceph.mon')
-        salt.runSaltProcessStep(master, 'I@ceph:mon', 'saltutil.sync_grains')
-        salt.runSaltProcessStep(master, 'I@ceph:mon:keyring:mon or I@ceph:common:keyring:admin', 'mine.update')
+    if (salt.testTarget(master, "I@ceph:mon:keyring:mon ${extra_tgt} or I@ceph:common:keyring:admin ${extra_tgt}")) {
+        salt.enforceState(master, "I@ceph:mon:keyring:mon ${extra_tgt} or I@ceph:common:keyring:admin ${extra_tgt}", 'ceph.mon')
+        salt.runSaltProcessStep(master, "I@ceph:mon ${extra_tgt}", 'saltutil.sync_grains')
+        salt.runSaltProcessStep(master, "I@ceph:mon:keyring:mon ${extra_tgt} or I@ceph:common:keyring:admin ${extra_tgt}", 'mine.update')
         sleep(5)
     }
     // install Ceph Mons
     salt.enforceState(master, target, 'ceph.mon')
-    if (salt.testTarget(master, 'I@ceph:mgr')) {
-        salt.enforceState(master, 'I@ceph:mgr', 'ceph.mgr')
+    if (salt.testTarget(master, "I@ceph:mgr ${extra_tgt}")) {
+        salt.enforceState(master, "I@ceph:mgr ${extra_tgt}", 'ceph.mgr')
     }
 }
 
-def installCephOsd(master, target='I@ceph:osd', setup=true) {
+def installCephOsd(master, target="I@ceph:osd", setup=true, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
     // install Ceph OSDs
     salt.enforceState(master, target, 'ceph.osd')
-    salt.runSaltProcessStep(master, 'I@ceph:osd', 'saltutil.sync_grains')
+    salt.runSaltProcessStep(master, "I@ceph:osd ${extra_tgt}", 'saltutil.sync_grains')
     salt.enforceState(master, target, 'ceph.osd.custom')
-    salt.runSaltProcessStep(master, 'I@ceph:osd', 'saltutil.sync_grains')
-    salt.runSaltProcessStep(master, 'I@ceph:osd', 'mine.update')
+    salt.runSaltProcessStep(master, "I@ceph:osd ${extra_tgt}", 'saltutil.sync_grains')
+    salt.runSaltProcessStep(master, "I@ceph:osd ${extra_tgt}", 'mine.update')
     installBackup(master, 'ceph')
 
     // setup pools, keyrings and maybe crush
-    if (salt.testTarget(master, 'I@ceph:setup') && setup) {
+    if (salt.testTarget(master, "I@ceph:setup ${extra_tgt}") && setup) {
         sleep(5)
-        salt.enforceState(master, 'I@ceph:setup', 'ceph.setup')
+        salt.enforceState(master, "I@ceph:setup ${extra_tgt}", 'ceph.setup')
     }
 }
 
-def installCephClient(master) {
+def installCephClient(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
     // install Ceph Radosgw
-    if (salt.testTarget(master, 'I@ceph:radosgw')) {
-        salt.runSaltProcessStep(master, 'I@ceph:radosgw', 'saltutil.sync_grains')
-        salt.enforceState(master, 'I@ceph:radosgw', 'ceph.radosgw')
+    if (salt.testTarget(master, "I@ceph:radosgw ${extra_tgt}")) {
+        salt.runSaltProcessStep(master, "I@ceph:radosgw ${extra_tgt}", 'saltutil.sync_grains')
+        salt.enforceState(master, "I@ceph:radosgw ${extra_tgt}", 'ceph.radosgw')
     }
     // setup Keystone service and endpoints for swift or / and S3
-    if (salt.testTarget(master, 'I@keystone:client')) {
-        salt.enforceState(master, 'I@keystone:client', 'keystone.client')
+    if (salt.testTarget(master, "I@keystone:client ${extra_tgt}")) {
+        salt.enforceState(master, "I@keystone:client ${extra_tgt}", 'keystone.client')
     }
 }
 
-def connectCeph(master) {
+def connectCeph(master, extra_tgt = '') {
     def salt = new com.mirantis.mk.Salt()
 
     // connect Ceph to the env
-    if (salt.testTarget(master, 'I@ceph:common and I@glance:server')) {
-        salt.enforceState(master, 'I@ceph:common and I@glance:server', ['ceph.common', 'ceph.setup.keyring', 'glance'])
-        salt.runSaltProcessStep(master, 'I@ceph:common and I@glance:server', 'service.restart', ['glance-api'])
+    if (salt.testTarget(master, "I@ceph:common and I@glance:server ${extra_tgt}")) {
+        salt.enforceState(master, "I@ceph:common and I@glance:server ${extra_tgt}", ['ceph.common', 'ceph.setup.keyring', 'glance'])
+        salt.runSaltProcessStep(master, "I@ceph:common and I@glance:server ${extra_tgt}", 'service.restart', ['glance-api'])
     }
-    if (salt.testTarget(master, 'I@ceph:common and I@cinder:controller')) {
-        salt.enforceState(master, 'I@ceph:common and I@cinder:controller', ['ceph.common', 'ceph.setup.keyring', 'cinder'])
-        salt.runSaltProcessStep(master, 'I@ceph:common and I@cinder:controller', 'service.restart', ['cinder-volume'])
+    if (salt.testTarget(master, "I@ceph:common and I@cinder:controller ${extra_tgt}")) {
+        salt.enforceState(master, "I@ceph:common and I@cinder:controller ${extra_tgt}", ['ceph.common', 'ceph.setup.keyring', 'cinder'])
+        salt.runSaltProcessStep(master, "I@ceph:common and I@cinder:controller ${extra_tgt}", 'service.restart', ['cinder-volume'])
     }
-    if (salt.testTarget(master, 'I@ceph:common and I@nova:compute')) {
-        salt.enforceState(master, 'I@ceph:common and I@nova:compute', ['ceph.common', 'ceph.setup.keyring'])
-        salt.runSaltProcessStep(master, 'I@ceph:common and I@nova:compute', 'saltutil.sync_grains')
-        salt.enforceState(master, 'I@ceph:common and I@nova:compute', ['nova'])
-        salt.runSaltProcessStep(master, 'I@ceph:common and I@nova:compute', 'service.restart', ['nova-compute'])
+    if (salt.testTarget(master, "I@ceph:common and I@nova:compute ${extra_tgt}")) {
+        salt.enforceState(master, "I@ceph:common and I@nova:compute ${extra_tgt}", ['ceph.common', 'ceph.setup.keyring'])
+        salt.runSaltProcessStep(master, "I@ceph:common and I@nova:compute ${extra_tgt}", 'saltutil.sync_grains')
+        salt.enforceState(master, "I@ceph:common and I@nova:compute ${extra_tgt}", ['nova'])
+        salt.runSaltProcessStep(master, "I@ceph:common and I@nova:compute ${extra_tgt}", 'service.restart', ['nova-compute'])
     }
 }
 
-def installOssInfra(master) {
+def installOssInfra(master, extra_tgt = '') {
   def common = new com.mirantis.mk.Common()
   def salt = new com.mirantis.mk.Salt()
 
@@ -1193,19 +1198,19 @@
     orchestrate.installInfra(master)
   }
 
-  if (salt.testTarget(master, 'I@devops_portal:config')) {
-    salt.enforceState(master, 'I@devops_portal:config', 'devops_portal.config')
-    salt.enforceState(master, 'I@rundeck:client', ['linux.system.user', 'openssh'])
-    salt.enforceState(master, 'I@rundeck:server', 'rundeck.server')
+  if (salt.testTarget(master, "I@devops_portal:config ${extra_tgt}")) {
+    salt.enforceState(master, "I@devops_portal:config ${extra_tgt}", 'devops_portal.config')
+    salt.enforceState(master, "I@rundeck:client ${extra_tgt}", ['linux.system.user', 'openssh'])
+    salt.enforceState(master, "I@rundeck:server ${extra_tgt}", 'rundeck.server')
   }
 }
 
-def installOss(master) {
+def installOss(master, extra_tgt = '') {
   def common = new com.mirantis.mk.Common()
   def salt = new com.mirantis.mk.Salt()
 
   //Get oss VIP address
-  def pillar = salt.getPillar(master, 'cfg01*', '_param:stacklight_monitor_address')
+  def pillar = salt.getPillar(master, "cfg01* ${extra_tgt}", '_param:stacklight_monitor_address')
   common.prettyPrint(pillar)
 
   def oss_vip
@@ -1218,28 +1223,28 @@
   // Postgres client - initialize OSS services databases
   timeout(120){
     common.infoMsg("Waiting for postgresql database to come up..")
-    salt.cmdRun(master, 'I@postgresql:client', 'while true; do if docker service logs postgresql_postgresql-db 2>&1 | grep "ready to accept"; then break; else sleep 5; fi; done')
+    salt.cmdRun(master, "I@postgresql:client ${extra_tgt}", 'while true; do if docker service logs postgresql_postgresql-db 2>&1 | grep "ready to accept"; then break; else sleep 5; fi; done')
   }
   // XXX: first run usually fails on some inserts, but we need to create databases at first
-  salt.enforceState(master, 'I@postgresql:client', 'postgresql.client', true, false)
+  salt.enforceState(master, "I@postgresql:client ${extra_tgt}", 'postgresql.client', true, false)
 
   // Setup postgres database with integration between
   // Pushkin notification service and Security Monkey security audit service
   timeout(10) {
     common.infoMsg("Waiting for Pushkin to come up..")
-    salt.cmdRun(master, 'I@postgresql:client', "while true; do curl -sf ${oss_vip}:8887/apps >/dev/null && break; done")
+    salt.cmdRun(master, "I@postgresql:client ${extra_tgt}", "while true; do curl -sf ${oss_vip}:8887/apps >/dev/null && break; done")
   }
-  salt.enforceState(master, 'I@postgresql:client', 'postgresql.client')
+  salt.enforceState(master, "I@postgresql:client ${extra_tgt}", 'postgresql.client')
 
   // Rundeck
   timeout(10) {
     common.infoMsg("Waiting for Rundeck to come up..")
-    salt.cmdRun(master, 'I@rundeck:client', "while true; do curl -sf ${oss_vip}:4440 >/dev/null && break; done")
+    salt.cmdRun(master, "I@rundeck:client ${extra_tgt}", "while true; do curl -sf ${oss_vip}:4440 >/dev/null && break; done")
   }
-  salt.enforceState(master, 'I@rundeck:client', 'rundeck.client')
+  salt.enforceState(master, "I@rundeck:client ${extra_tgt}", 'rundeck.client')
 
   // Elasticsearch
-  pillar = salt.getPillar(master, 'I@elasticsearch:client', 'elasticsearch:client:server:host')
+  pillar = salt.getPillar(master, "I@elasticsearch:client ${extra_tgt}", 'elasticsearch:client:server:host')
   def elasticsearch_vip
   if(!pillar['return'].isEmpty()) {
     elasticsearch_vip = pillar['return'][0].values()[0]
@@ -1249,7 +1254,7 @@
 
   timeout(10) {
     common.infoMsg('Waiting for Elasticsearch to come up..')
-    salt.cmdRun(master, 'I@elasticsearch:client', "while true; do curl -sf ${elasticsearch_vip}:9200 >/dev/null && break; done")
+    salt.cmdRun(master, "I@elasticsearch:client ${extra_tgt}", "while true; do curl -sf ${elasticsearch_vip}:9200 >/dev/null && break; done")
   }
-  salt.enforceState(master, 'I@elasticsearch:client', 'elasticsearch.client')
+  salt.enforceState(master, "I@elasticsearch:client ${extra_tgt}", 'elasticsearch.client')
 }
diff --git a/src/com/mirantis/mk/Salt.groovy b/src/com/mirantis/mk/Salt.groovy
index 188af61..6ddac8a 100644
--- a/src/com/mirantis/mk/Salt.groovy
+++ b/src/com/mirantis/mk/Salt.groovy
@@ -905,7 +905,7 @@
  * @param reclass_dir    Directory where Reclass git repo is located
  */
 
-def setSaltOverrides(saltId, salt_overrides, reclass_dir="/srv/salt/reclass") {
+def setSaltOverrides(saltId, salt_overrides, reclass_dir="/srv/salt/reclass", extra_tgt = '') {
     def common = new com.mirantis.mk.Common()
     def salt_overrides_map = readYaml text: salt_overrides
     for (entry in common.entries(salt_overrides_map)) {
@@ -913,9 +913,9 @@
          def value = entry[1]
 
          common.debugMsg("Set salt override ${key}=${value}")
-         runSaltProcessStep(saltId, 'I@salt:master', 'reclass.cluster_meta_set', [key, value], false)
+         runSaltProcessStep(saltId, "I@salt:master ${extra_tgt}", 'reclass.cluster_meta_set', [key, value], false)
     }
-    runSaltProcessStep(saltId, 'I@salt:master', 'cmd.run', ["git -C ${reclass_dir} update-index --skip-worktree classes/cluster/overrides.yml"])
+    runSaltProcessStep(saltId, "I@salt:master ${extra_tgt}", 'cmd.run', ["git -C ${reclass_dir} update-index --skip-worktree classes/cluster/overrides.yml"])
 }
 
 /**
