Merge "Update Metaswitch vSBC vnf-onboarding job definition"
diff --git a/aodh/server/cluster.yml b/aodh/server/cluster.yml
index 91ebe12..d1f6583 100644
--- a/aodh/server/cluster.yml
+++ b/aodh/server/cluster.yml
@@ -9,6 +9,7 @@
   aodh:
     server:
       enabled: true
+      role: ${_param:openstack_node_role}
       version: ${_param:aodh_version}
       cluster: true
       ttl: 86400
diff --git a/aodh/server/single.yml b/aodh/server/single.yml
index 6eec70e..b2a55a6 100644
--- a/aodh/server/single.yml
+++ b/aodh/server/single.yml
@@ -5,6 +5,7 @@
     openstack_event_alarm_topic: alarm.all
   aodh:
     server:
+      role: ${_param:openstack_node_role}
       region: ${_param:openstack_region}
       event_alarm_topic: ${_param:openstack_event_alarm_topic}
       identity:
diff --git a/barbican/server/cluster.yml b/barbican/server/cluster.yml
index ed45b47..d8b570c 100644
--- a/barbican/server/cluster.yml
+++ b/barbican/server/cluster.yml
@@ -6,5 +6,6 @@
     cluster_internal_protocol: 'http'
   barbican:
     server:
+      role: ${_param:openstack_node_role}
       identity:
         protocol: ${_param:cluster_internal_protocol}
diff --git a/barbican/server/single.yml b/barbican/server/single.yml
index aab0b18..b115e79 100644
--- a/barbican/server/single.yml
+++ b/barbican/server/single.yml
@@ -5,5 +5,6 @@
     internal_protocol: 'http'
   barbican:
     server:
+      role: ${_param:openstack_node_role}
       identity:
         protocol: ${_param:internal_protocol}
diff --git a/billometer/server/single.yml b/billometer/server/single.yml
index be13be2..8152202 100644
--- a/billometer/server/single.yml
+++ b/billometer/server/single.yml
@@ -22,7 +22,7 @@
       database:
         billometer:
           encoding: UTF8
-          locale: cs_CZ
+          locale: en_US
           users:
           - name: billometer
             createdb: true
diff --git a/ceilometer/agent/telemetry/cluster.yml b/ceilometer/agent/telemetry/cluster.yml
new file mode 100644
index 0000000..bc67493
--- /dev/null
+++ b/ceilometer/agent/telemetry/cluster.yml
@@ -0,0 +1,31 @@
+classes:
+- service.ceilometer.agent.cluster.common
+parameters:
+  ceilometer:
+    agent:
+      region: ${_param:openstack_region}
+      enabled: true
+      version: ${_param:ceilometer_version}
+      secret: ${_param:ceilometer_secret_key}
+      identity:
+        engine: keystone
+        host: ${_param:keystone_service_host}
+        port: 35357
+        tenant: service
+        user: ceilometer
+        password: ${_param:keystone_ceilometer_password}
+        region: ${_param:openstack_region}
+      message_queue:
+        engine: rabbitmq
+        members:
+          - host: ${_param:openstack_message_queue_node01_address}
+          - host: ${_param:openstack_message_queue_node02_address}
+          - host: ${_param:openstack_message_queue_node03_address}
+        user: openstack
+        password: ${_param:rabbitmq_openstack_password}
+        virtual_host: '/openstack'
+        ha_queues: true
+  nova:
+    compute:
+      notification:
+        driver: messagingv2
diff --git a/ceilometer/agent/telemetry/single.yml b/ceilometer/agent/telemetry/single.yml
new file mode 100644
index 0000000..6b42537
--- /dev/null
+++ b/ceilometer/agent/telemetry/single.yml
@@ -0,0 +1,2 @@
+classes:
+- service.ceilometer.agent.single.common
diff --git a/ceilometer/server/cluster.yml b/ceilometer/server/cluster.yml
index 19336b0..ad804f8 100644
--- a/ceilometer/server/cluster.yml
+++ b/ceilometer/server/cluster.yml
@@ -1,3 +1,4 @@
+# This class is deprecated since Openstack Pike
 classes:
 - service.ceilometer.server.cluster
 - service.haproxy.proxy.single
@@ -12,6 +13,7 @@
       cluster: true
       secret: ${_param:ceilometer_secret_key}
       ttl: 86400
+      role: ${_param:openstack_node_role}
       notification:
         workload_partitioning: true
         batch_timeout: 30
diff --git a/ceilometer/server/single.yml b/ceilometer/server/single.yml
index 9758af2..ae642f1 100644
--- a/ceilometer/server/single.yml
+++ b/ceilometer/server/single.yml
@@ -3,6 +3,7 @@
 parameters:
   ceilometer:
     server:
+      role: ${_param:openstack_node_role}
       database:
         influxdb:
           host: ${_param:stacklight_monitor_node01_address}
diff --git a/ceilometer/server/telemetry/cluster.yml b/ceilometer/server/telemetry/cluster.yml
new file mode 100644
index 0000000..d1c28ef
--- /dev/null
+++ b/ceilometer/server/telemetry/cluster.yml
@@ -0,0 +1,36 @@
+# This class intended to be used since Openstack Pike release
+classes:
+- service.ceilometer.server.cluster.common
+- system.keepalived.cluster.instance.openstack_telemetry_vip
+parameters:
+  ceilometer:
+    server:
+      enabled: true
+      version: ${_param:ceilometer_version}
+      region: ${_param:openstack_region}
+      cluster: true
+      secret: ${_param:ceilometer_secret_key}
+      ttl: 86400
+      notification:
+        workload_partitioning: true
+        batch_timeout: 30
+      bind:
+        host: ${_param:cluster_local_address}
+        port: 8777
+      identity:
+        engine: keystone
+        host: ${_param:openstack_control_address}
+        port: 35357
+        tenant: service
+        user: ceilometer
+        password: ${_param:keystone_ceilometer_password}
+        region: ${_param:openstack_region}
+      message_queue:
+        engine: rabbitmq
+        members:
+          - host: ${_param:openstack_message_queue_node01_address}
+          - host: ${_param:openstack_message_queue_node02_address}
+          - host: ${_param:openstack_message_queue_node03_address}
+        user: openstack
+        password: ${_param:rabbitmq_openstack_password}
+        virtual_host: '/openstack'
diff --git a/ceilometer/server/telemetry/single.yml b/ceilometer/server/telemetry/single.yml
new file mode 100644
index 0000000..7a98b73
--- /dev/null
+++ b/ceilometer/server/telemetry/single.yml
@@ -0,0 +1,2 @@
+classes:
+- service.ceilometer.server.single.common
diff --git a/cinder/control/cluster.yml b/cinder/control/cluster.yml
index 1110c63..b5d6862 100644
--- a/cinder/control/cluster.yml
+++ b/cinder/control/cluster.yml
@@ -25,6 +25,7 @@
       default_volume_type: ""
       backend: {}
       version: ${_param:cinder_version}
+      role: ${_param:openstack_node_role}
       osapi:
         host: ${_param:cluster_local_address}
       database:
diff --git a/cinder/control/single.yml b/cinder/control/single.yml
index d442693..89c5307 100644
--- a/cinder/control/single.yml
+++ b/cinder/control/single.yml
@@ -15,6 +15,7 @@
     controller:
       backend: {}
       default_volume_type: ''
+      role: ${_param:openstack_node_role}
       database:
         host: ${_param:single_address}
       identity:
diff --git a/debmirror/mirror_mirantis_com/glusterfs-3.8/xenial.yml b/debmirror/mirror_mirantis_com/glusterfs-3.8/xenial.yml
new file mode 100644
index 0000000..7c93811
--- /dev/null
+++ b/debmirror/mirror_mirantis_com/glusterfs-3.8/xenial.yml
@@ -0,0 +1,23 @@
+parameters:
+  _param:
+    apt_mk_version: 'stable'
+    mirror_mirantis_com_glusterfs_3_8_xenial_force: False
+    debmirror_mirrors_base_target_dir: "/srv/volumes/aptly/public/${_param:apt_mk_version}/"
+  debmirror:
+    client:
+      enabled: true
+      mirrors:
+        mirror_mirantis_com_glusterfs_3_8_xenial:
+          force: ${_param:mirror_mirantis_com_glusterfs_3_8_xenial_force}
+          lock_target: True
+          extra_flags: [ '--verbose', '--progress', '--nosource', '--no-check-gpg', '--rsync-extra=none' ]
+          method: "rsync"
+          arch: [ 'amd64' ]
+          mirror_host: "mirror.mirantis.com"
+          mirror_root: ":mirror/${_param:apt_mk_version}/glusterfs-3.8/xenial/"
+          target_dir: "${_param:debmirror_mirrors_base_target_dir}/glusterfs-3.8/xenial/"
+          log_file: "/var/log/debmirror/mirror_mirantis_com_glusterfs_3_8_xenial.log"
+          dist: [ xenial ]
+          section: [ main ]
+          filter:
+            001: "--exclude='-dbg_'"
diff --git a/debmirror/mirror_mirantis_com/saltstack/salt_2016_3.yml b/debmirror/mirror_mirantis_com/saltstack-2016.3/xenial.yml
similarity index 100%
rename from debmirror/mirror_mirantis_com/saltstack/salt_2016_3.yml
rename to debmirror/mirror_mirantis_com/saltstack-2016.3/xenial.yml
diff --git a/debmirror/mirror_mirantis_com/saltstack-2017.7/xenial.yml b/debmirror/mirror_mirantis_com/saltstack-2017.7/xenial.yml
new file mode 100644
index 0000000..542afea
--- /dev/null
+++ b/debmirror/mirror_mirantis_com/saltstack-2017.7/xenial.yml
@@ -0,0 +1,21 @@
+parameters:
+  _param:
+    apt_mk_version: 'stable'
+    mirror_mirantis_com_saltstack_2017_7_xenial_force: False
+    debmirror_mirrors_base_target_dir: "/srv/volumes/aptly/public/${_param:apt_mk_version}/"
+  debmirror:
+    client:
+      enabled: true
+      mirrors:
+        mirror_mirantis_com_saltstack_2017_7_xenial:
+          force: ${_param:mirror_mirantis_com_saltstack_2017_7_xenial_force}
+          lock_target: True
+          extra_flags: [ '--verbose', '--progress', '--nosource', '--no-check-gpg', '--rsync-extra=none' ]
+          method: "rsync"
+          arch: [ 'amd64' ]
+          mirror_host: "mirror.mirantis.com"
+          mirror_root: ":mirror/${_param:apt_mk_version}/saltstack-2017.7/xenial/"
+          target_dir: "${_param:debmirror_mirrors_base_target_dir}/saltstack-2017.7/xenial/"
+          log_file: "/var/log/debmirror/mirror_mirantis_com_saltstack_2017_7_xenial.log"
+          dist: [ xenial ]
+          section: [ main ]
diff --git a/designate/server/cluster.yml b/designate/server/cluster.yml
index afbb7df..f60f883 100644
--- a/designate/server/cluster.yml
+++ b/designate/server/cluster.yml
@@ -23,6 +23,7 @@
       region: ${_param:openstack_region}
       domain_id: ${_param:designate_domain_id}
       version: ${_param:designate_version}
+      role: ${_param:openstack_node_role}
       admin_api:
         enabled: ${_param:designate_admin_api_enabled}
         enabled_extensions_admin: quotas
diff --git a/designate/server/single.yml b/designate/server/single.yml
index 3fdd448..683180e 100644
--- a/designate/server/single.yml
+++ b/designate/server/single.yml
@@ -17,6 +17,7 @@
       region: ${_param:openstack_region}
       domain_id: ${_param:designate_domain_id}
       version: ${_param:designate_version}
+      role: ${_param:openstack_node_role}
       admin_api:
         enabled: ${_param:designate_admin_api_enabled}
         enabled_extensions_admin: quotas
diff --git a/docker/swarm/network/keycloak_backend.yml b/docker/swarm/network/keycloak_backend.yml
new file mode 100644
index 0000000..5b1c625
--- /dev/null
+++ b/docker/swarm/network/keycloak_backend.yml
@@ -0,0 +1,11 @@
+parameters:
+  _param:
+    docker_keycloak_network_subnet: 10.70.0.0/24
+  docker:
+    client:
+      network:
+        keycloak_backend:
+          subnet: ${_param:docker_keycloak_network_subnet}
+          driver: overlay
+          attachable: true
+
diff --git a/docker/swarm/stack/keycloak.yml b/docker/swarm/stack/keycloak.yml
new file mode 100644
index 0000000..0187a08
--- /dev/null
+++ b/docker/swarm/stack/keycloak.yml
@@ -0,0 +1,38 @@
+parameters:
+  _param:
+    docker_keycloak_server_replicas: 3
+    docker_keycloak_proxy_replicas: 1
+    docker_image_keycloak_server: jboss/keycloak:3.4.2.Final
+    docker_image_keycloak_proxy: jboss/keycloak-proxy:3.4.2.h
+    keycloak_bind_port: ${_param:haproxy_keycloak_bind_port}
+    keycloak_proxy_bind_port: ${_param:haproxy_keycloak_proxy_bind_port}
+  docker:
+    client:
+      stack:
+        keycloak:
+          service:
+            keycloak-server:
+              image: ${_param:docker_image_keycloak_server}
+              deploy:
+                replicas: ${_param:docker_keycloak_server_replicas}
+                restart_policy:
+                  condition: any
+              ports:
+                - ${_param:haproxy_keycloak_exposed_port}:${_param:keycloak_bind_port}
+              volumes:
+                - /srv/volumes/keycloak/server/:/app
+            keycloak-proxy:
+              image: ${_param:docker_image_keycloak_proxy}
+              deploy:
+                replicas: ${_param:docker_keycloak_proxy_replicas}
+                restart_policy:
+                  condition: any
+              ports:
+                - ${_param:haproxy_keycloak_proxy_exposed_port}:${_param:keycloak_proxy_bind_port}
+              volumes:
+                - /srv/volumes/keycloak/proxy/proxy.json:/opt/jboss/conf/proxy.json
+          network:
+            default:
+              external:
+                name: keycloak_backend
+
diff --git a/docker/swarm/stack/monitoring/alerta.yml b/docker/swarm/stack/monitoring/alerta.yml
index c0da7d5..858eb38 100644
--- a/docker/swarm/stack/monitoring/alerta.yml
+++ b/docker/swarm/stack/monitoring/alerta.yml
@@ -27,4 +27,5 @@
                 - ${prometheus:alerta:config_dir}/alerta.conf:/web/config.js
               environment:
                 ADMIN_USERS: ${_param:alerta_admin_username}
