Baremetal deployment on top on Ironic

Heat templates have been refactored to deploy both VM
cases and baremetal nodes cases on top of Ironic.

Related-PROD: PRODX-2342
Change-Id: I6439ec670c69d67b65eb1806040a64f800dc6628
diff --git a/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp0-gtw0.yaml b/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp0-gtw0.yaml
new file mode 100644
index 0000000..15821c5
--- /dev/null
+++ b/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp0-gtw0.yaml
@@ -0,0 +1,67 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccBM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesBM.yaml
+
+parameters:
+  image: bionic-server-cloudimg-amd64-20190612
+  ucp_flavor: oscore-bm-lab-01
+  masters_flavor: oscore-bm-lab-01
+  workers_flavor: oscore-bm-lab-01
+  cmps_flavor: oscore-bm-lab-01
+  gtws_flavor: oscore-bm-lab-01
+  lmas_flavor: oscore-bm-lab-01
+  osds_flavor: oscore-bm-lab-01
+  public_net_id: 'physnet1-402'
+  host_interface: 'enp3s0f0'
+  masters_size: 0
+  worker_size: 3
+  cmp_size: 0
+  gtw_size: 0
+  lma_size: 0
+  osd_size: 0
+  ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '172.16.49.128/26'
+  private_floating_network_pool_start: '172.16.49.180'
+  private_floating_network_pool_end: '172.16.49.190'
+  private_floating_network_gateway: '172.16.49.129'
+  private_floating_interface: 'enp3s0f1.403'
+  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
+  cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
+  gtw_metadata: {"labels": {"openvswitch":"enabled"}}
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+        local public_if_mac
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        public_if_mac=$(ip link show $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1) | grep 'link/ether' | awk '{print $2}')
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+        sed -i "s/.*ethernets:.*/&\n        $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1):\n            dhcp4: false\n            match:\n                macaddress: ${public_if_mac}\n            set-name: $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1)/" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        vlans:
+            ${PUBLIC_INTERFACE}:
+                id: 403
+                link: $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1)
+                addresses: [ "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ]
+    EOF
+
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp2-gtw0.yaml b/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp2-gtw0.yaml
new file mode 100644
index 0000000..2694479
--- /dev/null
+++ b/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp2-gtw0.yaml
@@ -0,0 +1,67 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccBM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesBM.yaml
+
+parameters:
+  image: bionic-server-cloudimg-amd64-20190612
+  ucp_flavor: oscore-bm-lab-01
+  masters_flavor: oscore-bm-lab-01
+  workers_flavor: oscore-bm-lab-01
+  cmps_flavor: oscore-bm-lab-01
+  gtws_flavor: oscore-bm-lab-01
+  lmas_flavor: oscore-bm-lab-01
+  osds_flavor: oscore-bm-lab-01
+  public_net_id: 'physnet1-402'
+  host_interface: 'enp3s0f0'
+  masters_size: 0
+  worker_size: 3
+  cmp_size: 2
+  gtw_size: 0
+  lma_size: 0
+  osd_size: 0
+  ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '172.16.49.128/26'
+  private_floating_network_pool_start: '172.16.49.180'
+  private_floating_network_pool_end: '172.16.49.190'
+  private_floating_network_gateway: '172.16.49.129'
+  private_floating_interface: 'enp3s0f1.403'
+  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
+  cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
+  gtw_metadata: {"labels": {"openvswitch":"enabled"}}
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+        local public_if_mac
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        public_if_mac=$(ip link show $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1) | grep 'link/ether' | awk '{print $2}')
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+        sed -i "s/.*ethernets:.*/&\n        $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1):\n            dhcp4: false\n            match:\n                macaddress: ${public_if_mac}\n            set-name: $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1)/" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        vlans:
+            ${PUBLIC_INTERFACE}:
+                id: 403
+                link: $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1)
+                addresses: [ "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ]
+    EOF
+
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp3-gtw0.yaml b/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp3-gtw0.yaml
new file mode 100644
index 0000000..6443fb4
--- /dev/null
+++ b/de/heat-templates/env/bmt402-mstr1-wrkr3-cmp3-gtw0.yaml
@@ -0,0 +1,67 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccBM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesBM.yaml
+
+parameters:
+  image: bionic-server-cloudimg-amd64-20190612
+  ucp_flavor: oscore-bm-lab-01
+  masters_flavor: oscore-bm-lab-01
+  workers_flavor: oscore-bm-lab-01
+  cmps_flavor: oscore-bm-lab-01
+  gtws_flavor: oscore-bm-lab-01
+  lmas_flavor: oscore-bm-lab-01
+  osds_flavor: oscore-bm-lab-01
+  public_net_id: 'physnet1-402'
+  host_interface: 'enp3s0f0'
+  masters_size: 0
+  worker_size: 3
+  cmp_size: 3
+  gtw_size: 0
+  lma_size: 0
+  osd_size: 0
+  ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '172.16.49.128/26'
+  private_floating_network_pool_start: '172.16.49.180'
+  private_floating_network_pool_end: '172.16.49.190'
+  private_floating_network_gateway: '172.16.49.129'
+  private_floating_interface: 'enp3s0f1.403'
+  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
+  cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
+  gtw_metadata: {"labels": {"openvswitch":"enabled"}}
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+        local public_if_mac
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        public_if_mac=$(ip link show $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1) | grep 'link/ether' | awk '{print $2}')
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+        sed -i "s/.*ethernets:.*/&\n        $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1):\n            dhcp4: false\n            match:\n                macaddress: ${public_if_mac}\n            set-name: $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1)/" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        vlans:
+            ${PUBLIC_INTERFACE}:
+                id: 403
+                link: $(echo ${PUBLIC_INTERFACE} | cut -d'.' -f1)
+                addresses: [ "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ]
+    EOF
+
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/compute.yaml b/de/heat-templates/env/compute.yaml
index 0a74783..118bd61 100644
--- a/de/heat-templates/env/compute.yaml
+++ b/de/heat-templates/env/compute.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 2
   worker_size: 3
   cmp_size: 2
   gtw_size: 0
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
-  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
+  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/converged.yaml b/de/heat-templates/env/converged.yaml
index 03da84c..41b9a4f 100644
--- a/de/heat-templates/env/converged.yaml
+++ b/de/heat-templates/env/converged.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 2
   worker_size: 3
   cmp_size: 0
   gtw_size: 0
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
   worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml
index ec0ba7f..8841a20 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp0-gtw0.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 0
   worker_size: 3
   cmp_size: 0
   gtw_size: 0
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
   worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml
index 390de69..4c9e163 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp2-gtw0.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 0
   worker_size: 3
   cmp_size: 2
   gtw_size: 0
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
-  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
+  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml
index aed2f89..c871f91 100644
--- a/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr3-cmp3-gtw0.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 0
   worker_size: 3
   cmp_size: 3
   gtw_size: 0
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
-  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
+  worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml
index 062a447..5efde2b 100644
--- a/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr5-cmp0-gtw0.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 0
   worker_size: 5
   cmp_size: 0
   gtw_size: 0
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
   worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml b/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml
index 28d3fdf..4c9e163 100644
--- a/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml
+++ b/de/heat-templates/env/mstr1-wrkr5-cmp2-gtw0.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 0
-  worker_size: 5
+  worker_size: 3
   cmp_size: 2
   gtw_size: 0
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
   worker_metadata: {"labels": {"openstack-control-plane":"enabled","openstack-compute-node":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml
index c89c863..c2f7876 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3-osd3.yaml
@@ -1,5 +1,9 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   ucp_flavor: system.compact.openstack.control
   masters_flavor: system.compact.openstack.control
@@ -9,6 +13,7 @@
   lmas_flavor: system.compact.stacklight.server
   osds_flavor: system.virtual.ceph.osd
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 2
   worker_size: 3
   cmp_size: 2
@@ -16,9 +21,49 @@
   lma_size: 3
   osd_size: 3
   ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
   worker_metadata: {"labels": {"openstack-control-plane":"enabled","openvswitch":"enabled"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled",}}
   gtw_metadata: {"labels": {"openvswitch":"enabled", "gateway": "enabled"}}
   lma_metadata: {"labels": {"role": "stacklight", "stacklight": "enabled"}}
   osd_metadata: {"labels": {"role": "ceph-osd-node"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml
index 62bb03e..3b3d557 100644
--- a/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml
+++ b/de/heat-templates/env/mstr3-wrkr3-cmp2-gtw3-lma3.yaml
@@ -1,15 +1,61 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 2
   worker_size: 3
   cmp_size: 2
   gtw_size: 3
   lma_size: 3
+  osd_size: 0
   ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
   worker_metadata: {"labels": {"openstack-control-plane":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled", "gateway": "enabled"}}
   lma_metadata: {"labels": {"role": "stacklight", "stacklight": "enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/env/telco.yaml b/de/heat-templates/env/telco.yaml
index 8abd2a8..4e03ec0 100644
--- a/de/heat-templates/env/telco.yaml
+++ b/de/heat-templates/env/telco.yaml
@@ -1,13 +1,60 @@
+resource_registry:
+  "MCP2::NetworkAcc": ../fragments/NetworkAccVM.yaml
+  "MCP2::NetworkPrvFl": ../fragments/NetworkPrvFl.yaml
+  "MCP2::SrvInstances": ../fragments/SrvInstancesVM.yaml
+
 parameters:
-  key_name: devcloud
   image: bionic-server-cloudimg-amd64-20190612
   public_net_id: public
+  host_interface: 'ens3'
   masters_size: 2
   worker_size: 3
   cmp_size: 2
   gtw_size: 2
+  lma_size: 0
+  osd_size: 0
   ucp_boot_timeout: 1200
+  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  private_floating_network_cidr: '10.11.12.0/24'
+  private_floating_interface: 'ens4'
   worker_metadata: {"labels": {"openstack-control-plane":"enabled","openvswitch":"enabled","role":"ceph-osd-node"}}
   cmp_metadata: {"labels": {"openstack-compute-node":"enabled","openvswitch":"enabled", "role":"ceph-osd-node"}}
   gtw_metadata: {"labels": {"openvswitch":"enabled", "gateway": "enabled"}}
-  cluster_public_key: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCp0evjOaK8c8SKYK4r2+0BN7g+8YSvQ2n8nFgOURCyvkJqOHi1qPGZmuN0CclYVdVuZiXbWw3VxRbSW3EH736VzgY1U0JmoTiSamzLHaWsXvEIW8VCi7boli539QJP0ikJiBaNAgZILyCrVPN+A6mfqtacs1KXdZ0zlMq1BPtFciR1JTCRcVs5vP2Wwz5QtY2jMIh3aiwkePjMTQPcfmh1TkOlxYu5IbQyZ3G1ahA0mNKI9a0dtF282av/F6pwB/N1R1nEZ/9VtcN2I1mf1NW/tTHEEcTzXYo1R/8K9vlqAN8QvvGLZtZduGviNVNoNWvoxaXxDt8CPv2B2NCdQFZp
+  functions_override: |
+    function network_config {
+        PUBLIC_NODE_IP_ADDRESS=${PUBLIC_INTERFACE_IP:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")}
+        PUBLIC_NODE_IP_NETMASK=${PUBLIC_INTERFACE_NETMASK:-$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)}
+
+        local public_interface=${1:-${PUBLIC_INTERFACE}}
+        local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
+        local match_ip_line
+
+        DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
+
+    cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
+    [NetDev]
+    Name=veth-phy
+    Kind=veth
+    [Peer]
+    Name=veth-br
+    EOF
+
+        sed -i 's/.*ethernets:.*/&\n        veth-phy: {}/' ${cloud_netplan_cfg}
+        sed -i 's/.*ethernets:.*/&\n        veth-br: {}/' ${cloud_netplan_cfg}
+
+        match_ip_line=$(grep -nm1 "${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}" ${cloud_netplan_cfg} | cut -d: -f1)
+
+        sed -i "$((${match_ip_line}-1)),$((${match_ip_line}))d" ${cloud_netplan_cfg}
+
+    cat << EOF >> ${cloud_netplan_cfg}
+        bridges:
+            br-public:
+                dhcp4: false
+                interfaces:
+                - ${PUBLIC_INTERFACE}
+                - veth-br
+                addresses:
+                - ${PUBLIC_NODE_IP_ADDRESS}/${PUBLIC_NODE_IP_NETMASK}
+    EOF
+        netplan --debug apply
+    }
diff --git a/de/heat-templates/fragments/NetworkAccBM.yaml b/de/heat-templates/fragments/NetworkAccBM.yaml
new file mode 100644
index 0000000..3ebfb3b
--- /dev/null
+++ b/de/heat-templates/fragments/NetworkAccBM.yaml
@@ -0,0 +1,13 @@
+heat_template_version: queens
+
+parameters:
+  public_net_id:
+    type: string
+
+resources:
+
+outputs:
+  public_network:
+    value: { get_param: public_net_id }
+  accessible_subnet_id:
+    value: ''
diff --git a/de/heat-templates/fragments/NetworkAccVM.yaml b/de/heat-templates/fragments/NetworkAccVM.yaml
new file mode 100644
index 0000000..8b03070
--- /dev/null
+++ b/de/heat-templates/fragments/NetworkAccVM.yaml
@@ -0,0 +1,36 @@
+heat_template_version: queens
+
+parameters:
+  public_net_id:
+    type: string
+
+resources:
+
+  network:
+    type: OS::Neutron::Net
+  subnet:
+    type: OS::Neutron::Subnet
+    properties:
+      network: { get_resource: network }
+      enable_dhcp: true
+      cidr: '10.10.0.0/24'
+      dns_nameservers:
+        - 172.18.224.6
+        - 172.18.176.6
+  router:
+    type: OS::Neutron::Router
+    properties:
+      external_gateway_info:
+        network: { get_param: public_net_id }
+  router_iface:
+    type: OS::Neutron::RouterInterface
+    properties:
+      router: { get_resource: router }
+      subnet: { get_resource: subnet }
+
+
+outputs:
+  public_network:
+    value: { get_resource: network }
+  accessible_subnet_id:
+    value: { get_resource: subnet }
diff --git a/de/heat-templates/fragments/NetworkPrvFl.yaml b/de/heat-templates/fragments/NetworkPrvFl.yaml
new file mode 100644
index 0000000..0509def
--- /dev/null
+++ b/de/heat-templates/fragments/NetworkPrvFl.yaml
@@ -0,0 +1,23 @@
+heat_template_version: queens
+
+parameters:
+  private_floating_network_cidr:
+    type: string
+
+resources:
+
+  network:
+    type: OS::Neutron::Net
+  subnet:
+    type: OS::Neutron::Subnet
+    properties:
+      network: { get_resource: network }
+      enable_dhcp: false
+      cidr: { get_param: private_floating_network_cidr }
+      gateway_ip: ~
+
+outputs:
+  private_floating_network_id:
+    value: { get_resource: network }
+  private_floating_subnet_id:
+    value: { get_resource: subnet }
diff --git a/de/heat-templates/fragments/SrvInstancesBM.yaml b/de/heat-templates/fragments/SrvInstancesBM.yaml
new file mode 100644
index 0000000..166b510
--- /dev/null
+++ b/de/heat-templates/fragments/SrvInstancesBM.yaml
@@ -0,0 +1,108 @@
+heat_template_version: queens
+
+parameters:
+
+  metadata:
+    type: json
+    default: {}
+  node_type:
+    type: string
+  key_name:
+    type: string
+    description: Name of keypair to assign to servers
+  image:
+    type: string
+    description: Name of image to use for servers
+  flavor:
+    type: string
+    description: Flavor to use for servers
+  accessible_network:
+    type: string
+  accessible_subnet_id:
+    type: string
+  private_floating_network:
+    type: string
+  private_floating_network_cidr:
+    type: string
+  private_floating_subnet_id:
+    type: string
+  private_floating_interface:
+    type: string
+  host_interface:
+    type: string
+  functions_override:
+    type: string
+  boot_timeout:
+    type: number
+    description: Boot timeout for instance
+    default: 1200
+  ucp_master_host:
+    type: string
+    default: ''
+  public_net_id:
+    type: string
+    default: ''
+
+resources:
+
+  software_config:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: { get_file: ../scripts/instance_boot.sh }
+          params:
+            $node_type:  { get_param: node_type }
+            $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
+            $ucp_license_key: { get_file: ../scripts/license.lic }
+            $ucp_master_host: { get_param: ucp_master_host }
+            $node_metadata: { get_param: metadata }
+            $host_interface: { get_param: host_interface }
+            $private_floating_interface: { get_param: private_floating_interface }
+            $private_floating_network_cidr: { str_split: ['/', { get_param: private_floating_network_cidr }, 1] }
+            $private_floating_interface_ip: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+            $functions_override: { get_param: functions_override }
+
+  server:
+    type: OS::Nova::Server
+    properties:
+      image: { get_param: image }
+      flavor: { get_param: flavor }
+      key_name: { get_param: key_name }
+      availability_zone: nova
+      networks:
+        - network: { get_param: accessible_network }
+        # NOTE(ohryhorov): connect to accessible network only as ironic doesn't
+        # support multitenancy use-case. Use private_floating_network for IPAM only.
+      user_data_format: RAW
+      user_data: { get_resource: software_config }
+      metadata: { get_param: metadata }
+
+  private_floating_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: private_floating_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: private_floating_subnet_id }
+
+  wait_handle:
+    type: OS::Heat::WaitConditionHandle
+  wait_condition:
+    type: OS::Heat::WaitCondition
+    properties:
+      handle: { get_resource: wait_handle }
+      timeout: { get_param: boot_timeout }
+
+
+outputs:
+  server_private_ip:
+    description: IP address of server in private network
+    value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
+  server_private_floating_ip:
+    description: IP address of server in private floating network
+    value: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+  server_public_ip:
+    description: Floating IP address of server in public network
+    value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
diff --git a/de/heat-templates/fragments/SrvInstancesVM.yaml b/de/heat-templates/fragments/SrvInstancesVM.yaml
new file mode 100644
index 0000000..7cb89ae
--- /dev/null
+++ b/de/heat-templates/fragments/SrvInstancesVM.yaml
@@ -0,0 +1,119 @@
+heat_template_version: queens
+
+parameters:
+
+  metadata:
+    type: json
+    default: {}
+  node_type:
+    type: string
+  key_name:
+    type: string
+    description: Name of keypair to assign to servers
+  image:
+    type: string
+    description: Name of image to use for servers
+  flavor:
+    type: string
+    description: Flavor to use for servers
+  accessible_network:
+    type: string
+  accessible_subnet_id:
+    type: string
+  private_floating_network:
+    type: string
+  private_floating_network_cidr:
+    type: string
+  private_floating_subnet_id:
+    type: string
+  private_floating_interface:
+    type: string
+  host_interface:
+    type: string
+  functions_override:
+    type: string
+  boot_timeout:
+    type: number
+    description: Boot timeout for instance
+    default: 1200
+  ucp_master_host:
+    type: string
+    default: ''
+  public_net_id:
+    type: string
+
+resources:
+
+  software_config:
+    type: OS::Heat::SoftwareConfig
+    properties:
+      group: ungrouped
+      config:
+        str_replace:
+          template: { get_file: ../scripts/instance_boot.sh }
+          params:
+            $node_type:  { get_param: node_type }
+            $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
+            $ucp_license_key: { get_file: ../scripts/license.lic }
+            $ucp_master_host: { get_param: ucp_master_host }
+            $node_metadata: { get_param: metadata }
+            $host_interface: { get_param: host_interface }
+            $private_floating_interface: { get_param: private_floating_interface }
+            $private_floating_interface_ip: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+            $private_floating_network_cidr: { str_split: ['/', { get_param: private_floating_network_cidr }, 1] }
+            $functions_override: { get_param: functions_override }
+
+  server:
+    type: OS::Nova::Server
+    properties:
+      image: { get_param: image }
+      flavor: { get_param: flavor }
+      key_name: { get_param: key_name }
+      availability_zone: nova
+      networks:
+        - port: { get_resource: accessible_server_port }
+        - port: { get_resource: private_floating_server_port }
+      user_data_format: RAW
+      user_data: { get_resource: software_config }
+      metadata: { get_param: metadata }
+
+  accessible_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: accessible_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: accessible_subnet_id }
+
+  private_floating_server_port:
+    type: OS::Neutron::Port
+    properties:
+      network_id: { get_param: private_floating_network }
+      port_security_enabled: false
+      fixed_ips:
+        - subnet: { get_param: private_floating_subnet_id }
+
+  server_floating_ip:
+    type: OS::Neutron::FloatingIP
+    properties:
+      floating_network_id: { get_param: public_net_id }
+      port_id: { get_resource: accessible_server_port }
+
+  wait_handle:
+    type: OS::Heat::WaitConditionHandle
+  wait_condition:
+    type: OS::Heat::WaitCondition
+    properties:
+      handle: { get_resource: wait_handle }
+      timeout: { get_param: boot_timeout }
+
+outputs:
+  server_private_ip:
+    description: IP address of server in private network
+    value: { get_attr: [server, networks, { get_param: accessible_network}, 0]}
+  server_private_floating_ip:
+    description: IP address of server in private floating network
+    value: { get_attr: [private_floating_server_port, fixed_ips, 0, ip_address] }
+  server_public_ip:
+    description: Floating IP address of server in public network
+    value: { get_attr: [ server_floating_ip, floating_ip_address ] }
diff --git a/de/heat-templates/scripts/instance_boot.sh b/de/heat-templates/scripts/instance_boot.sh
index 602cb40..7282da4 100644
--- a/de/heat-templates/scripts/instance_boot.sh
+++ b/de/heat-templates/scripts/instance_boot.sh
@@ -1,11 +1,26 @@
 #!/bin/bash
 set -x
 
+#
+# Variables in this block are passed from heat template
+#
+HOST_INTERFACE=$host_interface
+PUBLIC_INTERFACE=$private_floating_interface
+PUBLIC_INTERFACE_IP=$private_floating_interface_ip
+PUBLIC_INTERFACE_NETMASK=$private_floating_network_cidr
+NODE_TYPE=$node_type
+UCP_MASTER_HOST=$ucp_master_host
+NODE_METADATA='$node_metadata'
+#
+# End of block
+#
+
 DOCKER_DEFAULT_ADDRESS_POOL=${DOCKER_DEFAULT_ADDRESS_POOL:-10.10.1.0/16}
 # DOCKER_DEFAULT_ADDRESS_SIZE have to be less then netmask in DOCKER_DEFAULT_ADDRESS_POOL because
 # to the fact that actual netmask for docker_gwbridge is given from it
 DOCKER_DEFAULT_ADDRESS_SIZE=${DOCKER_DEFAULT_ADDRESS_SIZE:-24}
 HOST_INTERFACE=${HOST_INTERFACE:-ens3}
+PUBLIC_INTERFACE=${PUBLIC_INTERFACE:-ens4}
 NODE_IP_ADDRESS=$(ip addr show dev ${HOST_INTERFACE} |grep -Po 'inet \K[\d.]+' |egrep -v "127.0.|172.17")
 UCP_USERNAME=${UCP_USERNAME:-admin}
 UCP_PASSWORD=${UCP_PASSWORD:-administrator}
@@ -14,13 +29,9 @@
 NODE_DEPLOYMENT_RETRIES=${NODE_DEPLOYMENT_RETRIES:-15}
 FLOATING_NETWORK_PREFIXES=${FLOATING_NETWORK_PREFIXES:-10.11.12.0/24}
 PUBLIC_INTERFACE=${PUBLIC_INTERFACE:-ens4}
-PUBLIC_NODE_IP_ADDRESS=$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+' | egrep -v "127.0.|172.17")
-PUBLIC_NODE_IP_NETMASK=$(ip addr show dev ${PUBLIC_INTERFACE} | grep -Po 'inet \K[\d.]+\/[\d]+' | egrep -v "127.0.|172.17" | cut -d'/' -f2)
-
-NODE_TYPE=$node_type
-UCP_MASTER_HOST=$ucp_master_host
 UCP_MASTER_HOST=${UCP_MASTER_HOST:-${NODE_IP_ADDRESS}}
-NODE_METADATA='$node_metadata'
+UCP_IP_ADDRESS=${UCP_IP_ADDRESS:-$NODE_IP_ADDRESS}
+
 
 function retry {
     local retries=$1
@@ -96,15 +107,18 @@
     cat <<EOF > ${tmpd}/docker_subscription.lic
 $ucp_license_key
 EOF
+    function docker_run_retry {
+        docker container run --rm --name ucp \
+        -v /var/run/docker.sock:/var/run/docker.sock \
+        -v $tmpd/docker_subscription.lic:/config/docker_subscription.lic \
+        docker/ucp:3.2.4 install \
+        --host-address $UCP_IP_ADDRESS \
+        --admin-username $UCP_USERNAME \
+        --admin-password $UCP_PASSWORD \
+        --existing-config
+    }
 
-    docker container run --rm --name ucp \
-    -v /var/run/docker.sock:/var/run/docker.sock \
-    -v $tmpd/docker_subscription.lic:/config/docker_subscription.lic \
-    docker/ucp:3.2.4 install \
-    --host-address $NODE_IP_ADDRESS \
-    --admin-username $UCP_USERNAME \
-    --admin-password $UCP_PASSWORD \
-    --existing-config
+    retry 3 "Can't bring up docker UCP container" docker_run_retry
 }
 
 function download_bundles {
@@ -115,10 +129,17 @@
     # Download the client certificate bundle
         curl -k -H "Authorization: Bearer $AUTHTOKEN" https://${UCP_MASTER_HOST}/api/clientbundle -o ${tmpd}/bundle.zip
     }
+
+    function get_authtoken_retry {
     # Download the bundle https://docs.docker.com/ee/ucp/user-access/cli/
     # Create an environment variable with the user security token
-    AUTHTOKEN=$(curl -sk -d '{"username":"'$UCP_USERNAME'","password":"'$UCP_PASSWORD'"}' https://${UCP_MASTER_HOST}/auth/login | jq -r .auth_token)
+        AUTHTOKEN=$(curl -sk -d '{"username":"'$UCP_USERNAME'","password":"'$UCP_PASSWORD'"}' https://${UCP_MASTER_HOST}/auth/login | jq -r .auth_token)
+        if [ -z ${AUTHTOKEN} ]; then
+            return -1
+        fi
+    }
 
+    retry 4 "Can't get AUTHTOKEN from master." get_authtoken_retry
     retry 3 "Can't download bundle file from master." download_bundles_retry
 
     pushd $tmpd
@@ -156,7 +177,7 @@
 }
 
 function swarm_init {
-    docker swarm init --advertise-addr ${HOST_INTERFACE}
+    docker swarm init --advertise-addr ${UCP_IP_ADDRESS}
 }
 
 function rm_ucp_config {
@@ -182,13 +203,11 @@
     done
 }
 
-function configure_public_interface {
+function network_config {
     local public_interface=${1:-${PUBLIC_INTERFACE}}
     local cloud_netplan_cfg="/etc/netplan/50-cloud-init.yaml"
     local match_ip_line
-
     DEBIAN_FRONTEND=noninteractive apt -y install bridge-utils atop
-
 cat << EOF > /etc/systemd/network/10-veth-phy-br.netdev
 [NetDev]
 Name=veth-phy
@@ -216,6 +235,8 @@
     netplan --debug apply
 }
 
+$functions_override
+
 function set_node_labels {
 
     kubectl patch node $(hostname) -p "{\"metadata\": ${NODE_METADATA}}"
@@ -226,7 +247,7 @@
         prepare_network
         update_docker_network
         install_docker_ce
-        configure_public_interface
+        network_config
         swarm_init
         create_ucp_config
         install_ucp
@@ -241,7 +262,7 @@
         prepare_network
         update_docker_network
         install_docker_ce
-        configure_public_interface
+        network_config
         download_bundles
         join_node manager
         install_kubectl
@@ -253,7 +274,7 @@
         prepare_network
         update_docker_network
         install_docker_ce
-        configure_public_interface
+        network_config
         download_bundles
         join_node worker
         install_kubectl
diff --git a/de/heat-templates/srv-group.yaml b/de/heat-templates/srv-group.yaml
deleted file mode 100644
index dee472b..0000000
--- a/de/heat-templates/srv-group.yaml
+++ /dev/null
@@ -1,99 +0,0 @@
-heat_template_version: queens
-
-parameters:
-  key_name:
-    type: string
-    description: Name of keypair to assign to servers
-  image:
-    type: string
-    description: Name of image to use for servers
-  flavor:
-    type: string
-    description: Flavor to use for servers
-  public_net_id:
-    type: string
-    description: >
-      ID of public network for which floating IP addresses will be allocated
-  private_net_id:
-    type: string
-    description: ID of private network into which servers get deployed
-  private_subnet_id:
-    type: string
-    description: ID of private subnet
-  private_floating_network:
-    type: string
-    description: ID of network that will be used for floating in nested openstack
-  boot_timeout:
-    type: number
-    description: Boot timeout for instance
-    default: 1200
-  metadata:
-    type: json
-  node_type:
-    type: string
-  ucp_master_host:
-    type: string
-    default: ''
-
-resources:
-
-  software_config:
-    type: OS::Heat::SoftwareConfig
-    properties:
-      group: ungrouped
-      config:
-        str_replace:
-          template: { get_file: ./scripts/instance_boot.sh }
-          params:
-            $node_type:  { get_param: node_type }
-            $wait_condition_notify: { get_attr: [ wait_handle, curl_cli ] }
-            $ucp_license_key: { get_file: ./scripts/license.lic }
-            $ucp_master_host: { get_param: ucp_master_host }
-            $node_metadata: { get_param: metadata }
-
-  server:
-    type: OS::Nova::Server
-    properties:
-      image: { get_param: image }
-      flavor: { get_param: flavor }
-      key_name: { get_param: key_name }
-      availability_zone: nova
-      networks:
-        - port: { get_resource: server_port }
-        - network: { get_param: private_floating_network }
-      user_data_format: RAW
-      user_data: { get_resource: software_config }
-      metadata: { get_param: metadata }
-
-  server_port:
-    type: OS::Neutron::Port
-    properties:
-      network_id: { get_param: private_net_id }
-      port_security_enabled: false
-      fixed_ips:
-        - subnet: { get_param: private_subnet_id }
-
-  server_floating_ip:
-    type: OS::Neutron::FloatingIP
-    properties:
-      floating_network_id: { get_param: public_net_id }
-      port_id: { get_resource: server_port }
-
-  wait_handle:
-    type: OS::Heat::WaitConditionHandle
-  wait_condition:
-    type: OS::Heat::WaitCondition
-    properties:
-      handle: { get_resource: wait_handle }
-      timeout: { get_param: boot_timeout }
-
-outputs:
-  server_private_ip:
-    description: IP address of server in private network
-    value: { get_attr: [ server_port, fixed_ips, 0, ip_address] }
-  server_private_floating_ip:
-    description: IP address of server in private floating network
-    value: { get_attr: [server, networks, { get_param: private_floating_network }, 0]}
-  server_public_ip:
-    description: Floating IP address of server in public network
-    value: { get_attr: [ server_floating_ip, floating_ip_address ] }
diff --git a/de/heat-templates/top.yaml b/de/heat-templates/top.yaml
index 4595008..66f5680 100644
--- a/de/heat-templates/top.yaml
+++ b/de/heat-templates/top.yaml
@@ -1,16 +1,18 @@
 heat_template_version: queens
 
 parameters:
-  key_name:
-    type: string
-    description: Name of keypair to assign to servers
   image:
     type: string
     description: Name of image to use for servers
   public_net_id:
     type: string
+    default: ''
     description: >
-      ID of public network for which floating IP addresses will be allocated
+      ID of public network for which floating IP addresses will be allocated/
+      for baremetal case flat provision network for nodes
+  host_interface:
+    type: string
+    description: Interface which connects server with public network (world accessible network).
   masters_size:
     type: number
     description: Number of masters instances to deploy
@@ -44,6 +46,18 @@
   private_floating_network_cidr:
     type: string
     default: '10.11.12.0/24'
+  private_floating_network_pool_start:
+    type: string
+    default: '10.11.12.100'
+  private_floating_network_pool_end:
+    type: string
+    default: '10.11.12.200'
+  private_floating_network_gateway:
+    type: string
+    default: '10.11.12.11'
+  private_floating_interface:
+    description: Interface which carries floating network for child OpenStack.
+    type: string
   worker_metadata:
     type: json
     default: {}
@@ -80,6 +94,8 @@
   osds_flavor:
     type: string
     default: 'system.compact.openstack.control'
+  functions_override:
+    type: string
 
 resources:
   key_pair:
@@ -89,178 +105,187 @@
       public_key: { get_param: cluster_public_key}
       save_private_key: false
 
-  network:
-    type: OS::Neutron::Net
-  subnet:
-    type: OS::Neutron::Subnet
+  accessible_network:
+    type: MCP2::NetworkAcc
     properties:
-      network: { get_resource: network }
-      cidr: 10.10.0.0/24
-      dns_nameservers:
-        - 172.18.224.6
-        - 172.18.176.6
-  router:
-    type: OS::Neutron::Router
-    properties:
-      external_gateway_info:
-        network: { get_param: public_net_id }
-  router_iface:
-    type: OS::Neutron::RouterInterface
-    properties:
-      router: { get_resource: router }
-      subnet: { get_resource: subnet }
+      public_net_id: { get_param: public_net_id }
 
   private_floating_network:
-    type: OS::Neutron::Net
+    type: MCP2::NetworkPrvFl
     properties:
-      port_security_enabled: false
-  private_floating_subnet:
-    type: OS::Neutron::Subnet
-    properties:
-      network: { get_resource: private_floating_network }
-      cidr: { get_param: private_floating_network_cidr }
-      enable_dhcp: false
-      gateway_ip: ~
+      private_floating_network_cidr: { get_param: private_floating_network_cidr }
 
   ucp:
-    depends_on: router_iface
-    type: ./srv-group.yaml
+    depends_on: accessible_network
+    type: MCP2::SrvInstances
     properties:
-      image: { get_param: image }
-      flavor: { get_param: ucp_flavor }
-      key_name: { get_param: "OS::stack_name" }
-      public_net_id: { get_param: public_net_id }
-      private_net_id: { get_resource: network }
-      private_subnet_id: { get_resource: subnet }
-      private_floating_network: { get_resource: private_floating_network }
       metadata: {"role":"ucp"}
       node_type: "ucp"
+      key_name: { get_param: "OS::stack_name" }
+      image: { get_param: image }
+      flavor: { get_param: ucp_flavor }
+      accessible_network: { get_attr: [accessible_network, public_network] }
+      private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
+      private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
+      private_floating_interface: { get_param: private_floating_interface }
+      private_floating_network_cidr: { get_param: private_floating_network_cidr }
+      accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
+      public_net_id: { get_param: public_net_id }
+      host_interface: { get_param: host_interface }
+      functions_override: { get_param: functions_override }
+
 
   masters:
     type: OS::Heat::ResourceGroup
     depends_on:
      - ucp
-     - router_iface
     properties:
       count: { get_param: masters_size }
       resource_def:
-        type: ./srv-group.yaml
+        type: MCP2::SrvInstances
         properties:
-          image: { get_param: image }
-          flavor: { get_param: masters_flavor }
-          key_name: { get_param: "OS::stack_name" }
-          public_net_id: { get_param: public_net_id }
-          private_net_id: { get_resource: network }
-          private_subnet_id: { get_resource: subnet }
-          private_floating_network: { get_resource: private_floating_network }
           metadata: {"role":"master"}
           node_type: "master"
+          key_name: { get_param: "OS::stack_name" }
+          image: { get_param: image }
+          flavor: { get_param: masters_flavor }
+          accessible_network: { get_attr: [accessible_network, public_network] }
+          private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
+          private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
+          private_floating_interface: { get_param: private_floating_interface }
+          private_floating_network_cidr: { get_param: private_floating_network_cidr }
+          accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
+          public_net_id: { get_param: public_net_id }
+          host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
+          functions_override: { get_param: functions_override }
+
 
   workers:
     type: OS::Heat::ResourceGroup
     depends_on:
      - ucp
-     - router_iface
     properties:
       count: { get_param: worker_size }
       resource_def:
-        type: ./srv-group.yaml
+        type: MCP2::SrvInstances
         properties:
+          metadata: { get_param: worker_metadata}
+          node_type: "worker"
+          key_name: { get_param: "OS::stack_name" }
           image: { get_param: image }
           flavor: { get_param: workers_flavor }
           key_name: { get_param: "OS::stack_name" }
+          accessible_network: { get_attr: [accessible_network, public_network] }
+          private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
+          private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
+          private_floating_interface: { get_param: private_floating_interface }
+          private_floating_network_cidr: { get_param: private_floating_network_cidr }
+          accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
           public_net_id: { get_param: public_net_id }
-          private_net_id: { get_resource: network }
-          private_subnet_id: { get_resource: subnet }
-          private_floating_network: { get_resource: private_floating_network }
-          metadata: { get_param: worker_metadata}
-          node_type: "worker"
+          host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
+          functions_override: { get_param: functions_override }
 
   cmps:
     type: OS::Heat::ResourceGroup
     depends_on:
      - ucp
-     - router_iface
     properties:
       count: { get_param: cmp_size }
       resource_def:
-        type: ./srv-group.yaml
+        type: MCP2::SrvInstances
         properties:
+          metadata: { get_param: cmp_metadata }
+          node_type: "worker"
+          key_name: { get_param: "OS::stack_name" }
           image: { get_param: image }
           flavor: { get_param: cmps_flavor }
-          key_name: { get_param: "OS::stack_name" }
+          accessible_network: { get_attr: [accessible_network, public_network] }
+          private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
+          private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
+          private_floating_interface: { get_param: private_floating_interface }
+          private_floating_network_cidr: { get_param: private_floating_network_cidr }
+          accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
           public_net_id: { get_param: public_net_id }
-          private_net_id: { get_resource: network }
-          private_subnet_id: { get_resource: subnet }
-          private_floating_network: { get_resource: private_floating_network }
-          metadata: { get_param: cmp_metadata}
-          node_type: "worker"
+          host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
+          functions_override: { get_param: functions_override }
 
   gtws:
     type: OS::Heat::ResourceGroup
     depends_on:
      - ucp
-     - router_iface
     properties:
       count: { get_param: gtw_size }
       resource_def:
-        type: ./srv-group.yaml
+        type: MCP2::SrvInstances
         properties:
+          metadata: { get_param: gtw_metadata }
+          node_type: "worker"
+          key_name: { get_param: "OS::stack_name" }
           image: { get_param: image }
           flavor: { get_param: gtws_flavor }
-          key_name: { get_param: "OS::stack_name" }
+          accessible_network: { get_attr: [accessible_network, public_network] }
+          private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
+          private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
+          private_floating_interface: { get_param: private_floating_interface }
+          private_floating_network_cidr: { get_param: private_floating_network_cidr }
+          accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
           public_net_id: { get_param: public_net_id }
-          private_net_id: { get_resource: network }
-          private_subnet_id: { get_resource: subnet }
-          private_floating_network: { get_resource: private_floating_network }
-          metadata: { get_param: gtw_metadata}
-          node_type: "worker"
+          host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
+          functions_override: { get_param: functions_override }
 
   lmas:
     type: OS::Heat::ResourceGroup
     depends_on:
      - ucp
-     - router_iface
     properties:
       count: { get_param: lma_size }
       resource_def:
-        type: ./srv-group.yaml
+        type: MCP2::SrvInstances
         properties:
+          metadata: { get_param: lma_metadata }
+          node_type: "worker"
+          key_name: { get_param: "OS::stack_name" }
           image: { get_param: image }
           flavor: { get_param: lmas_flavor }
-          key_name: { get_param: "OS::stack_name" }
+          accessible_network: { get_attr: [accessible_network, public_network] }
+          private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
+          private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
+          private_floating_interface: { get_param: private_floating_interface }
+          private_floating_network_cidr: { get_param: private_floating_network_cidr }
+          accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
           public_net_id: { get_param: public_net_id }
-          private_net_id: { get_resource: network }
-          private_subnet_id: { get_resource: subnet }
-          private_floating_network: { get_resource: private_floating_network }
-          metadata: { get_param: lma_metadata}
-          node_type: "worker"
+          host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
+          functions_override: { get_param: functions_override }
 
   osds:
     type: OS::Heat::ResourceGroup
     depends_on:
      - ucp
-     - router_iface
     properties:
       count: { get_param: osd_size }
       resource_def:
-        type: ./srv-group.yaml
+        type: MCP2::SrvInstances
         properties:
+          metadata: { get_param: osd_metadata }
+          node_type: "worker"
+          key_name: { get_param: "OS::stack_name" }
           image: { get_param: image }
           flavor: { get_param: osds_flavor }
-          key_name: { get_param: "OS::stack_name" }
+          accessible_network: { get_attr: [accessible_network, public_network] }
+          private_floating_network: { get_attr: [private_floating_network, private_floating_network_id] }
+          private_floating_subnet_id: { get_attr: [private_floating_network, private_floating_subnet_id] }
+          private_floating_interface: { get_param: private_floating_interface }
+          private_floating_network_cidr: { get_param: private_floating_network_cidr }
+          accessible_subnet_id: { get_attr: [accessible_network, accessible_subnet_id]}
           public_net_id: { get_param: public_net_id }
-          private_net_id: { get_resource: network }
-          private_subnet_id: { get_resource: subnet }
-          private_floating_network: { get_resource: private_floating_network }
-          metadata: { get_param: osd_metadata}
-          node_type: "worker"
+          host_interface: { get_param: host_interface }
           ucp_master_host: { get_attr: [ucp, server_private_ip] }
+          functions_override: { get_param: functions_override }
 
 outputs:
   ucp_ips:
@@ -289,3 +314,10 @@
     value: { get_attr: [workers, server_private_floating_ip] }
   private_floating_cidr:
     value: { get_param: private_floating_network_cidr }
+  private_floating_network_pool_start:
+    value: { get_param: private_floating_network_pool_start }
+  private_floating_network_pool_end:
+    value: { get_param: private_floating_network_pool_end }
+  private_floating_network_gateway:
+    value: { get_param: private_floating_network_gateway }
+