So I think this is actually a configuration problem, not a bug as such. There's two ways to configure the overlay networks, you can either use Neutron flat networks or define a vlan per network, but in both cases the underlying network (flat name or vlan) must be unique, and just changing the *NetName parameter isn't enough. # Default networks look like #| 029108dc-760e-4e90-bbf8-59519d64840c | external | 6933a383-6b7f-4012-8843-b9e4d3c29b83 10.0.0.0/24 | #| 2317b290-6f74-46e7-8269-d05cd593048f | tenant | 3e6b1de4-486b-48c4-b94a-ec31d316152e 172.16.0.0/24 | #| 7893b3bd-692c-443c-a9b3-6cc929c91bb1 | ctlplane | dd1f2ee9-499b-4abd-a7bf-de60214bed5e 192.0.2.0/24 | #| b0418dc1-476b-41c2-a12d-b82fb3f344f1 | internal_api | c3e045ea-570e-4080-a219-603a3c5667ae 172.16.2.0/24 | #| bd06fc37-7e85-4212-a1c7-1376cf7978a3 | storage | b46d3239-00b2-4d72-84f0-0d5e4d9e0468 172.16.1.0/24 | #| eadeb10f-b361-49c0-9769-6d6983fa1857 | storage_mgmt | 4b81fc4a-7dbe-4883-8a0f-eb52d07c00eb 172.16.3.0/24 | And to override it you need to change *NetName and also *NetValueSpecs (because *NetValueSpecs has hard-coded references to the flat network name). I tested this, which uses flat networking for all except the external network (where I created a new vlan. parameter_defaults: ExternalNetName: external2 InternalApiNetName: internal2 ManagementNetName: management2 StorageMgmtNetName: storagemgt2 StorageNetName: storage2 TenantNetName: tenant2 ExternalSubnetName: external_subnet2 InternalSubnetName: internal_subnet2 ManagementSubnetName: management_subnet2 StorageMgmtSubnetName: storagemgmt_subnet2 StorageSubnetName: storage_subnet2 TenantSubnetName: tenant_subnet2 ExternalAllocationPools: [{'start': '10.0.1.4', 'end': '10.0.1.250'}] ExternalInterfaceDefaultRoute: '10.0.1.1' # Note this has been created via /etc/sysconfig/network-scripts/ifcfg-vlan20 # DEVICE=vlan20 # ONBOOT=yes # HOTPLUG=no # TYPE=OVSIntPort # OVS_BRIDGE=br-ctlplane # OVS_OPTIONS="tag=10" # BOOTPROTO=static # IPADDR=10.0.1.1 # PREFIX=24 # NM_CONTROLLED=no ExternalNetworkVlanID: 20 InternalApiNetCidr: '172.16.4.0/24' StorageMgmtNetCidr: '172.16.5.0/24' StorageNetCidr: '172.16.6.0/24' TenantNetCidr: '172.16.7.0/24' ManagementNetCidr: '172.16.8.0/24' InternalAllocationPools: [{'start': '172.16.4.4', 'end': '172.16.4.250'}] StorageMgmtAllocationPools: [{'start': '172.16.5.4', 'end': '172.16.5.250'}] StorageAllocationPools: [{'start': '172.16.6.4', 'end': '172.16.6.250'}] TenantAllocationPools: [{'start': '172.16.7.4', 'end': '172.16.7.250'}] ManagementAllocationPools: [{'start': '172.16.8.4', 'end': '172.16.8.250'}] InternalApiNetValueSpecs: {'provider:physical_network': 'internal_api2', 'provider:network_type': 'flat'} ManagementNetValueSpecs: {'provider:physical_network': 'management2', 'provider:network_type': 'flat'} StorageMgmtNetValueSpecs: {'provider:physical_network': 'storagemgmt2', 'provider:network_type': 'flat'} StorageNetValueSpecs: {'provider:physical_network': 'storage2', 'provider:network_type': 'flat'} TenantNetValueSpecs: {'provider:physical_network': 'tenant2', 'provider:network_type': 'flat'} The other approach is to use vlans for everything, which is documented here (WIP docs patch): https://review.openstack.org/#/c/368840/ So, I think this is primarily a docs issue, and perhaps also we could do better at defaulting *ValueSpecs based on the *NetName, but I'm not sure if that really buys us much given that folks need to make a decision on how to ensure all the other stuff doesn't conflict.