-                MONGO_URI: ${_param:alerta_mongodb_uri}
\ No newline at end of file
+                ADMIN_PASSWORD: ${_param:alerta_admin_password}
+                MONGO_URI: ${_param:alerta_mongodb_uri}
diff --git a/galera/server/database/tacker.yml b/galera/server/database/tacker.yml
new file mode 100644
index 0000000..9cd76b5
--- /dev/null
+++ b/galera/server/database/tacker.yml
@@ -0,0 +1,19 @@
+parameters:
+  _param:
+    mysql_tacker_ssl_option: []
+  mysql:
+    server:
+      database:
+        tacker:
+          encoding: utf8
+          users:
+          - name: tacker
+            password: ${_param:mysql_tacker_password}
+            host: '%'
+            rights: all
+            ssl_option: ${_param:mysql_tacker_ssl_option}
+          - name: tacker
+            password: ${_param:mysql_tacker_password}
+            host: ${_param:cluster_local_address}
+            rights: all
+            ssl_option: ${_param:mysql_tacker_ssl_option}
diff --git a/gerrit/server/single.yml b/gerrit/server/single.yml
index c279f00..f0f6492 100644
--- a/gerrit/server/single.yml
+++ b/gerrit/server/single.yml
@@ -61,7 +61,7 @@
         gerrit:
           enabled: true
           encoding: 'UTF8'
-          locale: 'cs_CZ'
+          locale: 'en_US'
           users:
           - name: gerrit
             password: ${_param:postgresql_gerrit_password}
diff --git a/glance/control/cluster.yml b/glance/control/cluster.yml
index bb87f16..e218835 100644
--- a/glance/control/cluster.yml
+++ b/glance/control/cluster.yml
@@ -15,6 +15,7 @@
       enabled: true
       version: ${_param:glance_version}
       workers: 8
+      role: ${_param:openstack_node_role}
       database:
         engine: mysql
         host: ${_param:openstack_database_address}
diff --git a/glance/control/single.yml b/glance/control/single.yml
index 5580b66..63e1b48 100644
--- a/glance/control/single.yml
+++ b/glance/control/single.yml
@@ -9,6 +9,7 @@
           version: latest
   glance:
     server:
+      role: ${_param:openstack_node_role}
       database:
         host: ${_param:single_address}
       identity:
diff --git a/glusterfs/client/volume/keycloak.yml b/glusterfs/client/volume/keycloak.yml
new file mode 100644
index 0000000..06d6134
--- /dev/null
+++ b/glusterfs/client/volume/keycloak.yml
@@ -0,0 +1,16 @@
+parameters:
+  _param:
+    keycloak_glusterfs_service_host: ${_param:glusterfs_service_host}
+    glusterfs_node01_address: ${_param:cluster_node01_address}
+    glusterfs_node02_address: ${_param:cluster_node02_address}
+    glusterfs_node03_address: ${_param:cluster_node03_address}
+  glusterfs:
+    client:
+      volumes:
+        keycloak:
+          path: /srv/volumes/keycloak
+          server: ${_param:keycloak_glusterfs_service_host}
+          opts: "defaults,backup-volfile-servers=${_param:glusterfs_node01_address}:${_param:glusterfs_node02_address}:${_param:glusterfs_node03_address}"
+          user: 1000
+          group: 1000
+
diff --git a/glusterfs/server/volume/keycloak.yml b/glusterfs/server/volume/keycloak.yml
new file mode 100644
index 0000000..c8c71f0
--- /dev/null
+++ b/glusterfs/server/volume/keycloak.yml
@@ -0,0 +1,20 @@
+parameters:
+  glusterfs:
+    server:
+      volumes:
+        keycloak:
+          storage: /srv/glusterfs/keycloak
+          replica: 3
+          bricks:
+            - ${_param:cluster_node01_address}:/srv/glusterfs/keycloak
+            - ${_param:cluster_node02_address}:/srv/glusterfs/keycloak
+            - ${_param:cluster_node03_address}:/srv/glusterfs/keycloak
+          options:
+            cluster.readdir-optimize: On
+            nfs.disable: On
+            network.remote-dio: On
+            diagnostics.client-log-level: WARNING
+            diagnostics.brick-log-level: WARNING
+            cluster.favorite-child-policy: mtime
+
+
diff --git a/gnocchi/server/cluster.yml b/gnocchi/server/cluster.yml
index 990fda2..ede63c5 100644
--- a/gnocchi/server/cluster.yml
+++ b/gnocchi/server/cluster.yml
@@ -12,6 +12,7 @@
   gnocchi:
     server:
       enable_proxy_headers_parsing: true
+      role: ${_param:openstack_node_role}
       metricd:
         metric_processing_delay: 15
         metric_reporting_delay: 30
diff --git a/gnocchi/server/single.yml b/gnocchi/server/single.yml
index d82dfee..11ddf39 100644
--- a/gnocchi/server/single.yml
+++ b/gnocchi/server/single.yml
@@ -3,6 +3,7 @@
 parameters:
   gnocchi:
     server:
+      role: ${_param:openstack_node_role}
       identity:
         region: ${_param:openstack_region}
       metricd:
diff --git a/graphite/server/single.yml b/graphite/server/single.yml
index 364877e..237c65d 100644
--- a/graphite/server/single.yml
+++ b/graphite/server/single.yml
@@ -29,7 +29,7 @@
       database:
         graphite:
           encoding: UTF8
-          locale: cs_CZ
+          locale: en_US
           users:
           - name: graphite
             password: ${_param:postgresql_graphite_password}
diff --git a/haproxy/proxy/listen/keycloak.yml b/haproxy/proxy/listen/keycloak.yml
new file mode 100644
index 0000000..73697a3
--- /dev/null
+++ b/haproxy/proxy/listen/keycloak.yml
@@ -0,0 +1,71 @@
+parameters:
+  _param:
+    haproxy_keycloak_bind_host: ${_param:haproxy_bind_address}
+    haproxy_keycloak_bind_port: 8086
+    haproxy_keycloak_exposed_port: 18086
+    haproxy_keycloak_ssl:
+      enabled: false
+    haproxy_keycloak_proxy_bind_host: ${_param:haproxy_bind_address}
+    haproxy_keycloak_proxy_bind_port: 8180
+    haproxy_keycloak_proxy_exposed_port: 18180
+    haproxy_keycloak_proxy_ssl:
+      enabled: false
+  haproxy:
+    proxy:
+      listen:
+        keycloak:
+          mode: http
+          options:
+            - forwardfor
+            - httpchk
+            - httpclose
+            - httplog
+          balance: source
+          http_request:
+            - action: "add-header X-Forwarded-Proto https"
+              condition: "if { ssl_fc }"
+          binds:
+            - address: ${_param:haproxy_keycloak_bind_host}
+              port: ${_param:haproxy_keycloak_bind_port}
+              ssl: ${_param:haproxy_keycloak_ssl}
+          servers:
+            - name: ${_param:cluster_node01_name}
+              host: ${_param:cluster_node01_address}
+              port: ${_param:haproxy_keycloak_exposed_port}
+              params: check
+            - name: ${_param:cluster_node02_name}
+              host: ${_param:cluster_node02_address}
+              port: ${_param:haproxy_keycloak_exposed_port}
+              params: backup check
+            - name: ${_param:cluster_node03_name}
+              host: ${_param:cluster_node03_address}
+              port: ${_param:haproxy_keycloak_exposed_port}
+              params: backup check
+        keycloak_proxy:
+          mode: http
+          options:
+            - forwardfor
+            - httpchk
+            - httpclose
+            - httplog
+          balance: source
+          http_request:
+            - action: "add-header X-Forwarded-Proto https"
+              condition: "if { ssl_fc }"
+          binds:
+            - address: ${_param:haproxy_keycloak_proxy_bind_host}
+              port: ${_param:haproxy_keycloak_proxy_bind_port}
+              ssl: ${_param:haproxy_keycloak_proxy_ssl}
+          servers:
+            - name: ${_param:cluster_node01_name}
+              host: ${_param:cluster_node01_address}
+              port: ${_param:haproxy_keycloak_proxy_exposed_port}
+              params: check
+            - name: ${_param:cluster_node02_name}
+              host: ${_param:cluster_node02_address}
+              port: ${_param:haproxy_keycloak_proxy_exposed_port}
+              params: backup check
+            - name: ${_param:cluster_node03_name}
+              host: ${_param:cluster_node03_address}
+              port: ${_param:haproxy_keycloak_proxy_exposed_port}
+              params: backup check
diff --git a/heat/server/cluster.yml b/heat/server/cluster.yml
index 5829aee..eee2b63 100644
--- a/heat/server/cluster.yml
+++ b/heat/server/cluster.yml
@@ -22,6 +22,7 @@
       enabled: true
       region: ${_param:openstack_region}
       version: ${_param:heat_version}
+      role: ${_param:openstack_node_role}
       bind:
         api_cfn:
           address: ${_param:cluster_local_address}
diff --git a/heat/server/single.yml b/heat/server/single.yml
index 0c83206..e686050 100644
--- a/heat/server/single.yml
+++ b/heat/server/single.yml
@@ -9,6 +9,7 @@
           version: latest
   heat:
     server:
+      role: ${_param:openstack_node_role}
       region: ${_param:openstack_region}
       stack_domain_admin:
         name: heat_domain_admin
diff --git a/horizon/server/plugin/theme.yml b/horizon/server/plugin/theme.yml
index 85475d7..cf83739 100644
--- a/horizon/server/plugin/theme.yml
+++ b/horizon/server/plugin/theme.yml
@@ -10,3 +10,12 @@
           source:
             engine: pkg
             name: openstack-dashboard-${_param:horizon_dashboard_theme}-theme
+      themes:
+        default: "mirantis"
+        available:
+          mirantis:
+            name: "Mirantis"
+            description: "Mirantis theme"
+            enabled: True
+          material:
+            enabled: False
diff --git a/ironic/api/cluster.yml b/ironic/api/cluster.yml
index 5522f3f..b0bb69f 100644
--- a/ironic/api/cluster.yml
+++ b/ironic/api/cluster.yml
@@ -11,5 +11,6 @@
     api:
       enabled: true
       version: ${_param:ironic_version}
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:cluster_baremetal_local_address}
diff --git a/ironic/api/single.yml b/ironic/api/single.yml
index ed73e90..51c3f9c 100644
--- a/ironic/api/single.yml
+++ b/ironic/api/single.yml
@@ -9,5 +9,6 @@
           version: latest
   ironic:
     api:
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:single_address}
diff --git a/jenkins/client/init.yml b/jenkins/client/init.yml
index 633288c..409b3f3 100644
--- a/jenkins/client/init.yml
+++ b/jenkins/client/init.yml
@@ -22,6 +22,7 @@
         username: ${_param:jenkins_client_user}
         password: ${_param:jenkins_client_password}
       plugin:
+        antisamy-markup-formatter: {}
         artifactory: {}
         blueocean: {}
         build-blocker-plugin: {}
diff --git a/jenkins/client/job/ceph/remove-node.yml b/jenkins/client/job/ceph/remove-node.yml
index af678b5..901e319 100644
--- a/jenkins/client/job/ceph/remove-node.yml
+++ b/jenkins/client/job/ceph/remove-node.yml
@@ -43,5 +43,5 @@
               description: Only if removing OSD host. Set to true if crush map file should be updated. Enforce has to happen manually unless it is specifically set to be enforced in pillar.
             WAIT_FOR_HEALTHY:
               type: boolean
-              default: 'false'
+              default: 'true'
               description: Wait for healthy during pipeline
diff --git a/jenkins/client/job/ceph/remove-osd.yml b/jenkins/client/job/ceph/remove-osd.yml
index 0a5801d..99dcb37 100644
--- a/jenkins/client/job/ceph/remove-osd.yml
+++ b/jenkins/client/job/ceph/remove-osd.yml
@@ -41,5 +41,5 @@
               description: Flags to be aplied before pipeline and after pipeline (comma-separated list)
             WAIT_FOR_HEALTHY:
               type: boolean
-              default: 'false'
+              default: 'true'
               description: Wait for healthy during pipeline
diff --git a/jenkins/client/job/ceph/replace-failed-osd.yml b/jenkins/client/job/ceph/replace-failed-osd.yml
index 43c2f0b..a342ffb 100644
--- a/jenkins/client/job/ceph/replace-failed-osd.yml
+++ b/jenkins/client/job/ceph/replace-failed-osd.yml
@@ -34,6 +34,9 @@
             DEVICE:
               type: string
               description: Comma separated list of failed devices that will be replaced at HOST (/dev/sdb,/dev/sdc)
+            DATA_PARTITION:
+              type: string
+              description: (Optional) Comma separated list of mounted partitions of failed device. These partitions will be unmounted. For ex. /dev/sdb1,/dev/sdb3
             JOURNAL_BLOCKDB_BLOCKWAL_PARTITION:
               type: string
               description: Comma separated list of partitions where journal, block_db or block_wal for the failed devices on this HOST were stored (/dev/sdh2,/dev/sdh3)
@@ -43,7 +46,7 @@
               default: 'cmn01*'
             WAIT_FOR_HEALTHY:
               type: boolean
-              default: 'false'
+              default: 'true'
               description: Wait for healthy during pipeline
             DMCRYPT:
               type: boolean
diff --git a/jenkins/client/job/deploy/lab/component/openstack.yml b/jenkins/client/job/deploy/lab/component/openstack.yml
index 0e526c6..2faa44a 100644
--- a/jenkins/client/job/deploy/lab/component/openstack.yml
+++ b/jenkins/client/job/deploy/lab/component/openstack.yml
@@ -18,7 +18,7 @@
         stack_env: devcloud
         stack_type: heat
         stack_install: core,openstack,contrail
-        stack_test: ""
+        stack_test: "opencontrail"
         job_timer: "H H(0-6) * * *"
       - stack_name: os_ha_contrail_ironic
         stack_env: devcloud
diff --git a/jenkins/client/job/deploy/lab/deploy.yml b/jenkins/client/job/deploy/lab/deploy.yml
index a1df125..624e553 100644
--- a/jenkins/client/job/deploy/lab/deploy.yml
+++ b/jenkins/client/job/deploy/lab/deploy.yml
@@ -106,8 +106,8 @@
                 description: "YAML with overrides for Salt deployment"
               SALT_VERSION:
                 type: text
-                default: ""
-                description: "Version of Salt which is going to be installed i.e. 'stable 2016.3' or 'stable 2017.7' etc."
+                default: "stable 2017.7"
+                description: "Version of Salt which is going to be installed i.e. 'stable 2016.3' or 'stable 2017.7' etc. Warning: This value doesn't override salt_version parameter set in the pillar."
               BOOTSTRAP_EXTRA_REPO_PARAMS:
                 type: string
                 default: ""
diff --git a/keycloak/proxy/application/devops_portal.yml b/keycloak/proxy/application/devops_portal.yml
new file mode 100644
index 0000000..bf09f69
--- /dev/null
+++ b/keycloak/proxy/application/devops_portal.yml
@@ -0,0 +1,13 @@
+parameters:
+  _param:
+    keycloak_proxy_devops_portal_base_path: "/"
+  keycloak:
+    proxy:
+      applications:
+        devops_portal:
+          base_path: "${_param:keycloak_proxy_devops_portal_base_path}"
+          adapter_config:
+            realm: "jaeger"
+            auth_server_url: "http://keycloak/auth"
+            resource: "proxy-jaeger"
+
diff --git a/keystone/client/service/tacker.yml b/keystone/client/service/tacker.yml
new file mode 100644
index 0000000..335bc6e
--- /dev/null
+++ b/keystone/client/service/tacker.yml
@@ -0,0 +1,34 @@
+parameters:
+  _param:
+    cluster_public_protocol: https
+    tacker_service_protocol: http
+    tacker_public_host: ${_param:cluster_public_host}
+  keystone:
+    client:
+      server:
+        identity:
+          project:
+            service:
+              user:
+                tacker:
+                  is_admin: true
+                  password: ${_param:keystone_tacker_password}
+                  email: ${_param:admin_email}
+          service:
+            tacker:
+              type: nfv-orchestration
+              description: OpenStack Tacker NFV Orchestrator Service
+              endpoints:
+              - region: ${_param:openstack_region}
+                public_address: ${_param:tacker_public_host}
+                public_protocol: ${_param:cluster_public_protocol}
+                public_port: 9890
+                public_path: '/'
+                internal_address: ${_param:tacker_service_host}
+                internal_port: 9890
+                internal_path: '/'
+                internal_protocol: ${_param:tacker_service_protocol}
+                admin_protocol: ${_param:tacker_service_protocol}
+                admin_address: ${_param:tacker_service_host}
+                admin_port: 9890
+                admin_path: '/'
diff --git a/keystone/client/v3/service/tacker.yml b/keystone/client/v3/service/tacker.yml
new file mode 100644
index 0000000..c5187dd
--- /dev/null
+++ b/keystone/client/v3/service/tacker.yml
@@ -0,0 +1,34 @@
+parameters:
+  _param:
+    cluster_public_protocol: https
+    tacker_service_protocol: http
+    tacker_public_host: ${_param:cluster_public_host}
+  keystone:
+    client:
+      resources:
+        v3:
+          users:
+            tacker:
+              password: ${_param:keystone_tacker_password}
+              email: ${_param:admin_email}
+              roles:
+                service_admin:
+                  name: admin
+                  project_id: service
+          service:
+            tacker:
+              type: nfv-orchestration
+              description: OpenStack Tacker NFV Orchestrator Service
+              endpoints:
+                tacker_public:
+                  interface: 'public'
+                  url: ${_param:cluster_public_protocol}://${_param:tacker_public_host}:9890/
+                  region: ${_param:openstack_region}
+                tacker_internal:
+                  interface: 'internal'
+                  url: ${_param:tacker_service_protocol}://${_param:tacker_service_host}:9890/
+                  region: ${_param:openstack_region}
+                tacker_admin:
+                  interface: 'admin'
+                  url: ${_param:tacker_service_protocol}://${_param:tacker_service_host}:9890/
+                  region: ${_param:openstack_region}
diff --git a/keystone/server/cluster.yml b/keystone/server/cluster.yml
index 0ae502b..7e6980b 100644
--- a/keystone/server/cluster.yml
+++ b/keystone/server/cluster.yml
@@ -6,6 +6,7 @@
 parameters:
   _param:
     keystone_tokens_expiration: 3600
+    openstack_node_role: primary
   linux:
     system:
       package:
@@ -25,6 +26,7 @@
       admin_name: admin
       admin_password: ${_param:keystone_admin_password}
       admin_email: ${_param:admin_email}
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:cluster_local_address}
         private_address: ${_param:cluster_vip_address}
diff --git a/keystone/server/single.yml b/keystone/server/single.yml
index 16c26ca..2b1e89e 100644
--- a/keystone/server/single.yml
+++ b/keystone/server/single.yml
@@ -8,6 +8,7 @@
     mysql_admin_password: password
     mysql_keystone_password: password
     keystone_tokens_expiration: 3600
+    openstack_node_role: primary
   linux:
     system:
       package:
@@ -24,6 +25,7 @@
       admin_name: admin
       admin_password: ${_param:keystone_admin_password}
       admin_email: ${_param:admin_email}
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:single_address}
         private_address: ${_param:single_address}
diff --git a/kubernetes/common.yml b/kubernetes/common.yml
index f977997..ddf6973 100644
--- a/kubernetes/common.yml
+++ b/kubernetes/common.yml
@@ -20,13 +20,13 @@
     # component docker images
     kubernetes_docker_package: docker-engine=1.13.1-0~ubuntu-xenial
     kubernetes_calico_calicoctl_image: ${_param:kubernetes_calico_calicoctl_repo}/ctl:v1.6.4
-    kubernetes_calico_image: ${_param:kubernetes_calico_repo}/node:v2.6.9
-    kubernetes_calico_cni_image: ${_param:kubernetes_calico_cni_repo}/cni:v1.11.5
+    kubernetes_calico_image: ${_param:kubernetes_calico_repo}/node:v2.6.10
+    kubernetes_calico_cni_image: ${_param:kubernetes_calico_cni_repo}/cni:v1.11.6
     kubernetes_hyperkube_image: ${_param:kubernetes_hyperkube_repo}/hyperkube-amd64:v1.10.4-4
     kubernetes_pause_image: ${_param:kubernetes_hyperkube_repo}/pause-amd64:v1.10.4-4
     kubernetes_contrail_cni_image: ${_param:kubernetes_contrail_cni_repo}/contrail-cni:v1.2.0
     kubernetes_contrail_network_controller_image: ${_param:kubernetes_contrail_network_controller_repo}/contrail-network-controller:v1.2.0
-    kubernetes_virtlet_image: ${_param:kubernetes_virtlet_repo}/virtlet:v1.1.1
+    kubernetes_virtlet_image: ${_param:kubernetes_virtlet_repo}/virtlet:v1.1.2
     kubernetes_criproxy_version: v0.11.1
     kubernetes_criproxy_checksum: md5=a3f1f08bdc7a8d6eb73b7c8fa5bae200
     kubernetes_netchecker_agent_image: ${_param:kubernetes_netchecker_agent_repo}/k8s-netchecker-agent:v1.2.2
@@ -107,28 +107,6 @@
           criproxy_source: ${_param:kubernetes_criproxy_checksum}
         metallb:
           enabled: ${_param:kubernetes_metallb_enabled}
-    master:
-      enabled: false
-      kubelet:
-        fail_on_swap: ${_param:kubelet_fail_on_swap}
-      container: false
-      network:
-        genie:
-          enabled: ${_param:kubernetes_genie_enabled}
-          source: ${_param:kubernetes_genie_source}
-          source_hash: ${_param:kubernetes_genie_source_hash}
-        calico:
-          enabled: ${_param:kubernetes_calico_enabled}
-          image: ${_param:kubernetes_calico_image}
-          calicoctl_image: ${_param:kubernetes_calico_calicoctl_image}
-          cni_image: ${_param:kubernetes_calico_cni_image}
-        opencontrail:
-          enabled: ${_param:kubernetes_opencontrail_enabled}
-          cni_image: ${_param:kubernetes_contrail_cni_image}
-        sriov:
-          enabled: ${_param:kubernetes_sriov_enabled}
-          source: ${_param:kubernetes_sriov_source}
-          source_hash: ${_param:kubernetes_sriov_source_hash}
     pool:
       enabled: false
       kubelet:
diff --git a/kubernetes/master/cluster.yml b/kubernetes/master/cluster.yml
index 5d0933c..7cddd21 100644
--- a/kubernetes/master/cluster.yml
+++ b/kubernetes/master/cluster.yml
@@ -3,13 +3,10 @@
 - service.haproxy.proxy.single
 - system.haproxy.proxy.listen.kubernetes.apiserver
 - system.keepalived.cluster.instance.kube_api_server_vip
-- system.kubernetes.common
+- system.kubernetes.master.common
 parameters:
   kubernetes:
     master:
-      enabled: true
-      network:
         calico:
           prometheus:
             enabled: true
-
diff --git a/kubernetes/master/common.yml b/kubernetes/master/common.yml
new file mode 100644
index 0000000..0923286
--- /dev/null
+++ b/kubernetes/master/common.yml
@@ -0,0 +1,26 @@
+classes:
+- system.kubernetes.common
+parameters:
+  kubernetes:
+    master:
+      enabled: true
+      kubelet:
+        fail_on_swap: ${_param:kubelet_fail_on_swap}
+      container: false
+      network:
+        genie:
+          enabled: ${_param:kubernetes_genie_enabled}
+          source: ${_param:kubernetes_genie_source}
+          source_hash: ${_param:kubernetes_genie_source_hash}
+        calico:
+          enabled: ${_param:kubernetes_calico_enabled}
+          image: ${_param:kubernetes_calico_image}
+          calicoctl_image: ${_param:kubernetes_calico_calicoctl_image}
+          cni_image: ${_param:kubernetes_calico_cni_image}
+        opencontrail:
+          enabled: ${_param:kubernetes_opencontrail_enabled}
+          cni_image: ${_param:kubernetes_contrail_cni_image}
+        sriov:
+          enabled: ${_param:kubernetes_sriov_enabled}
+          source: ${_param:kubernetes_sriov_source}
+          source_hash: ${_param:kubernetes_sriov_source_hash}
\ No newline at end of file
diff --git a/kubernetes/master/single.yml b/kubernetes/master/single.yml
index 1898549..31cbc28 100644
--- a/kubernetes/master/single.yml
+++ b/kubernetes/master/single.yml
@@ -1,7 +1,3 @@
 classes:
 - service.kubernetes.master.single
-- system.kubernetes.common
-parameters:
-  kubernetes:
-    master:
-      enabled: true
+- system.kubernetes.master.common
diff --git a/linux/system/repo/glusterfs.yml b/linux/system/repo/glusterfs.yml
index 71d3cb9..d6f09da 100644
--- a/linux/system/repo/glusterfs.yml
+++ b/linux/system/repo/glusterfs.yml
@@ -2,4 +2,4 @@
 - system.linux.system.repo.mcp.apt_mirantis.glusterfs
 parameters:
   _param:
-    linux_system_repo_mcp_glusterfs_version_number: "3.8"
+    linux_system_repo_mcp_glusterfs_version_number: "3.10"
diff --git a/linux/system/repo_local/mcp/apt_mirantis/glusterfs.yml b/linux/system/repo_local/mcp/apt_mirantis/glusterfs.yml
index cb3444b..57625a3 100644
--- a/linux/system/repo_local/mcp/apt_mirantis/glusterfs.yml
+++ b/linux/system/repo_local/mcp/apt_mirantis/glusterfs.yml
@@ -1,3 +1,5 @@
+# DEPRECATED since 2018.7+ release.
+# Please use system/repo/mcp/apt_mirantis
 parameters:
   _param:
     apt_mk_version: stable
diff --git a/linux/system/repo_local/mcp/apt_mirantis/maas.yml b/linux/system/repo_local/mcp/apt_mirantis/maas.yml
index 63f82c2..f8bc651 100644
--- a/linux/system/repo_local/mcp/apt_mirantis/maas.yml
+++ b/linux/system/repo_local/mcp/apt_mirantis/maas.yml
@@ -1,3 +1,5 @@
+# DEPRECATED since 2018.7+ release.
+# Please use system/repo/mcp/apt_mirantis
 parameters:
   _param:
     apt_mk_version: stable
diff --git a/linux/system/repo_local/mcp/apt_mirantis/saltstack.yml b/linux/system/repo_local/mcp/apt_mirantis/saltstack.yml
index f9c8c50..c2e6db5 100644
--- a/linux/system/repo_local/mcp/apt_mirantis/saltstack.yml
+++ b/linux/system/repo_local/mcp/apt_mirantis/saltstack.yml
@@ -1,3 +1,5 @@
+# DEPRECATED since 2018.7+ release.
+# Please use system/repo/mcp/apt_mirantis
 parameters:
   _param:
     apt_mk_version: stable
diff --git a/linux/system/single/init.yml b/linux/system/single/init.yml
index 4429a82..970184c 100644
--- a/linux/system/single/init.yml
+++ b/linux/system/single/init.yml
@@ -41,8 +41,6 @@
         en_US.UTF-8:
           enabled: true
           default: true
-        cs_CZ.UTF-8:
-          enabled: true
       limit:
         default:
           enabled: true
diff --git a/manila/control/cluster.yml b/manila/control/cluster.yml
index ff6ca10..7ea128b 100644
--- a/manila/control/cluster.yml
+++ b/manila/control/cluster.yml
@@ -10,6 +10,7 @@
     api:
       enabled: true
       version: ${_param:openstack_version}
+      role: ${_param:openstack_node_role}
     scheduler:
       enabled: true
       version: ${_param:openstack_version}
diff --git a/manila/control/single.yml b/manila/control/single.yml
index 3e14e96..262a158 100644
--- a/manila/control/single.yml
+++ b/manila/control/single.yml
@@ -9,6 +9,7 @@
     api:
       enabled: true
       version: ${_param:openstack_version}
+      role: ${_param:openstack_node_role}
     scheduler:
       enabled: true
       version: ${_param:openstack_version}
diff --git a/murano/server/cluster.yml b/murano/server/cluster.yml
index d698e7c..6c45f6d 100644
--- a/murano/server/cluster.yml
+++ b/murano/server/cluster.yml
@@ -8,6 +8,7 @@
     server:
       enabled: true
       version: ${_param:murano_version}
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:single_address}
         port: 8082
diff --git a/murano/server/single.yml b/murano/server/single.yml
index c3da9f8..938263d 100644
--- a/murano/server/single.yml
+++ b/murano/server/single.yml
@@ -6,6 +6,7 @@
     server:
       enabled: true
       version: ${_param:murano_version}
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:single_address}
         port: 8082
diff --git a/neutron/control/cluster.yml b/neutron/control/cluster.yml
index 166de3a..703f196 100644
--- a/neutron/control/cluster.yml
+++ b/neutron/control/cluster.yml
@@ -37,6 +37,7 @@
             params: check inter 10s fastinter 2s downinter 3s rise 3 fall 3
   neutron:
     server:
+      role: ${_param:openstack_node_role}
       plugin: contrail
     identity:
       protocol: ${_param:cluster_internal_protocol}
diff --git a/neutron/control/single.yml b/neutron/control/single.yml
index 067b4df..6196c0a 100644
--- a/neutron/control/single.yml
+++ b/neutron/control/single.yml
@@ -12,6 +12,7 @@
           version: latest
   neutron:
     server:
+      role: ${_param:openstack_node_role}
       database:
         host: ${_param:single_address}
       identity:
diff --git a/nova/compute/libvirt/ssl/vnc.yml b/nova/compute/libvirt/ssl/vnc.yml
new file mode 100644
index 0000000..f2c0ad4
--- /dev/null
+++ b/nova/compute/libvirt/ssl/vnc.yml
@@ -0,0 +1,12 @@
+classes:
+- system.salt.minion.cert.libvirtd.vnc_server
+parameters:
+  nova:
+    compute:
+      qemu:
+        vnc:
+          tls:
+            enabled: True
+            key_file: ${_param:qemu_vnc_server_ssl_key_file}
+            cert_file: ${_param:qemu_vnc_server_ssl_cert_file}
+            ca_file: ${_param:qemu_vnc_ssl_ca_file}
diff --git a/nova/control/cluster.yml b/nova/control/cluster.yml
index be5f775..90a2bae 100644
--- a/nova/control/cluster.yml
+++ b/nova/control/cluster.yml
@@ -30,6 +30,7 @@
       ram_allocation_ratio: ${_param:nova_ram_allocation_ratio}
       disk_allocation_ratio: ${_param:nova_disk_allocation_ratio}
       workers: 8
+      role: ${_param:openstack_node_role}
       bind:
         private_address: ${_param:cluster_local_address}
         public_address: ${_param:cluster_vip_address}
diff --git a/nova/control/novncproxy/init.yml b/nova/control/novncproxy/init.yml
new file mode 100644
index 0000000..3cd04b8
--- /dev/null
+++ b/nova/control/novncproxy/init.yml
@@ -0,0 +1,13 @@
+classes:
+- system.salt.minion.cert.vnc.novncproxy_client
+parameters:
+  nova:
+    controller:
+      novncproxy:
+        tls:
+          enabled: True
+          key_file: ${_param:novncproxy_client_ssl_key_file}
+          cert_file: ${_param:novncproxy_client_ssl_cert_file}
+          ca_file: ${_param:novncproxy_ssl_ca_file}
+          all_file: ${_param:nova_websocketproxy_ssl_all_file}
+
diff --git a/nova/control/single.yml b/nova/control/single.yml
index 07a3b01..4e3799b 100644
--- a/nova/control/single.yml
+++ b/nova/control/single.yml
@@ -11,6 +11,7 @@
           version: latest
   nova:
     controller:
+      role: ${_param:openstack_node_role}
       database:
         host: ${_param:single_address}
       identity:
diff --git a/octavia/api/cluster.yml b/octavia/api/cluster.yml
index 958f3d4..9e5d0c9 100644
--- a/octavia/api/cluster.yml
+++ b/octavia/api/cluster.yml
@@ -7,6 +7,7 @@
   octavia:
     api:
       enabled: true
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:cluster_local_address}
       database:
diff --git a/octavia/api/single.yml b/octavia/api/single.yml
index a9d30a5..ff76e76 100644
--- a/octavia/api/single.yml
+++ b/octavia/api/single.yml
@@ -6,6 +6,7 @@
   octavia:
     api:
       enabled: true
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:single_address}
       database:
diff --git a/opencontrail/compute/cluster4_0.yml b/opencontrail/compute/cluster4_0.yml
index 68f8007..8c16c70 100644
--- a/opencontrail/compute/cluster4_0.yml
+++ b/opencontrail/compute/cluster4_0.yml
@@ -1,3 +1,5 @@
+classes:
+  - service.opencontrail.compute.cluster
 applications:
 - opencontrail
 parameters:
diff --git a/openssh/client/root.yml b/openssh/client/root.yml
index 145f5da..66f8f88 100644
--- a/openssh/client/root.yml
+++ b/openssh/client/root.yml
@@ -36,7 +36,9 @@
       user:
         root:
           enabled: true
-          private_key:
-            type: rsa
-            key: ${_param:root_private_key}
           user: ${linux:system:user:root}
+          private_key: ${private_keys:root}
+  private_keys:
+    root:
+      type: rsa
+      key: ${_param:root_private_key}
diff --git a/openssh/server/team/members/hkraemer.yml b/openssh/server/team/members/hkraemer.yml
new file mode 100644
index 0000000..e6aca4e
--- /dev/null
+++ b/openssh/server/team/members/hkraemer.yml
@@ -0,0 +1,19 @@
+parameters:
+  linux:
+    system:
+      user:
+        hkraemer:
+          enabled: true
+          name: hkraemer
+          sudo: ${_param:linux_system_user_sudo}
+          full_name: Heiko Kraemer
+          home: /home/hkraemer
+          email: hkraemer@mirantis.com
+  openssh:
+    server:
+      user:
+        hkraemer:
+          enabled: true
+          public_keys:
+            - key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDDwMJV5+Za6N2M2R9T+r0KAOVOLUHHjJVTq7gABUj4RmHZpkA/ZQhZZJUs6vrOHwGjITRPPSkJJtg9MIzFRNw+qAhrAZ+42CerKH4s+GgGWm48y+JM6RN8Ndy1YdQGRSs+VSrTGt2+XGm5wokr7yViH2ZsiQNbW/3rqSaaXojsL7NQKmQstgczIWrzUckEdCiNMG2ax0oOD/GGIWXDKVzHEiZHsusbhdxRAPjuiuKqM/YtmYDRT9QPwSWLrG5t6J/0OC5KyfrHch7eq6+je0xFSHDYXgDztvX64b6sXUBPnXpnwlQHbn0X6URzgwFQ8nKlVlChnAxTsA0Bi4pecI84Hvn77M2hsCb1wtClGtqUG2Sp+g7JeP5vLrFxeKVGWBkApx/MO8qDRlRM91TTlAv8GY79HfrqTVTLGr+RhKQbuyNKvNRLsnuxClSR4M1uzbLLPkPlwsC+Q+b6Gy8+KOHPjC0wWnxjSQUJZrbjPwGm34uarN2Q4IaPVFJmE0VBlZyoUpf0PCIgzZdfft8QMEeLcir20tZo3YUbfx3PdwD8eWv8d+df/IKMFIfFWosZEyBHOBktjoctPLLNIOeqNP8kWjElNuMPrK34cwTRWFiP19cwc0qB+HY3L8ULtyyNWhgjRte6De8kx9XGmBeOuDGqeLnP7jxMXgN5mdw3eDRBEQ== hkraemer@mirantis.com
+          user: ${linux:system:user:hkraemer}
diff --git a/openssh/server/team/members/ivasilevskaya.yml b/openssh/server/team/members/ivasilevskaya.yml
new file mode 100644
index 0000000..bc50441
--- /dev/null
+++ b/openssh/server/team/members/ivasilevskaya.yml
@@ -0,0 +1,20 @@
+parameters:
+  linux:
+    system:
+      user:
+        ivasilevskaya:
+          enabled: true
+          name: ivasilevskaya
+          sudo: ${_param:linux_system_user_sudo}
+          full_name: Inessa Vasilevskaya
+          home: /home/ivasilevskaya
+          email: ivasilevskaya@mirantis.com
+  openssh:
+    server:
+      enabled: true
+      user:
+        ivasilevskaya:
+          enabled: true
+          public_keys:
+            - key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJk2ip+Rn73D4vt47pe/Hv42ylKJv6JIzeF0k3OflH+RyliVelvo05KMcozfsmmvOKhwgDokBj3KjQ10ewDwD7Fz5H3tosa8JFOs36cuHx9aHrsEmj1oIcIyThrIBwSZGFApqJqj27sLtReVLQJPlYR59RJGw61TogkA/QooOABi+KHzuwPFjAcA1SMfFT8LwiaNPkyUdRb5EQeKCOHniRAEPGNIwskA0sxz25qbB1EU2XBFjkxRE1b5GHfUYL+c2YhAwRWTJbD2JbbcHI6HpsmJutzkS6YIkEn1CK4JuA40OQTYFSEutCk2uPPR0G+77Fec2+vD/8H+ncPxPeDqNR ina@ina-ThinkPad-X240 
+          user: ${linux:system:user:ivasilevskaya}
diff --git a/openssh/server/team/members/mchernik.yml b/openssh/server/team/members/mchernik.yml
new file mode 100644
index 0000000..ca8a4b9
--- /dev/null
+++ b/openssh/server/team/members/mchernik.yml
@@ -0,0 +1,19 @@
+parameters:
+  linux:
+    system:
+      user:
+        mchernik:
+          enabled: true
+          name: mchernik
+          sudo: ${_param:linux_system_user_sudo}
+          full_name: Mykhailo Chernyk
+          home: /home/mchernik
+          email: mchernik@mirantis.com
+  openssh:
+    server:
+      user:
+        mchernik:
+          enabled: true
+          public_keys:
+            - key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCiYzcWNIP1K3DnSfztIZdMTl6zSr133eixsHDWWqI71Fj5UOny4kMH2P/qYk0WHhm7P9kwBNDgmJBY/eO5jb00D2w9BGHyvsOnkpAgzw5neL4ivRT7qLWkRdbcLo8AAFQN7VW+bgMb8gFfYWfttHyfkbJOQlU2xmi8fvhQ+2IM/12S0f0lP2uIYgVn8g9f+1OmtXKOWi/cKx0+6NYsuFjM2oVRlBhwlhPD2mI00rSL6zYjz/8GapPPkylQnds09NueNmrScjsPmJl6lPzU8maxHABZ/KctIZW/0ucMolv/3Ybm5FJIsj6YGUdz7AWzdE9o4tSfugFR3P7Ng/scxXpZ mchernik@mirantis.com
+          user: ${linux:system:user:mchernik}
diff --git a/openssh/server/team/networking.yml b/openssh/server/team/networking.yml
index d912490..7e5f915 100644
--- a/openssh/server/team/networking.yml
+++ b/openssh/server/team/networking.yml
@@ -51,6 +51,13 @@
           full_name: Oleg Bondarev
           home: /home/obondarev
           email: obondarev@mirantis.com
+        akuznetsova:
+          enabled: true
+          name: akuznetsova
+          sudo: true
+          full_name: Anastasiia Kuznetcova
+          home: /home/akuznetsova
+          email: akuznetsova@mirantis.com
   openssh:
     server:
       enabled: true
@@ -85,6 +92,11 @@
           public_keys:
           - ${public_keys:obondarev}
           user: ${linux:system:user:obondarev}
+        akuznetsova:
+          enabled: true
+          public_keys:
+          - ${public_keys:akuznetsova}
+          user: ${linux:system:user:akuznetsova}
   public_keys:
     aignatov:
       key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJFYznIFlCdxu5UXzThjYZlZfvXKCcDN0QxDEn7U7dNkK17SyzIJswQcxF7pTlvcuZ7XEskEqyXC8E6P5XyvBJO2xLGrFDJ4U3vf7MKsfwSFEj3NPUzV5bGTrKeKIHTL94L7lwMm1INE7lZzciiwvTxcKv//A+FgG8o1MDhefK56cBH4a9TSjEd+5ImcnCc5sf8B+csyWFPnksnv1zwu//T9aYXRITocdVzrfRHmEiZDpL3mNwpGT3O3XUTiMwdVpN2ImAqSF6XlQl0HlUkBT2idCIoXUR9lcGUx2Q+LSd62JgcVmQHCOmbUENj7NIDgWixgSJYLzsi//YNqJ9jccR aignatov@mirantis.com
@@ -98,3 +110,5 @@
       key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDJk2ip+Rn73D4vt47pe/Hv42ylKJv6JIzeF0k3OflH+RyliVelvo05KMcozfsmmvOKhwgDokBj3KjQ10ewDwD7Fz5H3tosa8JFOs36cuHx9aHrsEmj1oIcIyThrIBwSZGFApqJqj27sLtReVLQJPlYR59RJGw61TogkA/QooOABi+KHzuwPFjAcA1SMfFT8LwiaNPkyUdRb5EQeKCOHniRAEPGNIwskA0sxz25qbB1EU2XBFjkxRE1b5GHfUYL+c2YhAwRWTJbD2JbbcHI6HpsmJutzkS6YIkEn1CK4JuA40OQTYFSEutCk2uPPR0G+77Fec2+vD/8H+ncPxPeDqNR ina@ina-ThinkPad-X240
     obondarev:
       key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDca1gqXe14l9uho3t4mZT52lXmSuUxKVOCcSO9Dy+BAmtaVK39+t7la081S5c0H+oTPIXFb32/kO37+qpEgwyOv1zimWIqcR56xrr42gW/QzVLyY64qVnQ9QFiXlvXXBW4YgBuT//SE8upOshLYnznKHOi4IkoKrAE37K34Cz/DGQzFV6sKQSmP6fjJzli0Nzu+YPdBSZW9VH1m7IKxliGoZcjdIkJ+L92+h/mPuN95Bitfe+aoexBQq3u4WjYVVsCE/9TrwLoGlr3zd7VAyVdADJf6phfIMHGDxn8W8125r9UWp4X/36yAIudVC7kHLyr0AHTfYqCVH10nEJvUwRz obondarev@Olegs-MacBook-Pro.local
+    akuznetsova:
+      key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD033EOpc2jeEYkKPzmJL4j081hmt3Ml5hlrfJWYY7RRoKBugT1gF9zggI9GaFGn5F29g+92dYfLLH4yfkL91dkNtbsutl7XiHZYW5NIL5n8kHtb8Bahclid8ERMpLYlctqW/4RM5wfMyzh71TxbutN9ZjcbtAQ0bIaCoTyWRrIDiMeW/+Btf7bPpe7zyQMjkQu+F2iYxd6nERiMnVLq080XAqwuSGMy9NFBLvG+VoJV1w49f2Hf19TD1ILev/pttPYem/15/zAnwwR+nye91jBtBBaFI6V4aaYjgsrjEinNy48tfhMpbuELW5Nn3o8c+3Xfi2rRxtkNcfdpc/yvFz/
diff --git a/openssh/server/team/services.yml b/openssh/server/team/services.yml
index be901d8..c2f4e28 100644
--- a/openssh/server/team/services.yml
+++ b/openssh/server/team/services.yml
@@ -17,6 +17,8 @@
 - system.openssh.server.team.members.yisakov
 - system.openssh.server.team.members.vblokhin
 - system.openssh.server.team.members.dstremkouski
+- system.openssh.server.team.members.mchernik
+- system.openssh.server.team.members.hkraemer
 parameters:
   _param:
     linux_system_user_sudo: true
diff --git a/panko/server/cluster.yml b/panko/server/cluster.yml
index c258c9a..e277c30 100644
--- a/panko/server/cluster.yml
+++ b/panko/server/cluster.yml
@@ -11,6 +11,7 @@
     panko_memcached_node03_address: ${_param:cluster_node03_address}
   panko:
     server:
+      role: ${_param:openstack_node_role}
       identity:
         host: ${_param:openstack_control_address}
       database:
diff --git a/reclass/storage/system/openstack_baremetal_cluster.yml b/reclass/storage/system/openstack_baremetal_cluster.yml
index 71f6034..ff6592f 100644
--- a/reclass/storage/system/openstack_baremetal_cluster.yml
+++ b/reclass/storage/system/openstack_baremetal_cluster.yml
@@ -21,6 +21,7 @@
             single_address: ${_param:openstack_baremetal_node01_address}
             keepalived_vip_priority: 101
             baremetal_address: ${_param:openstack_baremetal_node01_baremetal_address}
+            openstack_node_role: primary
         openstack_baremetal_node02:
           name: ${_param:openstack_baremetal_node02_hostname}
           domain: ${_param:cluster_domain}
@@ -32,6 +33,7 @@
             single_address: ${_param:openstack_baremetal_node02_address}
             keepalived_vip_priority: 102
             baremetal_address: ${_param:openstack_baremetal_node02_baremetal_address}
+            openstack_node_role: secondary
         openstack_baremetal_node03:
           name: ${_param:openstack_baremetal_node03_hostname}
           domain: ${_param:cluster_domain}
@@ -43,5 +45,6 @@
             single_address: ${_param:openstack_baremetal_node03_address}
             keepalived_vip_priority: 103
             baremetal_address: ${_param:openstack_baremetal_node03_baremetal_address}
+            openstack_node_role: secondary
 
 
diff --git a/reclass/storage/system/openstack_baremetal_single.yml b/reclass/storage/system/openstack_baremetal_single.yml
index 3b279b0..36e89d3 100644
--- a/reclass/storage/system/openstack_baremetal_single.yml
+++ b/reclass/storage/system/openstack_baremetal_single.yml
@@ -14,3 +14,4 @@
             linux_system_codename: ${_param:linux_system_codename}
             single_address: ${_param:openstack_baremetal_node01_address}
             baremetal_address: ${_param:openstack_baremetal_node01_baremetal_address}
+            openstack_node_role: primary
diff --git a/reclass/storage/system/openstack_control_cluster.yml b/reclass/storage/system/openstack_control_cluster.yml
index 300a04c..e05b3e9 100644
--- a/reclass/storage/system/openstack_control_cluster.yml
+++ b/reclass/storage/system/openstack_control_cluster.yml
@@ -19,6 +19,7 @@
             keepalived_vip_priority: 103
             opencontrail_database_id: 1
             rabbitmq_cluster_role: master
+            openstack_node_role: primary
         openstack_control_node02:
           name: ${_param:openstack_control_node02_hostname}
           domain: ${_param:cluster_domain}
@@ -31,6 +32,7 @@
             keepalived_vip_priority: 102
             opencontrail_database_id: 2
             rabbitmq_cluster_role: slave
+            openstack_node_role: secondary
         openstack_control_node03:
           name: ${_param:openstack_control_node03_hostname}
           domain: ${_param:cluster_domain}
@@ -43,3 +45,4 @@
             keepalived_vip_priority: 101
             opencontrail_database_id: 3
             rabbitmq_cluster_role: slave
+            openstack_node_role: secondary
diff --git a/reclass/storage/system/openstack_control_large.yml b/reclass/storage/system/openstack_control_large.yml
new file mode 100644
index 0000000..4ad2e90
--- /dev/null
+++ b/reclass/storage/system/openstack_control_large.yml
@@ -0,0 +1,66 @@
+parameters:
+  _param:
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    openstack_control_node04_hostname: ctl04
+    openstack_control_node05_hostname: ctl05
+    openstack_control_system_codename: xenial
+  reclass:
+    storage:
+      node:
+        openstack_control_node01:
+          name: ${_param:openstack_control_node01_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.openstack.control
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:openstack_control_system_codename}
+            single_address: ${_param:openstack_control_node01_address}
+            keepalived_vip_priority: 105
+            openstack_node_role: primary
+        openstack_control_node02:
+          name: ${_param:openstack_control_node02_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.openstack.control
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:openstack_control_system_codename}
+            single_address: ${_param:openstack_control_node02_address}
+            keepalived_vip_priority: 104
+            openstack_node_role: secondary
+        openstack_control_node03:
+          name: ${_param:openstack_control_node03_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.openstack.control
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:openstack_control_system_codename}
+            single_address: ${_param:openstack_control_node03_address}
+            keepalived_vip_priority: 103
+            openstack_node_role: secondary
+        openstack_control_node04:
+          name: ${_param:openstack_control_node04_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.openstack.control
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:openstack_control_system_codename}
+            single_address: ${_param:openstack_control_node04_address}
+            keepalived_vip_priority: 102
+            openstack_node_role: secondary
+        openstack_control_node05:
+          name: ${_param:openstack_control_node05_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.openstack.control
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:openstack_control_system_codename}
+            single_address: ${_param:openstack_control_node05_address}
+            keepalived_vip_priority: 101
+            openstack_node_role: secondary
diff --git a/reclass/storage/system/openstack_control_single.yml b/reclass/storage/system/openstack_control_single.yml
index e7329da..fe5c870 100644
--- a/reclass/storage/system/openstack_control_single.yml
+++ b/reclass/storage/system/openstack_control_single.yml
@@ -14,3 +14,4 @@
             salt_master_host: ${_param:reclass_config_master}
             linux_system_codename: ${_param:openstack_control_system_codename}
             single_address: ${_param:openstack_control_node01_address}
+            openstack_node_role: primary
diff --git a/reclass/storage/system/openstack_control_upgrade_single.yml b/reclass/storage/system/openstack_control_upgrade_single.yml
index e387062..b00cc81 100644
--- a/reclass/storage/system/openstack_control_upgrade_single.yml
+++ b/reclass/storage/system/openstack_control_upgrade_single.yml
@@ -14,3 +14,4 @@
             salt_master_host: ${_param:reclass_config_master}
             linux_system_codename: ${_param:openstack_upgrade_system_codename}
             single_address: ${_param:openstack_upgrade_node01_address}
+            openstack_node_role: primary
diff --git a/reclass/storage/system/openstack_telemetry_cluster.yml b/reclass/storage/system/openstack_telemetry_cluster.yml
index 9dc6457..c33a8db 100644
--- a/reclass/storage/system/openstack_telemetry_cluster.yml
+++ b/reclass/storage/system/openstack_telemetry_cluster.yml
@@ -17,6 +17,7 @@
             linux_system_codename: ${_param:openstack_telemetry_system_codename}
             single_address: ${_param:openstack_telemetry_node01_address}
             keepalived_vip_priority: 103
+            openstack_node_role: primary
         openstack_telemetry_node02:
           name: ${_param:openstack_telemetry_node02_hostname}
           domain: ${_param:cluster_domain}
@@ -27,6 +28,7 @@
             linux_system_codename: ${_param:openstack_telemetry_system_codename}
             single_address: ${_param:openstack_telemetry_node02_address}
             keepalived_vip_priority: 102
+            openstack_node_role: secondary
         openstack_telemetry_node03:
           name: ${_param:openstack_telemetry_node03_hostname}
           domain: ${_param:cluster_domain}
@@ -37,3 +39,4 @@
             linux_system_codename: ${_param:openstack_telemetry_system_codename}
             single_address: ${_param:openstack_telemetry_node03_address}
             keepalived_vip_priority: 101
+            openstack_node_role: secondary
diff --git a/reclass/storage/system/physical_control_large.yml b/reclass/storage/system/physical_control_large.yml
new file mode 100644
index 0000000..1070f47
--- /dev/null
+++ b/reclass/storage/system/physical_control_large.yml
@@ -0,0 +1,251 @@
+parameters:
+  _param:
+    infra_kvm_node01_hostname: kvm01
+    infra_kvm_node02_hostname: kvm02
+    infra_kvm_node03_hostname: kvm03
+    infra_kvm_node04_hostname: kvm04
+    infra_kvm_node05_hostname: kvm05
+    infra_kvm_node06_hostname: kvm06
+    infra_kvm_node07_hostname: kvm07
+    infra_kvm_node08_hostname: kvm08
+    infra_kvm_node09_hostname: kvm09
+    infra_kvm_node10_hostname: kvm10
+    infra_kvm_node11_hostname: kvm11
+    infra_kvm_node12_hostname: kvm12
+    infra_kvm_node13_hostname: kvm13
+    infra_kvm_node14_hostname: kvm14
+    infra_kvm_node15_hostname: kvm15
+
+    infra_kvm_node01_deploy_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_deploy_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_deploy_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_deploy_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_deploy_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_deploy_address: ${_param:infra_kvm_node06_address}
+    infra_kvm_node07_deploy_address: ${_param:infra_kvm_node07_address}
+    infra_kvm_node08_deploy_address: ${_param:infra_kvm_node08_address}
+    infra_kvm_node09_deploy_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node10_deploy_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node11_deploy_address: ${_param:infra_kvm_node10_address}
+    infra_kvm_node12_deploy_address: ${_param:infra_kvm_node12_address}
+    infra_kvm_node13_deploy_address: ${_param:infra_kvm_node13_address}
+    infra_kvm_node14_deploy_address: ${_param:infra_kvm_node14_address}
+    infra_kvm_node15_deploy_address: ${_param:infra_kvm_node15_address}
+
+    infra_kvm_node01_storage_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_storage_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_storage_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_storage_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_storage_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_storage_address: ${_param:infra_kvm_node06_address}
+    infra_kvm_node07_storage_address: ${_param:infra_kvm_node07_address}
+    infra_kvm_node08_storage_address: ${_param:infra_kvm_node08_address}
+    infra_kvm_node09_storage_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node10_storage_address: ${_param:infra_kvm_node10_address}
+    infra_kvm_node11_storage_address: ${_param:infra_kvm_node11_address}
+    infra_kvm_node12_storage_address: ${_param:infra_kvm_node12_address}
+    infra_kvm_node13_storage_address: ${_param:infra_kvm_node13_address}
+    infra_kvm_node14_storage_address: ${_param:infra_kvm_node14_address}
+    infra_kvm_node15_storage_address: ${_param:infra_kvm_node15_address}
+
+    infra_kvm_node01_public_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_public_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_public_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_public_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_public_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_public_address: ${_param:infra_kvm_node06_address}
+    infra_kvm_node07_public_address: ${_param:infra_kvm_node07_address}
+    infra_kvm_node08_public_address: ${_param:infra_kvm_node08_address}
+    infra_kvm_node09_public_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node10_public_address: ${_param:infra_kvm_node10_address}
+    infra_kvm_node11_public_address: ${_param:infra_kvm_node11_address}
+    infra_kvm_node12_public_address: ${_param:infra_kvm_node12_address}
+    infra_kvm_node13_public_address: ${_param:infra_kvm_node13_address}
+    infra_kvm_node14_public_address: ${_param:infra_kvm_node14_address}
+    infra_kvm_node15_public_address: ${_param:infra_kvm_node15_address}
+
+    infra_kvm_system_codename: xenial
+
+  reclass:
+    storage:
+      node:
+        infra_kvm_node01:
+          name: ${_param:infra_kvm_node01_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node01_address}
+            deploy_address: ${_param:infra_kvm_node01_deploy_address}
+            public_address: ${_param:infra_kvm_node01_public_address}
+            storage_address: ${_param:infra_kvm_node01_storage_address}
+        infra_kvm_node02:
+          name: ${_param:infra_kvm_node02_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node02_address}
+            deploy_address: ${_param:infra_kvm_node02_deploy_address}
+            public_address: ${_param:infra_kvm_node02_public_address}
+            storage_address: ${_param:infra_kvm_node02_storage_address}
+        infra_kvm_node03:
+          name: ${_param:infra_kvm_node03_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node03_address}
+            deploy_address: ${_param:infra_kvm_node03_deploy_address}
+            public_address: ${_param:infra_kvm_node03_public_address}
+            storage_address: ${_param:infra_kvm_node03_storage_address}
+        infra_kvm_node04:
+          name: ${_param:infra_kvm_node04_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node04_address}
+            deploy_address: ${_param:infra_kvm_node04_deploy_address}
+            public_address: ${_param:infra_kvm_node04_public_address}
+            storage_address: ${_param:infra_kvm_node04_storage_address}
+        infra_kvm_node05:
+          name: ${_param:infra_kvm_node05_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node05_address}
+            deploy_address: ${_param:infra_kvm_node05_deploy_address}
+            public_address: ${_param:infra_kvm_node05_public_address}
+            storage_address: ${_param:infra_kvm_node05_storage_address}
+        infra_kvm_node06:
+          name: ${_param:infra_kvm_node06_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node06_address}
+            deploy_address: ${_param:infra_kvm_node06_deploy_address}
+            public_address: ${_param:infra_kvm_node06_public_address}
+            storage_address: ${_param:infra_kvm_node06_storage_address}
+        infra_kvm_node07:
+          name: ${_param:infra_kvm_node07_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node07_address}
+            deploy_address: ${_param:infra_kvm_node07_deploy_address}
+            public_address: ${_param:infra_kvm_node07_public_address}
+            storage_address: ${_param:infra_kvm_node07_storage_address}
+        infra_kvm_node08:
+          name: ${_param:infra_kvm_node08_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node08_address}
+            deploy_address: ${_param:infra_kvm_node08_deploy_address}
+            public_address: ${_param:infra_kvm_node08_public_address}
+            storage_address: ${_param:infra_kvm_node08_storage_address}
+        infra_kvm_node09:
+          name: ${_param:infra_kvm_node09_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node09_address}
+            deploy_address: ${_param:infra_kvm_node09_deploy_address}
+            public_address: ${_param:infra_kvm_node09_public_address}
+            storage_address: ${_param:infra_kvm_node09_storage_address}
+        infra_kvm_node10:
+          name: ${_param:infra_kvm_node10_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node10_address}
+            deploy_address: ${_param:infra_kvm_node10_deploy_address}
+            public_address: ${_param:infra_kvm_node10_public_address}
+            storage_address: ${_param:infra_kvm_node10_storage_address}
+        infra_kvm_node11:
+          name: ${_param:infra_kvm_node11_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node11_address}
+            deploy_address: ${_param:infra_kvm_node11_deploy_address}
+            public_address: ${_param:infra_kvm_node11_public_address}
+            storage_address: ${_param:infra_kvm_node11_storage_address}
+        infra_kvm_node12:
+          name: ${_param:infra_kvm_node12_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node12_address}
+            deploy_address: ${_param:infra_kvm_node12_deploy_address}
+            public_address: ${_param:infra_kvm_node12_public_address}
+            storage_address: ${_param:infra_kvm_node12_storage_address}
+        infra_kvm_node13:
+          name: ${_param:infra_kvm_node13_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node13_address}
+            deploy_address: ${_param:infra_kvm_node13_deploy_address}
+            public_address: ${_param:infra_kvm_node13_public_address}
+            storage_address: ${_param:infra_kvm_node13_storage_address}
+        infra_kvm_node14:
+          name: ${_param:infra_kvm_node14_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node14_address}
+            deploy_address: ${_param:infra_kvm_node14_deploy_address}
+            public_address: ${_param:infra_kvm_node14_public_address}
+            storage_address: ${_param:infra_kvm_node14_storage_address}
+        infra_kvm_node15:
+          name: ${_param:infra_kvm_node15_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node15_address}
+            deploy_address: ${_param:infra_kvm_node15_deploy_address}
+            public_address: ${_param:infra_kvm_node15_public_address}
+            storage_address: ${_param:infra_kvm_node15_storage_address}
diff --git a/reclass/storage/system/physical_control_medium.yml b/reclass/storage/system/physical_control_medium.yml
new file mode 100644
index 0000000..5ad7d24
--- /dev/null
+++ b/reclass/storage/system/physical_control_medium.yml
@@ -0,0 +1,203 @@
+parameters:
+  _param:
+    infra_kvm_node01_hostname: kvm01
+    infra_kvm_node02_hostname: kvm02
+    infra_kvm_node03_hostname: kvm03
+    infra_kvm_node04_hostname: kvm04
+    infra_kvm_node05_hostname: kvm05
+    infra_kvm_node06_hostname: kvm06
+    infra_kvm_node07_hostname: kvm07
+    infra_kvm_node08_hostname: kvm08
+    infra_kvm_node09_hostname: kvm09
+    infra_kvm_node10_hostname: kvm10
+    infra_kvm_node11_hostname: kvm11
+    infra_kvm_node12_hostname: kvm12
+
+    infra_kvm_node01_deploy_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_deploy_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_deploy_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_deploy_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_deploy_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_deploy_address: ${_param:infra_kvm_node06_address}
+    infra_kvm_node07_deploy_address: ${_param:infra_kvm_node07_address}
+    infra_kvm_node08_deploy_address: ${_param:infra_kvm_node08_address}
+    infra_kvm_node09_deploy_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node10_deploy_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node11_deploy_address: ${_param:infra_kvm_node10_address}
+    infra_kvm_node12_deploy_address: ${_param:infra_kvm_node12_address}
+
+    infra_kvm_node01_storage_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_storage_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_storage_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_storage_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_storage_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_storage_address: ${_param:infra_kvm_node06_address}
+    infra_kvm_node07_storage_address: ${_param:infra_kvm_node07_address}
+    infra_kvm_node08_storage_address: ${_param:infra_kvm_node08_address}
+    infra_kvm_node09_storage_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node10_storage_address: ${_param:infra_kvm_node10_address}
+    infra_kvm_node11_storage_address: ${_param:infra_kvm_node11_address}
+    infra_kvm_node12_storage_address: ${_param:infra_kvm_node12_address}
+
+    infra_kvm_node01_public_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_public_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_public_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_public_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_public_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_public_address: ${_param:infra_kvm_node06_address}
+    infra_kvm_node07_public_address: ${_param:infra_kvm_node07_address}
+    infra_kvm_node08_public_address: ${_param:infra_kvm_node08_address}
+    infra_kvm_node09_public_address: ${_param:infra_kvm_node09_address}
+    infra_kvm_node10_public_address: ${_param:infra_kvm_node10_address}
+    infra_kvm_node11_public_address: ${_param:infra_kvm_node11_address}
+    infra_kvm_node12_public_address: ${_param:infra_kvm_node12_address}
+
+    infra_kvm_system_codename: xenial
+
+  reclass:
+    storage:
+      node:
+        infra_kvm_node01:
+          name: ${_param:infra_kvm_node01_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node01_address}
+            deploy_address: ${_param:infra_kvm_node01_deploy_address}
+            public_address: ${_param:infra_kvm_node01_public_address}
+            storage_address: ${_param:infra_kvm_node01_storage_address}
+        infra_kvm_node02:
+          name: ${_param:infra_kvm_node02_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node02_address}
+            deploy_address: ${_param:infra_kvm_node02_deploy_address}
+            public_address: ${_param:infra_kvm_node02_public_address}
+            storage_address: ${_param:infra_kvm_node02_storage_address}
+        infra_kvm_node03:
+          name: ${_param:infra_kvm_node03_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node03_address}
+            deploy_address: ${_param:infra_kvm_node03_deploy_address}
+            public_address: ${_param:infra_kvm_node03_public_address}
+            storage_address: ${_param:infra_kvm_node03_storage_address}
+        infra_kvm_node04:
+          name: ${_param:infra_kvm_node04_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node04_address}
+            deploy_address: ${_param:infra_kvm_node04_deploy_address}
+            public_address: ${_param:infra_kvm_node04_public_address}
+            storage_address: ${_param:infra_kvm_node04_storage_address}
+        infra_kvm_node05:
+          name: ${_param:infra_kvm_node05_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node05_address}
+            deploy_address: ${_param:infra_kvm_node05_deploy_address}
+            public_address: ${_param:infra_kvm_node05_public_address}
+            storage_address: ${_param:infra_kvm_node05_storage_address}
+        infra_kvm_node06:
+          name: ${_param:infra_kvm_node06_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node06_address}
+            deploy_address: ${_param:infra_kvm_node06_deploy_address}
+            public_address: ${_param:infra_kvm_node06_public_address}
+            storage_address: ${_param:infra_kvm_node06_storage_address}
+        infra_kvm_node07:
+          name: ${_param:infra_kvm_node07_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node07_address}
+            deploy_address: ${_param:infra_kvm_node07_deploy_address}
+            public_address: ${_param:infra_kvm_node07_public_address}
+            storage_address: ${_param:infra_kvm_node07_storage_address}
+        infra_kvm_node08:
+          name: ${_param:infra_kvm_node08_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node08_address}
+            deploy_address: ${_param:infra_kvm_node08_deploy_address}
+            public_address: ${_param:infra_kvm_node08_public_address}
+            storage_address: ${_param:infra_kvm_node08_storage_address}
+        infra_kvm_node09:
+          name: ${_param:infra_kvm_node09_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node09_address}
+            deploy_address: ${_param:infra_kvm_node09_deploy_address}
+            public_address: ${_param:infra_kvm_node09_public_address}
+            storage_address: ${_param:infra_kvm_node09_storage_address}
+        infra_kvm_node10:
+          name: ${_param:infra_kvm_node10_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node10_address}
+            deploy_address: ${_param:infra_kvm_node10_deploy_address}
+            public_address: ${_param:infra_kvm_node10_public_address}
+            storage_address: ${_param:infra_kvm_node10_storage_address}
+        infra_kvm_node11:
+          name: ${_param:infra_kvm_node11_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node11_address}
+            deploy_address: ${_param:infra_kvm_node11_deploy_address}
+            public_address: ${_param:infra_kvm_node11_public_address}
+            storage_address: ${_param:infra_kvm_node11_storage_address}
+        infra_kvm_node12:
+          name: ${_param:infra_kvm_node12_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node12_address}
+            deploy_address: ${_param:infra_kvm_node12_deploy_address}
+            public_address: ${_param:infra_kvm_node12_public_address}
+            storage_address: ${_param:infra_kvm_node12_storage_address}
diff --git a/reclass/storage/system/physical_control_small.yml b/reclass/storage/system/physical_control_small.yml
new file mode 100644
index 0000000..4ce3759
--- /dev/null
+++ b/reclass/storage/system/physical_control_small.yml
@@ -0,0 +1,107 @@
+parameters:
+  _param:
+    infra_kvm_node01_hostname: kvm01
+    infra_kvm_node02_hostname: kvm02
+    infra_kvm_node03_hostname: kvm03
+    infra_kvm_node04_hostname: kvm04
+    infra_kvm_node05_hostname: kvm05
+    infra_kvm_node06_hostname: kvm06
+
+    infra_kvm_node01_deploy_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_deploy_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_deploy_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_deploy_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_deploy_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_deploy_address: ${_param:infra_kvm_node06_address}
+
+    infra_kvm_node01_storage_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_storage_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_storage_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_storage_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_storage_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_storage_address: ${_param:infra_kvm_node06_address}
+
+    infra_kvm_node01_public_address: ${_param:infra_kvm_node01_address}
+    infra_kvm_node02_public_address: ${_param:infra_kvm_node02_address}
+    infra_kvm_node03_public_address: ${_param:infra_kvm_node03_address}
+    infra_kvm_node04_public_address: ${_param:infra_kvm_node04_address}
+    infra_kvm_node05_public_address: ${_param:infra_kvm_node05_address}
+    infra_kvm_node06_public_address: ${_param:infra_kvm_node06_address}
+
+    infra_kvm_system_codename: xenial
+
+  reclass:
+    storage:
+      node:
+        infra_kvm_node01:
+          name: ${_param:infra_kvm_node01_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node01_address}
+            deploy_address: ${_param:infra_kvm_node01_deploy_address}
+            public_address: ${_param:infra_kvm_node01_public_address}
+            storage_address: ${_param:infra_kvm_node01_storage_address}
+        infra_kvm_node02:
+          name: ${_param:infra_kvm_node02_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node02_address}
+            deploy_address: ${_param:infra_kvm_node02_deploy_address}
+            public_address: ${_param:infra_kvm_node02_public_address}
+            storage_address: ${_param:infra_kvm_node02_storage_address}
+        infra_kvm_node03:
+          name: ${_param:infra_kvm_node03_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node03_address}
+            deploy_address: ${_param:infra_kvm_node03_deploy_address}
+            public_address: ${_param:infra_kvm_node03_public_address}
+            storage_address: ${_param:infra_kvm_node03_storage_address}
+        infra_kvm_node04:
+          name: ${_param:infra_kvm_node04_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node04_address}
+            deploy_address: ${_param:infra_kvm_node04_deploy_address}
+            public_address: ${_param:infra_kvm_node04_public_address}
+            storage_address: ${_param:infra_kvm_node04_storage_address}
+        infra_kvm_node05:
+          name: ${_param:infra_kvm_node05_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node05_address}
+            deploy_address: ${_param:infra_kvm_node05_deploy_address}
+            public_address: ${_param:infra_kvm_node05_public_address}
+            storage_address: ${_param:infra_kvm_node05_storage_address}
+        infra_kvm_node06:
+          name: ${_param:infra_kvm_node06_hostname}
+          domain: ${_param:cluster_domain}
+          classes:
+          - cluster.${_param:cluster_name}.infra.kvm
+          params:
+            salt_master_host: ${_param:reclass_config_master}
+            linux_system_codename: ${_param:infra_kvm_system_codename}
+            single_address: ${_param:infra_kvm_node06_address}
+            deploy_address: ${_param:infra_kvm_node06_deploy_address}
+            public_address: ${_param:infra_kvm_node06_public_address}
+            storage_address: ${_param:infra_kvm_node06_storage_address}
diff --git a/sahara/server/cluster.yml b/sahara/server/cluster.yml
index cdb7b04..b01ab3d 100644
--- a/sahara/server/cluster.yml
+++ b/sahara/server/cluster.yml
@@ -9,6 +9,7 @@
       enabled: true
       version: ${_param:sahara_version}
       notification: false
+      role: ${_param:openstack_node_role}
       bind:
         address: ${_param:single_address}
         port: 8386
diff --git a/sahara/server/single.yml b/sahara/server/single.yml
index 01e7b38..fcb26c9 100644
--- a/sahara/server/single.yml
+++ b/sahara/server/single.yml
@@ -5,6 +5,7 @@
     server:
       enabled: true
       version: ${_param:sahara_version}
+      role: ${_param:openstack_node_role}
       bind:
         host: ${_param:single_address}
         port: 8386
diff --git a/salt/control/placement/cicd/compact.yml b/salt/control/placement/cicd/compact.yml
new file mode 100644
index 0000000..9bdf4a4
--- /dev/null
+++ b/salt/control/placement/cicd/compact.yml
@@ -0,0 +1,28 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    cicd_control_node01_hostname: cid01
+    cicd_control_node02_hostname: cid02
+    cicd_control_node03_hostname: cid03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            cid01:
+              name: ${_param:cicd_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid02:
+              name: ${_param:cicd_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid03:
+              name: ${_param:cicd_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: cicd.control
\ No newline at end of file
diff --git a/salt/control/placement/cicd/large.yml b/salt/control/placement/cicd/large.yml
new file mode 100644
index 0000000..9bdf4a4
--- /dev/null
+++ b/salt/control/placement/cicd/large.yml
@@ -0,0 +1,28 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    cicd_control_node01_hostname: cid01
+    cicd_control_node02_hostname: cid02
+    cicd_control_node03_hostname: cid03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            cid01:
+              name: ${_param:cicd_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid02:
+              name: ${_param:cicd_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid03:
+              name: ${_param:cicd_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: cicd.control
\ No newline at end of file
diff --git a/salt/control/placement/cicd/medium.yml b/salt/control/placement/cicd/medium.yml
new file mode 100644
index 0000000..9bdf4a4
--- /dev/null
+++ b/salt/control/placement/cicd/medium.yml
@@ -0,0 +1,28 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    cicd_control_node01_hostname: cid01
+    cicd_control_node02_hostname: cid02
+    cicd_control_node03_hostname: cid03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            cid01:
+              name: ${_param:cicd_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid02:
+              name: ${_param:cicd_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid03:
+              name: ${_param:cicd_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: cicd.control
\ No newline at end of file
diff --git a/salt/control/placement/cicd/minimal.yml b/salt/control/placement/cicd/minimal.yml
new file mode 100644
index 0000000..9bdf4a4
--- /dev/null
+++ b/salt/control/placement/cicd/minimal.yml
@@ -0,0 +1,28 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    cicd_control_node01_hostname: cid01
+    cicd_control_node02_hostname: cid02
+    cicd_control_node03_hostname: cid03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            cid01:
+              name: ${_param:cicd_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid02:
+              name: ${_param:cicd_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid03:
+              name: ${_param:cicd_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: cicd.control
\ No newline at end of file
diff --git a/salt/control/placement/cicd/small.yml b/salt/control/placement/cicd/small.yml
new file mode 100644
index 0000000..9bdf4a4
--- /dev/null
+++ b/salt/control/placement/cicd/small.yml
@@ -0,0 +1,28 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    cicd_control_node01_hostname: cid01
+    cicd_control_node02_hostname: cid02
+    cicd_control_node03_hostname: cid03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            cid01:
+              name: ${_param:cicd_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid02:
+              name: ${_param:cicd_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: cicd.control
+            cid03:
+              name: ${_param:cicd_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: cicd.control
\ No newline at end of file
diff --git a/salt/control/placement/opencontrail/compact.yml b/salt/control/placement/opencontrail/compact.yml
new file mode 100644
index 0000000..a619956
--- /dev/null
+++ b/salt/control/placement/opencontrail/compact.yml
@@ -0,0 +1,46 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    opencontrail_control_node01_hostname: ntw01
+    opencontrail_control_node02_hostname: ntw02
+    opencontrail_control_node03_hostname: ntw03
+    opencontrail_analytics_node01_hostname: nal01
+    opencontrail_analytics_node02_hostname: nal02
+    opencontrail_analytics_node03_hostname: nal03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ntw01:
+              name: ${_param:opencontrail_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw02:
+              name: ${_param:opencontrail_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw03:
+              name: ${_param:opencontrail_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            nal01:
+              name: ${_param:opencontrail_analytics_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal02:
+              name: ${_param:opencontrail_analytics_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal03:
+              name: ${_param:opencontrail_analytics_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
\ No newline at end of file
diff --git a/salt/control/placement/opencontrail/large.yml b/salt/control/placement/opencontrail/large.yml
new file mode 100644
index 0000000..1aabd0d
--- /dev/null
+++ b/salt/control/placement/opencontrail/large.yml
@@ -0,0 +1,46 @@
+parameters:
+  _param:
+    infra_kvm10_hostname: kvm10
+    infra_kvm11_hostname: kvm11
+    infra_kvm12_hostname: kvm12
+    opencontrail_control_node01_hostname: ntw01
+    opencontrail_control_node02_hostname: ntw02
+    opencontrail_control_node03_hostname: ntw03
+    opencontrail_analytics_node01_hostname: nal01
+    opencontrail_analytics_node02_hostname: nal02
+    opencontrail_analytics_node03_hostname: nal03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ntw01:
+              name: ${_param:opencontrail_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node10_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw02:
+              name: ${_param:opencontrail_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node11_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw03:
+              name: ${_param:opencontrail_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node12_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            nal01:
+              name: ${_param:opencontrail_analytics_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node10_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal02:
+              name: ${_param:opencontrail_analytics_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node11_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal03:
+              name: ${_param:opencontrail_analytics_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node12_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
\ No newline at end of file
diff --git a/salt/control/placement/opencontrail/medium.yml b/salt/control/placement/opencontrail/medium.yml
new file mode 100644
index 0000000..dfc32f3
--- /dev/null
+++ b/salt/control/placement/opencontrail/medium.yml
@@ -0,0 +1,46 @@
+parameters:
+  _param:
+    infra_kvm07_hostname: kvm07
+    infra_kvm08_hostname: kvm08
+    infra_kvm09_hostname: kvm09
+    opencontrail_control_node01_hostname: ntw01
+    opencontrail_control_node02_hostname: ntw02
+    opencontrail_control_node03_hostname: ntw03
+    opencontrail_analytics_node01_hostname: nal01
+    opencontrail_analytics_node02_hostname: nal02
+    opencontrail_analytics_node03_hostname: nal03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ntw01:
+              name: ${_param:opencontrail_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node07_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw02:
+              name: ${_param:opencontrail_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node08_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw03:
+              name: ${_param:opencontrail_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node09_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            nal01:
+              name: ${_param:opencontrail_analytics_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node07_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal02:
+              name: ${_param:opencontrail_analytics_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node08_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal03:
+              name: ${_param:opencontrail_analytics_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node09_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
\ No newline at end of file
diff --git a/salt/control/placement/opencontrail/minimal.yml b/salt/control/placement/opencontrail/minimal.yml
new file mode 100644
index 0000000..a619956
--- /dev/null
+++ b/salt/control/placement/opencontrail/minimal.yml
@@ -0,0 +1,46 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    opencontrail_control_node01_hostname: ntw01
+    opencontrail_control_node02_hostname: ntw02
+    opencontrail_control_node03_hostname: ntw03
+    opencontrail_analytics_node01_hostname: nal01
+    opencontrail_analytics_node02_hostname: nal02
+    opencontrail_analytics_node03_hostname: nal03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ntw01:
+              name: ${_param:opencontrail_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw02:
+              name: ${_param:opencontrail_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw03:
+              name: ${_param:opencontrail_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            nal01:
+              name: ${_param:opencontrail_analytics_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal02:
+              name: ${_param:opencontrail_analytics_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal03:
+              name: ${_param:opencontrail_analytics_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
\ No newline at end of file
diff --git a/salt/control/placement/opencontrail/small.yml b/salt/control/placement/opencontrail/small.yml
new file mode 100644
index 0000000..a619956
--- /dev/null
+++ b/salt/control/placement/opencontrail/small.yml
@@ -0,0 +1,46 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    opencontrail_control_node01_hostname: ntw01
+    opencontrail_control_node02_hostname: ntw02
+    opencontrail_control_node03_hostname: ntw03
+    opencontrail_analytics_node01_hostname: nal01
+    opencontrail_analytics_node02_hostname: nal02
+    opencontrail_analytics_node03_hostname: nal03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ntw01:
+              name: ${_param:opencontrail_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw02:
+              name: ${_param:opencontrail_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            ntw03:
+              name: ${_param:opencontrail_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: opencontrail.control
+            nal01:
+              name: ${_param:opencontrail_analytics_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal02:
+              name: ${_param:opencontrail_analytics_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
+            nal03:
+              name: ${_param:opencontrail_analytics_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: opencontrail.analytics
\ No newline at end of file
diff --git a/salt/control/placement/openstack/compact.yml b/salt/control/placement/openstack/compact.yml
new file mode 100644
index 0000000..8c62e28
--- /dev/null
+++ b/salt/control/placement/openstack/compact.yml
@@ -0,0 +1,76 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    openstack_database_node01_hostname: dbs01
+    openstack_database_node02_hostname: dbs02
+    openstack_database_node03_hostname: dbs03
+    openstack_message_queue_node01_hostname: msg01
+    openstack_message_queue_node02_hostname: msg02
+    openstack_message_queue_node03_hostname: msg03
+    openstack_proxy_node01_hostname: prx01
+    openstack_proxy_node02_hostname: prx02
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ctl01:
+              name: ${_param:openstack_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl02:
+              name: ${_param:openstack_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl03:
+              name: ${_param:openstack_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            dbs01:
+              name: ${_param:openstack_database_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs02:
+              name: ${_param:openstack_database_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs03:
+              name: ${_param:openstack_database_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            msg01:
+              name: ${_param:openstack_message_queue_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg02:
+              name: ${_param:openstack_message_queue_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg03:
+              name: ${_param:openstack_message_queue_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            prx01:
+              name: ${_param:openstack_proxy_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
+            prx02:
+              name: ${_param:openstack_proxy_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
diff --git a/salt/control/placement/openstack/large.yml b/salt/control/placement/openstack/large.yml
new file mode 100644
index 0000000..cb056dd
--- /dev/null
+++ b/salt/control/placement/openstack/large.yml
@@ -0,0 +1,93 @@
+parameters:
+  _param:
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    infra_kvm04_hostname: kvm04
+    infra_kvm05_hostname: kvm05
+    infra_kvm06_hostname: kvm06
+    infra_kvm07_hostname: kvm07
+    infra_kvm08_hostname: kvm08
+    infra_kvm09_hostname: kvm09
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    openstack_control_node04_hostname: ctl04
+    openstack_control_node05_hostname: ctl05
+    openstack_database_node01_hostname: dbs01
+    openstack_database_node02_hostname: dbs02
+    openstack_database_node03_hostname: dbs03
+    openstack_message_queue_node01_hostname: msg01
+    openstack_message_queue_node02_hostname: msg02
+    openstack_message_queue_node03_hostname: msg03
+    openstack_proxy_node01_hostname: prx01
+    openstack_proxy_node02_hostname: prx02
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ctl01:
+              name: ${_param:openstack_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl02:
+              name: ${_param:openstack_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl03:
+              name: ${_param:openstack_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node04_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl04:
+              name: ${_param:openstack_control_node04_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node05_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl05:
+              name: ${_param:openstack_control_node05_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node06_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            dbs01:
+              name: ${_param:openstack_database_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node04_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs02:
+              name: ${_param:openstack_database_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node05_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs03:
+              name: ${_param:openstack_database_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node06_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            msg01:
+              name: ${_param:openstack_message_queue_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node07_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg02:
+              name: ${_param:openstack_message_queue_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node08_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg03:
+              name: ${_param:openstack_message_queue_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node09_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            prx01:
+              name: ${_param:openstack_proxy_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node07_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
+            prx02:
+              name: ${_param:openstack_proxy_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node08_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
diff --git a/salt/control/placement/openstack/medium.yml b/salt/control/placement/openstack/medium.yml
new file mode 100644
index 0000000..7d0e166
--- /dev/null
+++ b/salt/control/placement/openstack/medium.yml
@@ -0,0 +1,79 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    infra_kvm04_hostname: kvm04
+    infra_kvm05_hostname: kvm05
+    infra_kvm06_hostname: kvm06
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    openstack_database_node01_hostname: dbs01
+    openstack_database_node02_hostname: dbs02
+    openstack_database_node03_hostname: dbs03
+    openstack_message_queue_node01_hostname: msg01
+    openstack_message_queue_node02_hostname: msg02
+    openstack_message_queue_node03_hostname: msg03
+    openstack_proxy_node01_hostname: prx01
+    openstack_proxy_node02_hostname: prx02
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ctl01:
+              name: ${_param:openstack_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl02:
+              name: ${_param:openstack_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl03:
+              name: ${_param:openstack_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            dbs01:
+              name: ${_param:openstack_database_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs02:
+              name: ${_param:openstack_database_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs03:
+              name: ${_param:openstack_database_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            msg01:
+              name: ${_param:openstack_message_queue_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node04_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg02:
+              name: ${_param:openstack_message_queue_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node05_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg03:
+              name: ${_param:openstack_message_queue_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node06_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            prx01:
+              name: ${_param:openstack_proxy_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node04_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
+            prx02:
+              name: ${_param:openstack_proxy_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node05_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
diff --git a/salt/control/placement/openstack/minimal.yml b/salt/control/placement/openstack/minimal.yml
new file mode 100644
index 0000000..8c62e28
--- /dev/null
+++ b/salt/control/placement/openstack/minimal.yml
@@ -0,0 +1,76 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    openstack_database_node01_hostname: dbs01
+    openstack_database_node02_hostname: dbs02
+    openstack_database_node03_hostname: dbs03
+    openstack_message_queue_node01_hostname: msg01
+    openstack_message_queue_node02_hostname: msg02
+    openstack_message_queue_node03_hostname: msg03
+    openstack_proxy_node01_hostname: prx01
+    openstack_proxy_node02_hostname: prx02
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ctl01:
+              name: ${_param:openstack_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl02:
+              name: ${_param:openstack_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl03:
+              name: ${_param:openstack_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            dbs01:
+              name: ${_param:openstack_database_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs02:
+              name: ${_param:openstack_database_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs03:
+              name: ${_param:openstack_database_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            msg01:
+              name: ${_param:openstack_message_queue_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg02:
+              name: ${_param:openstack_message_queue_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg03:
+              name: ${_param:openstack_message_queue_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            prx01:
+              name: ${_param:openstack_proxy_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
+            prx02:
+              name: ${_param:openstack_proxy_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
diff --git a/salt/control/placement/openstack/small.yml b/salt/control/placement/openstack/small.yml
new file mode 100644
index 0000000..8c62e28
--- /dev/null
+++ b/salt/control/placement/openstack/small.yml
@@ -0,0 +1,76 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    openstack_control_node01_hostname: ctl01
+    openstack_control_node02_hostname: ctl02
+    openstack_control_node03_hostname: ctl03
+    openstack_database_node01_hostname: dbs01
+    openstack_database_node02_hostname: dbs02
+    openstack_database_node03_hostname: dbs03
+    openstack_message_queue_node01_hostname: msg01
+    openstack_message_queue_node02_hostname: msg02
+    openstack_message_queue_node03_hostname: msg03
+    openstack_proxy_node01_hostname: prx01
+    openstack_proxy_node02_hostname: prx02
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            ctl01:
+              name: ${_param:openstack_control_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl02:
+              name: ${_param:openstack_control_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            ctl03:
+              name: ${_param:openstack_control_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.control
+            dbs01:
+              name: ${_param:openstack_database_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs02:
+              name: ${_param:openstack_database_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            dbs03:
+              name: ${_param:openstack_database_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.database
+            msg01:
+              name: ${_param:openstack_message_queue_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg02:
+              name: ${_param:openstack_message_queue_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            msg03:
+              name: ${_param:openstack_message_queue_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.message_queue
+            prx01:
+              name: ${_param:openstack_proxy_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
+            prx02:
+              name: ${_param:openstack_proxy_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: openstack.proxy
diff --git a/salt/control/placement/stacklight/compact.yml b/salt/control/placement/stacklight/compact.yml
new file mode 100644
index 0000000..2cde570
--- /dev/null
+++ b/salt/control/placement/stacklight/compact.yml
@@ -0,0 +1,64 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    stacklight_log_node01_hostname: log01
+    stacklight_log_node02_hostname: log02
+    stacklight_log_node03_hostname: log03
+    stacklight_monitor_node01_hostname: mon01
+    stacklight_monitor_node02_hostname: mon02
+    stacklight_monitor_node03_hostname: mon03
+    stacklight_telemetry_node01_hostname: mtr01
+    stacklight_telemetry_node02_hostname: mtr02
+    stacklight_telemetry_node03_hostname: mtr03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            mtr01:
+              name: ${_param:stacklight_telemetry_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr02:
+              name: ${_param:stacklight_telemetry_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr03:
+              name: ${_param:stacklight_telemetry_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            log01:
+              name: ${_param:stacklight_log_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log02:
+              name: ${_param:stacklight_log_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log03:
+              name: ${_param:stacklight_log_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            mon01:
+              name: ${_param:stacklight_monitor_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon02:
+              name: ${_param:stacklight_monitor_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon03:
+              name: ${_param:stacklight_monitor_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: stacklight.server
\ No newline at end of file
diff --git a/salt/control/placement/stacklight/large.yml b/salt/control/placement/stacklight/large.yml
new file mode 100644
index 0000000..7b380d8
--- /dev/null
+++ b/salt/control/placement/stacklight/large.yml
@@ -0,0 +1,64 @@
+parameters:
+  _param:
+    infra_kvm13_hostname: kvm13
+    infra_kvm14_hostname: kvm14
+    infra_kvm15_hostname: kvm15
+    stacklight_log_node01_hostname: log01
+    stacklight_log_node02_hostname: log02
+    stacklight_log_node03_hostname: log03
+    stacklight_monitor_node01_hostname: mon01
+    stacklight_monitor_node02_hostname: mon02
+    stacklight_monitor_node03_hostname: mon03
+    stacklight_telemetry_node01_hostname: mtr01
+    stacklight_telemetry_node02_hostname: mtr02
+    stacklight_telemetry_node03_hostname: mtr03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            mtr01:
+              name: ${_param:stacklight_telemetry_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node13_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr02:
+              name: ${_param:stacklight_telemetry_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node14_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr03:
+              name: ${_param:stacklight_telemetry_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node15_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            log01:
+              name: ${_param:stacklight_log_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node13_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log02:
+              name: ${_param:stacklight_log_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node14_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log03:
+              name: ${_param:stacklight_log_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node15_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            mon01:
+              name: ${_param:stacklight_monitor_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node13_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon02:
+              name: ${_param:stacklight_monitor_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node14_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon03:
+              name: ${_param:stacklight_monitor_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node15_hostname}.${_param:cluster_domain}
+              size: stacklight.server
\ No newline at end of file
diff --git a/salt/control/placement/stacklight/medium.yml b/salt/control/placement/stacklight/medium.yml
new file mode 100644
index 0000000..7f54f4d
--- /dev/null
+++ b/salt/control/placement/stacklight/medium.yml
@@ -0,0 +1,64 @@
+parameters:
+  _param:
+    infra_kvm10_hostname: kvm10
+    infra_kvm11_hostname: kvm11
+    infra_kvm12_hostname: kvm12
+    stacklight_log_node01_hostname: log01
+    stacklight_log_node02_hostname: log02
+    stacklight_log_node03_hostname: log03
+    stacklight_monitor_node01_hostname: mon01
+    stacklight_monitor_node02_hostname: mon02
+    stacklight_monitor_node03_hostname: mon03
+    stacklight_telemetry_node01_hostname: mtr01
+    stacklight_telemetry_node02_hostname: mtr02
+    stacklight_telemetry_node03_hostname: mtr03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            mtr01:
+              name: ${_param:stacklight_telemetry_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node10_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr02:
+              name: ${_param:stacklight_telemetry_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node11_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr03:
+              name: ${_param:stacklight_telemetry_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node12_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            log01:
+              name: ${_param:stacklight_log_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node10_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            lop02:
+              name: ${_param:stacklight_log_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node11_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log03:
+              name: ${_param:stacklight_log_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node12_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            mon01:
+              name: ${_param:stacklight_monitor_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node10_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon02:
+              name: ${_param:stacklight_monitor_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node11_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon03:
+              name: ${_param:stacklight_monitor_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node12_hostname}.${_param:cluster_domain}
+              size: stacklight.server
\ No newline at end of file
diff --git a/salt/control/placement/stacklight/minimal.yml b/salt/control/placement/stacklight/minimal.yml
new file mode 100644
index 0000000..2cde570
--- /dev/null
+++ b/salt/control/placement/stacklight/minimal.yml
@@ -0,0 +1,64 @@
+parameters:
+  _param:
+    infra_kvm01_hostname: kvm01
+    infra_kvm02_hostname: kvm02
+    infra_kvm03_hostname: kvm03
+    stacklight_log_node01_hostname: log01
+    stacklight_log_node02_hostname: log02
+    stacklight_log_node03_hostname: log03
+    stacklight_monitor_node01_hostname: mon01
+    stacklight_monitor_node02_hostname: mon02
+    stacklight_monitor_node03_hostname: mon03
+    stacklight_telemetry_node01_hostname: mtr01
+    stacklight_telemetry_node02_hostname: mtr02
+    stacklight_telemetry_node03_hostname: mtr03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            mtr01:
+              name: ${_param:stacklight_telemetry_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr02:
+              name: ${_param:stacklight_telemetry_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr03:
+              name: ${_param:stacklight_telemetry_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            log01:
+              name: ${_param:stacklight_log_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log02:
+              name: ${_param:stacklight_log_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log03:
+              name: ${_param:stacklight_log_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            mon01:
+              name: ${_param:stacklight_monitor_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node01_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon02:
+              name: ${_param:stacklight_monitor_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node02_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon03:
+              name: ${_param:stacklight_monitor_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node03_hostname}.${_param:cluster_domain}
+              size: stacklight.server
\ No newline at end of file
diff --git a/salt/control/placement/stacklight/small.yml b/salt/control/placement/stacklight/small.yml
new file mode 100644
index 0000000..e16a7cb
--- /dev/null
+++ b/salt/control/placement/stacklight/small.yml
@@ -0,0 +1,64 @@
+parameters:
+  _param:
+    infra_kvm04_hostname: kvm04
+    infra_kvm05_hostname: kvm05
+    infra_kvm06_hostname: kvm06
+    stacklight_log_node01_hostname: log01
+    stacklight_log_node02_hostname: log02
+    stacklight_log_node03_hostname: log03
+    stacklight_monitor_node01_hostname: mon01
+    stacklight_monitor_node02_hostname: mon02
+    stacklight_monitor_node03_hostname: mon03
+    stacklight_telemetry_node01_hostname: mtr01
+    stacklight_telemetry_node02_hostname: mtr02
+    stacklight_telemetry_node03_hostname: mtr03
+  salt:
+    control:
+      cluster:
+        internal:
+          node:
+            mtr01:
+              name: ${_param:stacklight_telemetry_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node04_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr02:
+              name: ${_param:stacklight_telemetry_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node05_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            mtr03:
+              name: ${_param:stacklight_telemetry_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node06_hostname}.${_param:cluster_domain}
+              size: stacklight.telemetry
+            log01:
+              name: ${_param:stacklight_log_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node04_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log02:
+              name: ${_param:stacklight_log_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node05_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            log03:
+              name: ${_param:stacklight_log_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node06_hostname}.${_param:cluster_domain}
+              size: stacklight.log
+            mon01:
+              name: ${_param:stacklight_monitor_node01_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node04_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon02:
+              name: ${_param:stacklight_monitor_node02_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node05_hostname}.${_param:cluster_domain}
+              size: stacklight.server
+            mon03:
+              name: ${_param:stacklight_monitor_node03_hostname}
+              image: ${_param:salt_control_xenial_image}
+              provider: ${_param:infra_kvm_node06_hostname}.${_param:cluster_domain}
+              size: stacklight.server
\ No newline at end of file
diff --git a/salt/control/sizes/stacklight.yml b/salt/control/sizes/stacklight.yml
index 5b09c14..c7b1875 100644
--- a/salt/control/sizes/stacklight.yml
+++ b/salt/control/sizes/stacklight.yml
@@ -10,7 +10,7 @@
     salt_control_size_net_profile_stacklight_server: default
     salt_control_size_cpu_stacklight_telemetry: 12
     salt_control_size_ram_stacklight_telemetry: 98304
-    salt_control_size_disk_profile_stacklight_telemetryr: huge
+    salt_control_size_disk_profile_stacklight_telemetry: huge
     salt_control_size_net_profile_stacklight_telemetry: default
   salt:
     control:
diff --git a/salt/master/formula/git/saltstack.yml b/salt/master/formula/git/saltstack.yml
index d7dde48..b176a2e 100644
--- a/salt/master/formula/git/saltstack.yml
+++ b/salt/master/formula/git/saltstack.yml
@@ -60,6 +60,9 @@
               source: git
               address: '${_param:salt_master_environment_repository}/salt-formula-sphinx.git'
               revision: ${_param:salt_master_environment_revision}
+            watchdog:
+              source: git
+              address: '${_param:salt_master_environment_repository}/salt-formula-watchdog.git'
             xtrabackup:
               source: git
               address: '${_param:salt_master_environment_repository}/salt-formula-xtrabackup.git'
diff --git a/salt/master/formula/pkg/saltstack.yml b/salt/master/formula/pkg/saltstack.yml
index 963580c..a682f7f 100644
--- a/salt/master/formula/pkg/saltstack.yml
+++ b/salt/master/formula/pkg/saltstack.yml
@@ -39,6 +39,9 @@
             sphinx:
               source: pkg
               name: salt-formula-sphinx
+            watchdog:
+              source: pkg
+              name: salt-formula-watchdog
             xtrabackup:
               source: pkg
               name: salt-formula-xtrabackup
diff --git a/salt/master/pkg.yml b/salt/master/pkg.yml
index ac839f8..33c60d9 100644
--- a/salt/master/pkg.yml
+++ b/salt/master/pkg.yml
@@ -1,5 +1,6 @@
 classes:
 - system.salt.master.single
+- system.salt.master.formula.pkg.auditd
 - system.salt.master.formula.pkg.ccp
 - system.salt.master.formula.pkg.foundation
 - system.salt.master.formula.pkg.kubernetes
@@ -9,4 +10,4 @@
 - system.salt.master.formula.pkg.stacklight
 - system.salt.master.formula.pkg.monitoring
 - system.salt.master.formula.pkg.helm
-- system.salt.master.formula.pkg.ceph
\ No newline at end of file
+- system.salt.master.formula.pkg.ceph
diff --git a/salt/minion/ca/qemu-vnc_ca.yml b/salt/minion/ca/qemu-vnc_ca.yml
new file mode 100644
index 0000000..53778f1
--- /dev/null
+++ b/salt/minion/ca/qemu-vnc_ca.yml
@@ -0,0 +1,30 @@
+parameters:
+  _param:
+    qemu_vnc_ca_common_name: QEMU VNC CA
+    qemu_vnc_ca_country: cz
+    qemu_vnc_ca_locality: Prague
+    qemu_vnc_ca_organization: Mirantis
+    qemu_vnc_ca_days_valid_authority: 3650
+    qemu_vnc_ca_days_valid_certificate: 365
+  salt:
+    minion:
+      ca:
+        qemu_vnc_ca:
+          # We recommend using a dedicated certificate authority solely for the VNC service.
+          # This authority may be a child of the master certificate authority used for the OpenStack deployment.
+          # This is because libvirt does not currently have a mechanism to restrict what certificates can be presented by the proxy server.
+          # https://docs.openstack.org/nova/queens/admin/remote-console-access.html
+          common_name: ${_param:qemu_vnc_ca_common_name}
+          country: ${_param:qemu_vnc_ca_country}
+          locality: ${_param:qemu_vnc_ca_locality}
+          organization: ${_param:qemu_vnc_ca_organization}
+          signing_policy:
+            cert_server:
+              type: v3_edge_cert_server
+              minions: 'cmp*'
+            cert_client:
+              type: v3_edge_cert_client
+              minions: 'ctl*'
+          days_valid:
+            authority: ${_param:qemu_vnc_ca_days_valid_authority}
+            certificate: ${_param:qemu_vnc_ca_days_valid_certificate}
diff --git a/salt/minion/cert/libvirtd/vnc_server.yml b/salt/minion/cert/libvirtd/vnc_server.yml
new file mode 100644
index 0000000..c49852e
--- /dev/null
+++ b/salt/minion/cert/libvirtd/vnc_server.yml
@@ -0,0 +1,27 @@
+parameters:
+  _param:
+    qemu_vnc_server_ssl_key_file: /etc/pki/libvirt-vnc/server-key.pem
+    qemu_vnc_server_ssl_cert_file: /etc/pki/libvirt-vnc/server-cert.pem
+    qemu_vnc_ssl_ca_file: /etc/pki/libvirt-vnc/ca-cert.pem
+    salt_minion_ca_host: cfg01.${_param:cluster_domain}
+    qemu_vnc_ca_authority: qemu_vnc_ca
+  salt:
+    minion:
+      cert:
+        qemu_vnc_server:
+          host: ${_param:salt_minion_ca_host}
+          authority: ${_param:qemu_vnc_ca_authority}
+          common_name: ${linux:system:name}.${_param:cluster_domain}
+          signing_policy: cert_server
+          alternative_names: >
+            IP:${_param:cluster_local_address},
+            DNS:${_param:cluster_local_address},
+            DNS:${linux:system:name},
+            DNS:${linux:network:fqdn}
+          key_usage: "digitalSignature,nonRepudiation,keyEncipherment"
+          key_file: ${_param:qemu_vnc_server_ssl_key_file}
+          cert_file: ${_param:qemu_vnc_server_ssl_cert_file}
+          ca_file: ${_param:qemu_vnc_ssl_ca_file}
+          user: libvirt-qemu
+          group: libvirt-qemu
+          mode: 640
diff --git a/salt/minion/cert/vnc/init.yml b/salt/minion/cert/vnc/init.yml
new file mode 100644
index 0000000..6f7f6ee
--- /dev/null
+++ b/salt/minion/cert/vnc/init.yml
@@ -0,0 +1,4 @@
+parameters:
+  _param:
+    salt_minion_ca_host: cfg01.${_param:cluster_domain}
+    qemu_vnc_ca_authority: qemu_vnc_ca
diff --git a/salt/minion/cert/vnc/novncproxy_client.yml b/salt/minion/cert/vnc/novncproxy_client.yml
new file mode 100644
index 0000000..7f695eb
--- /dev/null
+++ b/salt/minion/cert/vnc/novncproxy_client.yml
@@ -0,0 +1,29 @@
+classes:
+- system.salt.minion.cert.vnc
+parameters:
+  _param:
+    novncproxy_client_ssl_key_file: /etc/pki/nova-novncproxy/client-key.pem
+    novncproxy_client_ssl_cert_file: /etc/pki/nova-novncproxy/client-cert.pem
+    novncproxy_ssl_ca_file: /etc/pki/nova-novncproxy/ca-cert.pem
+    nova_websocketproxy_ssl_all_file: /var/lib/nova/self.pem
+  salt:
+    minion:
+      cert:
+        libvirt_novnc_client:
+          host: ${_param:salt_minion_ca_host}
+          authority: ${_param:qemu_vnc_ca_authority}
+          common_name: ${linux:system:name}.${_param:cluster_domain}
+          signing_policy: cert_client
+          alternative_names: >
+            IP:${_param:cluster_local_address},
+            DNS:${_param:cluster_local_address},
+            DNS:${linux:system:name},
+            DNS:${linux:network:fqdn}
+          key_usage: "digitalSignature,nonRepudiation,keyEncipherment"
+          key_file: ${_param:novncproxy_client_ssl_key_file}
+          cert_file: ${_param:novncproxy_client_ssl_cert_file}
+          ca_file: ${_param:novncproxy_ssl_ca_file}
+          all_file: ${_param:nova_websocketproxy_ssl_all_file}
+          user: nova
+          group: nova
+          mode: 640