Merge "Create neutronv2 module for ports"
diff --git a/.kitchen.yml b/.kitchen.yml
index 2b5e840..78a4834 100644
--- a/.kitchen.yml
+++ b/.kitchen.yml
@@ -42,7 +42,7 @@
           - linux_repo_openstack
           - neutron
   pillars-from-files:
-    linux_repo_openstack.sls: tests/pillar/repo_mos9.sls
+    linux_repo_openstack.sls: tests/pillar/repo_<%= ENV['OS_VERSION'] || 'mos9' %>.sls
 
 verifier:
   name: inspec
@@ -51,7 +51,7 @@
 platforms:
   - name: <%=ENV['PLATFORM'] || 'saltstack-ubuntu-xenial-salt-stable'%>
     driver_config:
-      image: <%=ENV['PLATFORM'] || 'epcim/salt:saltstack-ubuntu-xenial-salt-stable'%>
+      image: <%=ENV['PLATFORM'] || 'docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19'%>
       platform: ubuntu
 
 suites:
@@ -60,145 +60,270 @@
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_dpdk.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'mitaka' %>
 
   - name: compute_dvr
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_dvr.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: compute_dvr_fwaas_v1
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_dvr_fwaas_v1.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: compute_legacy
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_legacy.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'mitaka' %>
 
   - name: compute_nonexternal_dvr
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_nonexternal_dvr.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'mitaka' %>
 
   - name: compute_sriov
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_sriov.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'mitaka' %>
+
 
   - name: compute_qos_sriov
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_qos_sriov.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: compute_qos
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_qos.sls
+      pillars:
+        release.sls:
+          neutron:
+            compute:
+              version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: compute_ovn
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_ovn.sls
+      release.sls:
+        neutron:
+          compute:
+            version: <%= ENV['OS_VERSION'] || 'queens' %>
 
   - name: compute_bgpvpn
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/compute_bgpvpn.sls
+      release.sls:
+        neutron:
+          compute:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: control_cluster
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_cluster.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'mitaka' %>
 
   - name: control_dvr
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_dvr.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: control_nodvr
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_nodvr.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'mitaka' %>
 
   - name: control_lbaas_octavia
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_lbaas_octavia.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: control_fwaas_v1
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_fwaas_v1.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: control_l2gw
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_l2gw.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: control_opendaylight
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_opendaylight.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: control_single
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_single.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'mitaka' %>
 
   - name: control_qos
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_qos.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: control_ovn
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_ovn.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'queens' %>
 
   - name: control_bgpvpn
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_bgpvpn.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: control_sfc
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_sfc.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'queens' %>
 
   - name: gateway_dvr
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/gateway_dvr.sls
+      release.sls:
+        neutron:
+          gateway:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: gateway_legacy
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/gateway_legacy.sls
+      release.sls:
+        neutron:
+          gateway:
+            version: <%= ENV['OS_VERSION'] || 'mitaka' %>
 
   - name: gateway_qos
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/gateway_qos.sls
+      release.sls:
+        neutron:
+          gateway:
+            version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: gateway_legacy_fwaas_v1
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/gateway_legacy_fwaas_v1.sls
+      release.sls:
+        neutron:
+          gateway:
+            version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
   - name: gateway_legacy_l2gw
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/gateway_legacy_l2gw.sls
+      release.sls:
+        neutron:
+          gateway:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: gateway_legacy_opendaylight
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/gateway_legacy_opendaylight.sls
+      release.sls:
+        neutron:
+          gateway:
+            version: <%= ENV['OS_VERSION'] || 'pike' %>
 
   - name: control_dns
     provisioner:
       pillars-from-files:
         neutron.sls: tests/pillar/control_dns.sls
+      release.sls:
+        neutron:
+          server:
+            version: <%= ENV['OS_VERSION'] || 'ocata' %>
 
 # vim: ft=yaml sw=2 ts=2 sts=2 tw=125
diff --git a/.travis.yml b/.travis.yml
index 9a9d635..0984d89 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -15,58 +15,32 @@
   - bundle install
 
 env:
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-dpdk
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-dvr-fwaas-v1
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-nonexternal-dvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-qos-sriov
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=compute-ovn
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=control-cluster
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=control-nodvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=control-fwaas-v1
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=control-opendaylight
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=control-qos
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=gateway-dvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=gateway-qos
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2017.7 SUITE=gateway-legacy-l2gw
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=compute-dvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=compute-legacy
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=compute-sriov
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=compute-qos
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=control-dvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=control-lbaas-octavia
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=control-l2gw
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=control-single
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=control-ovn
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=gateway-dvr
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=gateway-legacy
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=gateway-legacy-fwaas-v1
-    - PLATFORM=epcim/salt:saltstack-ubuntu-xenial-salt-2018.3 SUITE=gateway-legacy-opendaylight
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=compute-dvr
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=compute-legacy
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=compute-sriov
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=compute-qos
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=control-dvr
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=control-lbaas-octavia
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=control-l2gw
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=control-single
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=control-ovn
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=control-dns
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=gateway-legacy
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=gateway-legacy-fwaas-v1
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2017.7 SUITE=gateway-legacy-opendaylight
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=compute-dpdk
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=compute-dvr-fwaas-v1
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=compute-nonexternal-dvr
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=compute-qos-sriov
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=compute-ovn
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=control-cluster
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=control-nodvr
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=control-fwaas-v1
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=control-opendaylight
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=control-qos
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=gateway-dvr
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=gateway-qos
-    # - PLATFORM=epcim/salt:saltstack-ubuntu-bionic-salt-2018.3 SUITE=gateway-legacy-l2gw
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=compute-dpdk
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=ocata SUITE=compute-dvr-fwaas-v1
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=compute-nonexternal-dvr
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=compute-qos-sriov
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=queens SUITE=compute-ovn
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=control-cluster
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=control-nodvr
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=ocata SUITE=control-fwaas-v1
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=control-opendaylight
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=control-qos
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=gateway-dvr
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=gateway-qos
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-2017.7/salt:2018_11_19 OS_VERSION=pike SUITE=gateway-legacy-l2gw
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=compute-dvr
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=compute-legacy
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=compute-sriov
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=compute-qos
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=control-dvr
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=control-lbaas-octavia
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=control-l2gw
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=control-single
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=queens SUITE=control-ovn
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=gateway-dvr
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=gateway-legacy
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=ocata SUITE=gateway-legacy-fwaas-v1
+    - PLATFORM=docker-dev-local.docker.mirantis.net/epcim/salt/saltstack-ubuntu-xenial-salt-stable/salt:2018_11_19 OS_VERSION=pike SUITE=gateway-legacy-opendaylight
 
 before_script:
   - set -o pipefail
diff --git a/LICENSE b/LICENSE
index 8e80b12..cdb66dd 100644
--- a/LICENSE
+++ b/LICENSE
@@ -1,4 +1,4 @@
-Copyright (c) 2014-2015 tcp cloud a. s.
+Copyright (c) 2014-2019 Mirantis Inc. et al
 
 Licensed under the Apache License, Version 2.0 (the "License");
 you may not use this file except in compliance with the License.
diff --git a/README.rst b/README.rst
index 00a74c4..86afc25 100644
--- a/README.rst
+++ b/README.rst
@@ -743,7 +743,7 @@
                 - flat # possible values - 'flat' or 'vlan'
             sriov_net:
               mtu: 9000 # Optional, defaults to 1500
-              vlan_range: '100:200' # Optional
+              vlan_range: '100:200,300:400' # Optional
               types:
                 - vlan
             ext_net2:
@@ -819,6 +819,37 @@
             ovs:
               driver: openvswitch
 
+Neutron with LinuxBridge Agents
+-------------------------------
+
+.. code-block:: yaml
+
+    neutron:
+      server:
+        firewall_driver: iptables
+        backend:
+          mechanism:
+            lb:
+              driver: linuxbridge
+      ....
+      compute:
+        backend:
+          mechanism:
+            lb:
+              driver: linuxbridge
+      ....
+      gateway:
+        backend:
+          mechanism:
+            lb:
+              driver: linuxbridge
+        agents:
+          dhcp:
+            interface_driver: linuxbridge
+          l3:
+            interface_driver: linuxbridge
+
+
 Neutron with VLAN-aware-VMs
 ---------------------------
 
@@ -1577,30 +1608,3 @@
 
 You can read more about it here:
     https://docs.openstack.org/security-guide/databases/database-access-control.html
-
-Documentation and Bugs
-======================
-
-* http://salt-formulas.readthedocs.io/
-   Learn how to install and update salt-formulas
-
-* https://github.com/salt-formulas/salt-formula-neutron/issues
-   In the unfortunate event that bugs are discovered, report the issue to the
-   appropriate issue tracker. Use the Github issue tracker for a specific salt
-   formula
-
-* https://launchpad.net/salt-formulas
-   For feature requests, bug reports, or blueprints affecting the entire
-   ecosystem, use the Launchpad salt-formulas project
-
-* https://launchpad.net/~salt-formulas-users
-   Join the salt-formulas-users team and subscribe to mailing list if required
-
-* https://github.com/salt-formulas/salt-formula-neutron
-   Develop the salt-formulas projects in the master branch and then submit pull
-   requests against a specific formula
-
-* #salt-formulas @ irc.freenode.net
-   Use this IRC channel in case of any questions or feedback which is always
-   welcome
-
diff --git a/debian/control b/debian/control
index 647aa59..08b03a7 100644
--- a/debian/control
+++ b/debian/control
@@ -1,5 +1,5 @@
 Source: salt-formula-neutron
-Maintainer: PKG OpenStack <openstack-devel@lists.alioth.debian.org>
+Maintainer: Mirantis Dev <dev@mirantis.com>
 Uploaders: Filip Pytloun <filip@pytloun.cz>,
            OndÅ™ej Nový <onovy@debian.org>,
 Section: admin
@@ -10,7 +10,7 @@
                      python-yaml,
                      salt-formula-keystone,
 Standards-Version: 3.9.6
-Homepage: https://wiki.openstack.org/wiki/OpenStackSalt
+Homepage: https://www.mirantis.com
 Vcs-Browser: https://anonscm.debian.org/cgit/openstack/salt-formula-neutron.git/
 Vcs-Git: https://anonscm.debian.org/git/openstack/salt-formula-neutron.git
 
diff --git a/debian/copyright b/debian/copyright
index f314934..dc854a7 100644
--- a/debian/copyright
+++ b/debian/copyright
@@ -3,7 +3,7 @@
 Source: https://github.com/openstack/salt-formula-neutron
 
 Files: *
-Copyright: 2014-2016 tcp cloud
+Copyright: 2014-2019 Mirantis Inc. et al
 License: Apache-2.0
 
 Files: debian/*
diff --git a/metadata.yml b/metadata.yml
index d43d586..d459d74 100644
--- a/metadata.yml
+++ b/metadata.yml
@@ -3,4 +3,4 @@
 source: "https://github.com/openstack/salt-formula-neutron"
 dependencies:
   - name: keystone
-    source: "https://github.com/salt-formulas/salt-formula-keystone"
+    source: "https://gerrit.mcp.mirantis.com/salt-formulas/keystone"
diff --git a/neutron/client/resources/v2.sls b/neutron/client/resources/v2.sls
index d1bfd87..3bd57b9 100644
--- a/neutron/client/resources/v2.sls
+++ b/neutron/client/resources/v2.sls
@@ -105,6 +105,9 @@
     {%- if pool.is_default is defined %}
     - is_default: {{ pool.is_default }}
     {%- endif %}
+    {%- if pool.shared is defined %}
+    - shared: {{ pool.shared }}
+    {%- endif %}
     {%- if pool.prefixes is defined %}
     - prefixes:
       {%- for prefix in pool.prefixes %}
diff --git a/neutron/files/mitaka/l3_agent.ini b/neutron/files/mitaka/l3_agent.ini
index 3916ec3..0c0266a 100644
--- a/neutron/files/mitaka/l3_agent.ini
+++ b/neutron/files/mitaka/l3_agent.ini
@@ -26,7 +26,11 @@
 
 # The driver used to manage the virtual interface. (string value)
 #interface_driver = <None>
+{%- if neutron.get('agents', {}).get('l3', {}).interface_driver is defined %}
+interface_driver = {{ neutron.agents.l3.interface_driver }}
+{%- else %}
 interface_driver = openvswitch
+{%- endif %}
 
 # Timeout in seconds for ovs-vsctl commands. If the timeout expires, ovs commands will fail with ALARMCLOCK error. (integer value)
 #ovs_vsctl_timeout = 10
diff --git a/neutron/files/mitaka/linuxbridge_agent.ini b/neutron/files/mitaka/linuxbridge_agent.ini
new file mode 100644
index 0000000..43532f4
--- /dev/null
+++ b/neutron/files/mitaka/linuxbridge_agent.ini
@@ -0,0 +1,265 @@
+{%- if pillar.neutron.gateway is defined %}
+{%- from "neutron/map.jinja" import gateway as neutron with context %}
+{%- else %}
+{%- from "neutron/map.jinja" import compute as neutron with context %}
+{%- endif %}
+
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of the default
+# INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+#debug = false
+
+# DEPRECATED: If set to false, the logging level will be set to WARNING instead
+# of the default INFO level. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+#verbose = true
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. Note that when logging
+# configuration files are used then all logging configuration is set in the
+# configuration file and other logging configuration options are ignored (for
+# example, logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set. (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to send logging output to. If no default is set,
+# logging will go to stderr as defined by use_stderr. This option is ignored if
+# log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative log_file  paths. This option
+# is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Uses logging handler designed to watch file system. When log file is moved or
+# removed this handler will open a new log file with specified path
+# instantaneously. It makes sense only if log_file option is specified and
+# Linux platform is used. This option is ignored if log_config_append is set.
+# (boolean value)
+#watch_log_file = false
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and will be
+# changed later to honor RFC5424. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_syslog = false
+
+# Enable journald for logging. If running in a systemd environment you may wish
+# to enable journal support. Doing so will use the journal native protocol
+# which includes structured metadata in addition to log messages.This option is
+# ignored if log_config_append is set. (boolean value)
+#use_journal = false
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. This option is ignored if log_config_append is
+# set. (boolean value)
+#use_stderr = false
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages when context is undefined. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Additional data to append to log message when logging level for the message
+# is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
+
+# List of package logging levels in logger=LEVEL pairs. This option is ignored
+# if log_config_append is set. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Interval, number of seconds, of log rate limiting. (integer value)
+#rate_limit_interval = 0
+
+# Maximum number of logged messages per rate_limit_interval. (integer value)
+#rate_limit_burst = 0
+
+# Log level name used by rate limiting: CRITICAL, ERROR, INFO, WARNING, DEBUG
+# or empty string. Logs with level greater or equal to rate_limit_except_level
+# are not filtered. An empty string means that all levels are filtered. (string
+# value)
+#rate_limit_except_level = CRITICAL
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+
+[agent]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# The number of seconds the agent will wait between polling for local device
+# changes. (integer value)
+#polling_interval = 2
+
+# Set new timeout in seconds for new rpc calls after agent receives SIGTERM. If
+# value is set to 0, rpc timeout won't be changed (integer value)
+#quitting_rpc_timeout = 10
+
+# Extensions list to use (list value)
+#extensions =
+
+
+[linux_bridge]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Comma-separated list of <physical_network>:<physical_interface> tuples
+# mapping physical network names to the agent's node-specific physical network
+# interfaces to be used for flat and VLAN networks. All physical networks
+# listed in network_vlan_ranges on the server should have mappings to
+# appropriate interfaces on each agent. (list value)
+#physical_interface_mappings =
+
+# List of <physical_network>:<physical_bridge> (list value)
+{% set bridge_mappings=[] %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
+{%- if bridge_mappings %}
+bridge_mappings = {{ ','.join(bridge_mappings) }}
+{%- else %}
+#bridge_mappings =
+{%- endif %}
+
+[vxlan]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 plugin
+# using linuxbridge mechanism driver (boolean value)
+{%- if "vxlan" in neutron.backend.tenant_network_types %}
+enable_vxlan = true
+{%- endif %}
+
+# TTL for vxlan interface protocol packets. (integer value)
+#ttl = <None>
+
+# TOS for vxlan interface protocol packets. (integer value)
+#tos = <None>
+
+# Multicast group(s) for vxlan interface. A range of group addresses may be
+# specified by using CIDR notation. Specifying a range allows different VNIs to
+# use different group addresses, reducing or eliminating spurious broadcast
+# traffic to the tunnel endpoints. To reserve a unique group for each possible
+# (24-bit) VNI, use a /8 such as 239.0.0.0/8. This setting must be the same on
+# all the agents. (string value)
+#vxlan_group = 224.0.0.1
+
+# IP address of local overlay (tunnel) network endpoint. Use either an IPv4 or
+# IPv6 address that resides on one of the host network interfaces. The IP
+# version of this value must match the value of the 'overlay_ip_version' option
+# in the ML2 plug-in configuration file on the neutron server node(s). (IP
+# address value)
+#local_ip = <None>
+local_ip = {{ neutron.local_ip }}
+
+# The minimum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_min = 0
+
+# The maximum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_max = 0
+
+# The UDP port used for VXLAN communication. By default, the Linux kernel
+# doesn't use the IANA assigned standard value, so if you want to use it, this
+# option must be set to 4789. It is not set by default because of backward
+# compatibiltiy. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_dstport = <None>
+
+# Extension to use alongside ml2 plugin's l2population mechanism driver. It
+# enables the plugin to populate VXLAN forwarding table. (boolean value)
+l2_population = True
+
+# Enable local ARP responder which provides local responses instead of
+# performing ARP broadcast into the overlay. Enabling local ARP responder is
+# not fully compatible with the allowed-address-pairs extension. (boolean
+# value)
+#arp_responder = false
+
+# Optional comma-separated list of <multicast address>:<vni_min>:<vni_max>
+# triples describing how to assign a multicast address to VXLAN according to
+# its VNI ID. (list value)
+#multicast_ranges =
+
+[securitygroup]
+
+#
+# From neutron.ml2.ovs.agent
+#
+
+# Driver for security groups firewall in the L2 agent (string value)
+#firewall_driver = <None>
+{%- if not neutron.get('security_groups_enabled', True) %}
+{%-   set _firewall_driver = 'noop' %}
+{%- else %}
+{%-   set _firewall_driver = 'iptables' %}
+{%- endif %}
+firewall_driver = {{ neutron.get('firewall_driver', _firewall_driver) }}
+
+# Controls whether the neutron security group API is enabled in the server. It
+# should be false when using no security groups or using the nova security
+# group API. (boolean value)
+#enable_security_group = true
+enable_security_group = {{ neutron.get('security_groups_enabled', True) }}
+
+# Use ipset to speed-up the iptables based security groups. Enabling ipset
+# support requires that ipset is installed on L2 agent node. (boolean value)
+#enable_ipset = true
diff --git a/neutron/files/mitaka/ml2_conf.ini b/neutron/files/mitaka/ml2_conf.ini
index c6a7f12..312ac66 100644
--- a/neutron/files/mitaka/ml2_conf.ini
+++ b/neutron/files/mitaka/ml2_conf.ini
@@ -224,6 +224,8 @@
 #firewall_driver = <None>
 {%- if server.dpdk %}
 firewall_driver = openvswitch
+{%- elif server.firewall_driver is defined %}
+firewall_driver = {{ server.firewall_driver }}
 {%- else %}
 firewall_driver = iptables_hybrid
 {%- endif %}
diff --git a/neutron/files/newton/l3_agent.ini b/neutron/files/newton/l3_agent.ini
index 56bf297..12d1c37 100644
--- a/neutron/files/newton/l3_agent.ini
+++ b/neutron/files/newton/l3_agent.ini
@@ -25,7 +25,11 @@
 
 # The driver used to manage the virtual interface. (string value)
 #interface_driver = <None>
+{%- if neutron.get('agents', {}).get('l3', {}).interface_driver is defined %}
+interface_driver = {{ neutron.agents.l3.interface_driver }}
+{%- else %}
 interface_driver = openvswitch
+{%- endif %}
 
 # Timeout in seconds for ovs-vsctl commands. If the timeout expires, ovs commands will fail with ALARMCLOCK error. (integer value)
 #ovs_vsctl_timeout = 10
diff --git a/neutron/files/newton/linuxbridge_agent.ini b/neutron/files/newton/linuxbridge_agent.ini
new file mode 100644
index 0000000..43532f4
--- /dev/null
+++ b/neutron/files/newton/linuxbridge_agent.ini
@@ -0,0 +1,265 @@
+{%- if pillar.neutron.gateway is defined %}
+{%- from "neutron/map.jinja" import gateway as neutron with context %}
+{%- else %}
+{%- from "neutron/map.jinja" import compute as neutron with context %}
+{%- endif %}
+
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of the default
+# INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+#debug = false
+
+# DEPRECATED: If set to false, the logging level will be set to WARNING instead
+# of the default INFO level. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+#verbose = true
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. Note that when logging
+# configuration files are used then all logging configuration is set in the
+# configuration file and other logging configuration options are ignored (for
+# example, logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set. (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to send logging output to. If no default is set,
+# logging will go to stderr as defined by use_stderr. This option is ignored if
+# log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative log_file  paths. This option
+# is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Uses logging handler designed to watch file system. When log file is moved or
+# removed this handler will open a new log file with specified path
+# instantaneously. It makes sense only if log_file option is specified and
+# Linux platform is used. This option is ignored if log_config_append is set.
+# (boolean value)
+#watch_log_file = false
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and will be
+# changed later to honor RFC5424. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_syslog = false
+
+# Enable journald for logging. If running in a systemd environment you may wish
+# to enable journal support. Doing so will use the journal native protocol
+# which includes structured metadata in addition to log messages.This option is
+# ignored if log_config_append is set. (boolean value)
+#use_journal = false
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. This option is ignored if log_config_append is
+# set. (boolean value)
+#use_stderr = false
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages when context is undefined. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Additional data to append to log message when logging level for the message
+# is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
+
+# List of package logging levels in logger=LEVEL pairs. This option is ignored
+# if log_config_append is set. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Interval, number of seconds, of log rate limiting. (integer value)
+#rate_limit_interval = 0
+
+# Maximum number of logged messages per rate_limit_interval. (integer value)
+#rate_limit_burst = 0
+
+# Log level name used by rate limiting: CRITICAL, ERROR, INFO, WARNING, DEBUG
+# or empty string. Logs with level greater or equal to rate_limit_except_level
+# are not filtered. An empty string means that all levels are filtered. (string
+# value)
+#rate_limit_except_level = CRITICAL
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+
+[agent]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# The number of seconds the agent will wait between polling for local device
+# changes. (integer value)
+#polling_interval = 2
+
+# Set new timeout in seconds for new rpc calls after agent receives SIGTERM. If
+# value is set to 0, rpc timeout won't be changed (integer value)
+#quitting_rpc_timeout = 10
+
+# Extensions list to use (list value)
+#extensions =
+
+
+[linux_bridge]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Comma-separated list of <physical_network>:<physical_interface> tuples
+# mapping physical network names to the agent's node-specific physical network
+# interfaces to be used for flat and VLAN networks. All physical networks
+# listed in network_vlan_ranges on the server should have mappings to
+# appropriate interfaces on each agent. (list value)
+#physical_interface_mappings =
+
+# List of <physical_network>:<physical_bridge> (list value)
+{% set bridge_mappings=[] %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
+{%- if bridge_mappings %}
+bridge_mappings = {{ ','.join(bridge_mappings) }}
+{%- else %}
+#bridge_mappings =
+{%- endif %}
+
+[vxlan]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 plugin
+# using linuxbridge mechanism driver (boolean value)
+{%- if "vxlan" in neutron.backend.tenant_network_types %}
+enable_vxlan = true
+{%- endif %}
+
+# TTL for vxlan interface protocol packets. (integer value)
+#ttl = <None>
+
+# TOS for vxlan interface protocol packets. (integer value)
+#tos = <None>
+
+# Multicast group(s) for vxlan interface. A range of group addresses may be
+# specified by using CIDR notation. Specifying a range allows different VNIs to
+# use different group addresses, reducing or eliminating spurious broadcast
+# traffic to the tunnel endpoints. To reserve a unique group for each possible
+# (24-bit) VNI, use a /8 such as 239.0.0.0/8. This setting must be the same on
+# all the agents. (string value)
+#vxlan_group = 224.0.0.1
+
+# IP address of local overlay (tunnel) network endpoint. Use either an IPv4 or
+# IPv6 address that resides on one of the host network interfaces. The IP
+# version of this value must match the value of the 'overlay_ip_version' option
+# in the ML2 plug-in configuration file on the neutron server node(s). (IP
+# address value)
+#local_ip = <None>
+local_ip = {{ neutron.local_ip }}
+
+# The minimum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_min = 0
+
+# The maximum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_max = 0
+
+# The UDP port used for VXLAN communication. By default, the Linux kernel
+# doesn't use the IANA assigned standard value, so if you want to use it, this
+# option must be set to 4789. It is not set by default because of backward
+# compatibiltiy. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_dstport = <None>
+
+# Extension to use alongside ml2 plugin's l2population mechanism driver. It
+# enables the plugin to populate VXLAN forwarding table. (boolean value)
+l2_population = True
+
+# Enable local ARP responder which provides local responses instead of
+# performing ARP broadcast into the overlay. Enabling local ARP responder is
+# not fully compatible with the allowed-address-pairs extension. (boolean
+# value)
+#arp_responder = false
+
+# Optional comma-separated list of <multicast address>:<vni_min>:<vni_max>
+# triples describing how to assign a multicast address to VXLAN according to
+# its VNI ID. (list value)
+#multicast_ranges =
+
+[securitygroup]
+
+#
+# From neutron.ml2.ovs.agent
+#
+
+# Driver for security groups firewall in the L2 agent (string value)
+#firewall_driver = <None>
+{%- if not neutron.get('security_groups_enabled', True) %}
+{%-   set _firewall_driver = 'noop' %}
+{%- else %}
+{%-   set _firewall_driver = 'iptables' %}
+{%- endif %}
+firewall_driver = {{ neutron.get('firewall_driver', _firewall_driver) }}
+
+# Controls whether the neutron security group API is enabled in the server. It
+# should be false when using no security groups or using the nova security
+# group API. (boolean value)
+#enable_security_group = true
+enable_security_group = {{ neutron.get('security_groups_enabled', True) }}
+
+# Use ipset to speed-up the iptables based security groups. Enabling ipset
+# support requires that ipset is installed on L2 agent node. (boolean value)
+#enable_ipset = true
diff --git a/neutron/files/newton/ml2_conf.ini b/neutron/files/newton/ml2_conf.ini
index c6a7f12..312ac66 100644
--- a/neutron/files/newton/ml2_conf.ini
+++ b/neutron/files/newton/ml2_conf.ini
@@ -224,6 +224,8 @@
 #firewall_driver = <None>
 {%- if server.dpdk %}
 firewall_driver = openvswitch
+{%- elif server.firewall_driver is defined %}
+firewall_driver = {{ server.firewall_driver }}
 {%- else %}
 firewall_driver = iptables_hybrid
 {%- endif %}
diff --git a/neutron/files/ocata/ContrailPlugin.ini b/neutron/files/ocata/ContrailPlugin.ini
index 2817f52..c66a4e3 100644
--- a/neutron/files/ocata/ContrailPlugin.ini
+++ b/neutron/files/ocata/ContrailPlugin.ini
@@ -7,7 +7,6 @@
 
 [KEYSTONE]
 auth_url = http://{{ server.identity.host }}:35357/v2.0
-admin_token = {{ server.backend.token }}
 admin_user={{ server.backend.user }}
 admin_password={{ server.backend.password }}
 admin_tenant_name={{ server.backend.tenant }}
\ No newline at end of file
diff --git a/neutron/files/ocata/l3_agent.ini b/neutron/files/ocata/l3_agent.ini
index 7b386a5..4c3c5cb 100644
--- a/neutron/files/ocata/l3_agent.ini
+++ b/neutron/files/ocata/l3_agent.ini
@@ -21,7 +21,11 @@
 
 # The driver used to manage the virtual interface. (string value)
 #interface_driver = <None>
+{%- if neutron.get('agents', {}).get('l3', {}).interface_driver is defined %}
+interface_driver = {{ neutron.agents.l3.interface_driver }}
+{%- else %}
 interface_driver = openvswitch
+{%- endif %}
 
 # Timeout in seconds for ovs-vsctl commands. If the timeout expires, ovs
 # commands will fail with ALARMCLOCK error. (integer value)
diff --git a/neutron/files/ocata/linuxbridge_agent.ini b/neutron/files/ocata/linuxbridge_agent.ini
new file mode 100644
index 0000000..43532f4
--- /dev/null
+++ b/neutron/files/ocata/linuxbridge_agent.ini
@@ -0,0 +1,265 @@
+{%- if pillar.neutron.gateway is defined %}
+{%- from "neutron/map.jinja" import gateway as neutron with context %}
+{%- else %}
+{%- from "neutron/map.jinja" import compute as neutron with context %}
+{%- endif %}
+
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of the default
+# INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+#debug = false
+
+# DEPRECATED: If set to false, the logging level will be set to WARNING instead
+# of the default INFO level. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+#verbose = true
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. Note that when logging
+# configuration files are used then all logging configuration is set in the
+# configuration file and other logging configuration options are ignored (for
+# example, logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set. (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to send logging output to. If no default is set,
+# logging will go to stderr as defined by use_stderr. This option is ignored if
+# log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative log_file  paths. This option
+# is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Uses logging handler designed to watch file system. When log file is moved or
+# removed this handler will open a new log file with specified path
+# instantaneously. It makes sense only if log_file option is specified and
+# Linux platform is used. This option is ignored if log_config_append is set.
+# (boolean value)
+#watch_log_file = false
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and will be
+# changed later to honor RFC5424. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_syslog = false
+
+# Enable journald for logging. If running in a systemd environment you may wish
+# to enable journal support. Doing so will use the journal native protocol
+# which includes structured metadata in addition to log messages.This option is
+# ignored if log_config_append is set. (boolean value)
+#use_journal = false
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. This option is ignored if log_config_append is
+# set. (boolean value)
+#use_stderr = false
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages when context is undefined. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Additional data to append to log message when logging level for the message
+# is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
+
+# List of package logging levels in logger=LEVEL pairs. This option is ignored
+# if log_config_append is set. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Interval, number of seconds, of log rate limiting. (integer value)
+#rate_limit_interval = 0
+
+# Maximum number of logged messages per rate_limit_interval. (integer value)
+#rate_limit_burst = 0
+
+# Log level name used by rate limiting: CRITICAL, ERROR, INFO, WARNING, DEBUG
+# or empty string. Logs with level greater or equal to rate_limit_except_level
+# are not filtered. An empty string means that all levels are filtered. (string
+# value)
+#rate_limit_except_level = CRITICAL
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+
+[agent]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# The number of seconds the agent will wait between polling for local device
+# changes. (integer value)
+#polling_interval = 2
+
+# Set new timeout in seconds for new rpc calls after agent receives SIGTERM. If
+# value is set to 0, rpc timeout won't be changed (integer value)
+#quitting_rpc_timeout = 10
+
+# Extensions list to use (list value)
+#extensions =
+
+
+[linux_bridge]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Comma-separated list of <physical_network>:<physical_interface> tuples
+# mapping physical network names to the agent's node-specific physical network
+# interfaces to be used for flat and VLAN networks. All physical networks
+# listed in network_vlan_ranges on the server should have mappings to
+# appropriate interfaces on each agent. (list value)
+#physical_interface_mappings =
+
+# List of <physical_network>:<physical_bridge> (list value)
+{% set bridge_mappings=[] %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
+{%- if bridge_mappings %}
+bridge_mappings = {{ ','.join(bridge_mappings) }}
+{%- else %}
+#bridge_mappings =
+{%- endif %}
+
+[vxlan]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 plugin
+# using linuxbridge mechanism driver (boolean value)
+{%- if "vxlan" in neutron.backend.tenant_network_types %}
+enable_vxlan = true
+{%- endif %}
+
+# TTL for vxlan interface protocol packets. (integer value)
+#ttl = <None>
+
+# TOS for vxlan interface protocol packets. (integer value)
+#tos = <None>
+
+# Multicast group(s) for vxlan interface. A range of group addresses may be
+# specified by using CIDR notation. Specifying a range allows different VNIs to
+# use different group addresses, reducing or eliminating spurious broadcast
+# traffic to the tunnel endpoints. To reserve a unique group for each possible
+# (24-bit) VNI, use a /8 such as 239.0.0.0/8. This setting must be the same on
+# all the agents. (string value)
+#vxlan_group = 224.0.0.1
+
+# IP address of local overlay (tunnel) network endpoint. Use either an IPv4 or
+# IPv6 address that resides on one of the host network interfaces. The IP
+# version of this value must match the value of the 'overlay_ip_version' option
+# in the ML2 plug-in configuration file on the neutron server node(s). (IP
+# address value)
+#local_ip = <None>
+local_ip = {{ neutron.local_ip }}
+
+# The minimum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_min = 0
+
+# The maximum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_max = 0
+
+# The UDP port used for VXLAN communication. By default, the Linux kernel
+# doesn't use the IANA assigned standard value, so if you want to use it, this
+# option must be set to 4789. It is not set by default because of backward
+# compatibiltiy. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_dstport = <None>
+
+# Extension to use alongside ml2 plugin's l2population mechanism driver. It
+# enables the plugin to populate VXLAN forwarding table. (boolean value)
+l2_population = True
+
+# Enable local ARP responder which provides local responses instead of
+# performing ARP broadcast into the overlay. Enabling local ARP responder is
+# not fully compatible with the allowed-address-pairs extension. (boolean
+# value)
+#arp_responder = false
+
+# Optional comma-separated list of <multicast address>:<vni_min>:<vni_max>
+# triples describing how to assign a multicast address to VXLAN according to
+# its VNI ID. (list value)
+#multicast_ranges =
+
+[securitygroup]
+
+#
+# From neutron.ml2.ovs.agent
+#
+
+# Driver for security groups firewall in the L2 agent (string value)
+#firewall_driver = <None>
+{%- if not neutron.get('security_groups_enabled', True) %}
+{%-   set _firewall_driver = 'noop' %}
+{%- else %}
+{%-   set _firewall_driver = 'iptables' %}
+{%- endif %}
+firewall_driver = {{ neutron.get('firewall_driver', _firewall_driver) }}
+
+# Controls whether the neutron security group API is enabled in the server. It
+# should be false when using no security groups or using the nova security
+# group API. (boolean value)
+#enable_security_group = true
+enable_security_group = {{ neutron.get('security_groups_enabled', True) }}
+
+# Use ipset to speed-up the iptables based security groups. Enabling ipset
+# support requires that ipset is installed on L2 agent node. (boolean value)
+#enable_ipset = true
diff --git a/neutron/files/ocata/ml2_conf.ini b/neutron/files/ocata/ml2_conf.ini
index 561f518..ab67788 100644
--- a/neutron/files/ocata/ml2_conf.ini
+++ b/neutron/files/ocata/ml2_conf.ini
@@ -281,7 +281,15 @@
 {%- set network_vlan_ranges = [] %}
 
 {%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
-{%- do network_vlan_ranges.append([physnet, params.get('vlan_range')]|join(":") if params.get('vlan_range', False) else physnet) if 'vlan' in params.get('types', ['vlan']) %}
+{%-   if 'vlan' in params.get('types', ['vlan']) %}
+{%-     if params.get('vlan_range', False) %}
+{%-       for vlan_range in params.get('vlan_range').split(',') %}
+{%-         do network_vlan_ranges.append([physnet, vlan_range]|join(":")) %}
+{%-       endfor %}
+{%-     else %}
+{%-       do network_vlan_ranges.append(physnet) %}
+{%-     endif %}
+{%-   endif %}
 {%- endfor %}
 
 {%- if not network_vlan_ranges %}
@@ -338,6 +346,9 @@
 {%- elif server.dpdk or server.get('vlan_aware_vms', False) %}
 firewall_driver = openvswitch
 enable_security_group = True
+{%- elif server.firewall_driver is defined %}
+firewall_driver = {{ server.firewall_driver }}
+enable_security_group = True
 {%- else %}
 firewall_driver = neutron.agent.linux.iptables_firewall.OVSHybridIptablesFirewallDriver
 enable_security_group = True
diff --git a/neutron/files/pike/ContrailPlugin.ini b/neutron/files/pike/ContrailPlugin.ini
index 2817f52..c66a4e3 100644
--- a/neutron/files/pike/ContrailPlugin.ini
+++ b/neutron/files/pike/ContrailPlugin.ini
@@ -7,7 +7,6 @@
 
 [KEYSTONE]
 auth_url = http://{{ server.identity.host }}:35357/v2.0
-admin_token = {{ server.backend.token }}
 admin_user={{ server.backend.user }}
 admin_password={{ server.backend.password }}
 admin_tenant_name={{ server.backend.tenant }}
\ No newline at end of file
diff --git a/neutron/files/pike/l3_agent.ini b/neutron/files/pike/l3_agent.ini
index 85ca1a9..a1e58bb 100644
--- a/neutron/files/pike/l3_agent.ini
+++ b/neutron/files/pike/l3_agent.ini
@@ -24,7 +24,11 @@
 
 # The driver used to manage the virtual interface. (string value)
 #interface_driver = <None>
+{%- if neutron.get('agents', {}).get('l3', {}).interface_driver is defined %}
+interface_driver = {{ neutron.agents.l3.interface_driver }}
+{%- else %}
 interface_driver = openvswitch
+{%- endif %}
 
 # Timeout in seconds for ovs-vsctl commands. If the timeout expires, ovs
 # commands will fail with ALARMCLOCK error. (integer value)
diff --git a/neutron/files/pike/linuxbridge_agent.ini b/neutron/files/pike/linuxbridge_agent.ini
new file mode 100644
index 0000000..43532f4
--- /dev/null
+++ b/neutron/files/pike/linuxbridge_agent.ini
@@ -0,0 +1,265 @@
+{%- if pillar.neutron.gateway is defined %}
+{%- from "neutron/map.jinja" import gateway as neutron with context %}
+{%- else %}
+{%- from "neutron/map.jinja" import compute as neutron with context %}
+{%- endif %}
+
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of the default
+# INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+#debug = false
+
+# DEPRECATED: If set to false, the logging level will be set to WARNING instead
+# of the default INFO level. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+#verbose = true
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. Note that when logging
+# configuration files are used then all logging configuration is set in the
+# configuration file and other logging configuration options are ignored (for
+# example, logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set. (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to send logging output to. If no default is set,
+# logging will go to stderr as defined by use_stderr. This option is ignored if
+# log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative log_file  paths. This option
+# is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Uses logging handler designed to watch file system. When log file is moved or
+# removed this handler will open a new log file with specified path
+# instantaneously. It makes sense only if log_file option is specified and
+# Linux platform is used. This option is ignored if log_config_append is set.
+# (boolean value)
+#watch_log_file = false
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and will be
+# changed later to honor RFC5424. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_syslog = false
+
+# Enable journald for logging. If running in a systemd environment you may wish
+# to enable journal support. Doing so will use the journal native protocol
+# which includes structured metadata in addition to log messages.This option is
+# ignored if log_config_append is set. (boolean value)
+#use_journal = false
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. This option is ignored if log_config_append is
+# set. (boolean value)
+#use_stderr = false
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages when context is undefined. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Additional data to append to log message when logging level for the message
+# is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
+
+# List of package logging levels in logger=LEVEL pairs. This option is ignored
+# if log_config_append is set. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Interval, number of seconds, of log rate limiting. (integer value)
+#rate_limit_interval = 0
+
+# Maximum number of logged messages per rate_limit_interval. (integer value)
+#rate_limit_burst = 0
+
+# Log level name used by rate limiting: CRITICAL, ERROR, INFO, WARNING, DEBUG
+# or empty string. Logs with level greater or equal to rate_limit_except_level
+# are not filtered. An empty string means that all levels are filtered. (string
+# value)
+#rate_limit_except_level = CRITICAL
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+
+[agent]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# The number of seconds the agent will wait between polling for local device
+# changes. (integer value)
+#polling_interval = 2
+
+# Set new timeout in seconds for new rpc calls after agent receives SIGTERM. If
+# value is set to 0, rpc timeout won't be changed (integer value)
+#quitting_rpc_timeout = 10
+
+# Extensions list to use (list value)
+#extensions =
+
+
+[linux_bridge]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Comma-separated list of <physical_network>:<physical_interface> tuples
+# mapping physical network names to the agent's node-specific physical network
+# interfaces to be used for flat and VLAN networks. All physical networks
+# listed in network_vlan_ranges on the server should have mappings to
+# appropriate interfaces on each agent. (list value)
+#physical_interface_mappings =
+
+# List of <physical_network>:<physical_bridge> (list value)
+{% set bridge_mappings=[] %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
+{%- if bridge_mappings %}
+bridge_mappings = {{ ','.join(bridge_mappings) }}
+{%- else %}
+#bridge_mappings =
+{%- endif %}
+
+[vxlan]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 plugin
+# using linuxbridge mechanism driver (boolean value)
+{%- if "vxlan" in neutron.backend.tenant_network_types %}
+enable_vxlan = true
+{%- endif %}
+
+# TTL for vxlan interface protocol packets. (integer value)
+#ttl = <None>
+
+# TOS for vxlan interface protocol packets. (integer value)
+#tos = <None>
+
+# Multicast group(s) for vxlan interface. A range of group addresses may be
+# specified by using CIDR notation. Specifying a range allows different VNIs to
+# use different group addresses, reducing or eliminating spurious broadcast
+# traffic to the tunnel endpoints. To reserve a unique group for each possible
+# (24-bit) VNI, use a /8 such as 239.0.0.0/8. This setting must be the same on
+# all the agents. (string value)
+#vxlan_group = 224.0.0.1
+
+# IP address of local overlay (tunnel) network endpoint. Use either an IPv4 or
+# IPv6 address that resides on one of the host network interfaces. The IP
+# version of this value must match the value of the 'overlay_ip_version' option
+# in the ML2 plug-in configuration file on the neutron server node(s). (IP
+# address value)
+#local_ip = <None>
+local_ip = {{ neutron.local_ip }}
+
+# The minimum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_min = 0
+
+# The maximum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_max = 0
+
+# The UDP port used for VXLAN communication. By default, the Linux kernel
+# doesn't use the IANA assigned standard value, so if you want to use it, this
+# option must be set to 4789. It is not set by default because of backward
+# compatibiltiy. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_dstport = <None>
+
+# Extension to use alongside ml2 plugin's l2population mechanism driver. It
+# enables the plugin to populate VXLAN forwarding table. (boolean value)
+l2_population = True
+
+# Enable local ARP responder which provides local responses instead of
+# performing ARP broadcast into the overlay. Enabling local ARP responder is
+# not fully compatible with the allowed-address-pairs extension. (boolean
+# value)
+#arp_responder = false
+
+# Optional comma-separated list of <multicast address>:<vni_min>:<vni_max>
+# triples describing how to assign a multicast address to VXLAN according to
+# its VNI ID. (list value)
+#multicast_ranges =
+
+[securitygroup]
+
+#
+# From neutron.ml2.ovs.agent
+#
+
+# Driver for security groups firewall in the L2 agent (string value)
+#firewall_driver = <None>
+{%- if not neutron.get('security_groups_enabled', True) %}
+{%-   set _firewall_driver = 'noop' %}
+{%- else %}
+{%-   set _firewall_driver = 'iptables' %}
+{%- endif %}
+firewall_driver = {{ neutron.get('firewall_driver', _firewall_driver) }}
+
+# Controls whether the neutron security group API is enabled in the server. It
+# should be false when using no security groups or using the nova security
+# group API. (boolean value)
+#enable_security_group = true
+enable_security_group = {{ neutron.get('security_groups_enabled', True) }}
+
+# Use ipset to speed-up the iptables based security groups. Enabling ipset
+# support requires that ipset is installed on L2 agent node. (boolean value)
+#enable_ipset = true
diff --git a/neutron/files/pike/ml2_conf.ini b/neutron/files/pike/ml2_conf.ini
index a953f0a..17818ee 100644
--- a/neutron/files/pike/ml2_conf.ini
+++ b/neutron/files/pike/ml2_conf.ini
@@ -284,7 +284,15 @@
 {%- set network_vlan_ranges = [] %}
 
 {%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
-{%- do network_vlan_ranges.append([physnet, params.get('vlan_range')]|join(":") if params.get('vlan_range', False) else physnet) if 'vlan' in params.get('types', ['vlan']) %}
+{%-   if 'vlan' in params.get('types', ['vlan']) %}
+{%-     if params.get('vlan_range', False) %}
+{%-       for vlan_range in params.get('vlan_range').split(',') %}
+{%-         do network_vlan_ranges.append([physnet, vlan_range]|join(":")) %}
+{%-       endfor %}
+{%-     else %}
+{%-       do network_vlan_ranges.append(physnet) %}
+{%-     endif %}
+{%-   endif %}
 {%- endfor %}
 
 {%- if not network_vlan_ranges %}
diff --git a/neutron/files/queens/ContrailPlugin.ini b/neutron/files/queens/ContrailPlugin.ini
index e00d234..d8739d1 100644
--- a/neutron/files/queens/ContrailPlugin.ini
+++ b/neutron/files/queens/ContrailPlugin.ini
@@ -7,7 +7,6 @@
 
 [KEYSTONE]
 auth_url = http://{{ server.identity.host }}:5000
-admin_token = {{ server.backend.token }}
 admin_user={{ server.backend.user }}
 admin_password={{ server.backend.password }}
 admin_tenant_name={{ server.backend.tenant }}
\ No newline at end of file
diff --git a/neutron/files/queens/l3_agent.ini b/neutron/files/queens/l3_agent.ini
index b3fcdfa..b6f1960 100644
--- a/neutron/files/queens/l3_agent.ini
+++ b/neutron/files/queens/l3_agent.ini
@@ -24,7 +24,11 @@
 
 # The driver used to manage the virtual interface. (string value)
 #interface_driver = <None>
+{%- if neutron.get('agents', {}).get('l3', {}).interface_driver is defined %}
+interface_driver = {{ neutron.agents.l3.interface_driver }}
+{%- else %}
 interface_driver = openvswitch
+{%- endif %}
 
 #
 # From neutron.l3.agent
diff --git a/neutron/files/queens/linuxbridge_agent.ini b/neutron/files/queens/linuxbridge_agent.ini
new file mode 100644
index 0000000..ceeb868
--- /dev/null
+++ b/neutron/files/queens/linuxbridge_agent.ini
@@ -0,0 +1,292 @@
+{%- if pillar.neutron.gateway is defined %}
+{%- from "neutron/map.jinja" import gateway as neutron with context %}
+{%- else %}
+{%- from "neutron/map.jinja" import compute as neutron with context %}
+{%- endif %}
+
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of the default
+# INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+#debug = false
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. Note that when logging
+# configuration files are used then all logging configuration is set in the
+# configuration file and other logging configuration options are ignored (for
+# example, logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set. (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to send logging output to. If no default is set,
+# logging will go to stderr as defined by use_stderr. This option is ignored if
+# log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative log_file  paths. This option
+# is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Uses logging handler designed to watch file system. When log file is moved or
+# removed this handler will open a new log file with specified path
+# instantaneously. It makes sense only if log_file option is specified and
+# Linux platform is used. This option is ignored if log_config_append is set.
+# (boolean value)
+#watch_log_file = false
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and will be
+# changed later to honor RFC5424. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_syslog = false
+
+# Enable journald for logging. If running in a systemd environment you may wish
+# to enable journal support. Doing so will use the journal native protocol
+# which includes structured metadata in addition to log messages.This option is
+# ignored if log_config_append is set. (boolean value)
+#use_journal = false
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+#syslog_log_facility = LOG_USER
+
+# Use JSON formatting for logging. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_json = false
+
+# Log output to standard error. This option is ignored if log_config_append is
+# set. (boolean value)
+#use_stderr = false
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages when context is undefined. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Additional data to append to log message when logging level for the message
+# is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
+
+# List of package logging levels in logger=LEVEL pairs. This option is ignored
+# if log_config_append is set. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,oslo_messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Interval, number of seconds, of log rate limiting. (integer value)
+#rate_limit_interval = 0
+
+# Maximum number of logged messages per rate_limit_interval. (integer value)
+#rate_limit_burst = 0
+
+# Log level name used by rate limiting: CRITICAL, ERROR, INFO, WARNING, DEBUG
+# or empty string. Logs with level greater or equal to rate_limit_except_level
+# are not filtered. An empty string means that all levels are filtered. (string
+# value)
+#rate_limit_except_level = CRITICAL
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+
+[agent]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# The number of seconds the agent will wait between polling for local device
+# changes. (integer value)
+#polling_interval = 2
+
+# Set new timeout in seconds for new rpc calls after agent receives SIGTERM. If
+# value is set to 0, rpc timeout won't be changed (integer value)
+#quitting_rpc_timeout = 10
+
+# The DSCP value to use for outer headers during tunnel encapsulation. (integer
+# value)
+# Minimum value: 0
+# Maximum value: 63
+#dscp = <None>
+
+# If set to True, the DSCP value of tunnel interfaces is overwritten and set to
+# inherit. The DSCP value of the inner header is then copied to the outer
+# header. (boolean value)
+#dscp_inherit = false
+# Extensions list to use (list value)
+#extensions =
+
+
+[linux_bridge]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Comma-separated list of <physical_network>:<physical_interface> tuples
+# mapping physical network names to the agent's node-specific physical network
+# interfaces to be used for flat and VLAN networks. All physical networks
+# listed in network_vlan_ranges on the server should have mappings to
+# appropriate interfaces on each agent. (list value)
+#physical_interface_mappings =
+
+# List of <physical_network>:<physical_bridge> (list value)
+{% set bridge_mappings=[] %}
+{%- if neutron.bridge_mappings is defined %}
+{%- for physnet,bridge in neutron.bridge_mappings.iteritems() %}{%- do bridge_mappings.append(physnet+':'+bridge) %}{%- endfor %}
+{%- endif %}
+{%- if 'br-floating' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('external_access', True) %}
+{%- do bridge_mappings.append('physnet1:br-floating') %}{%- endif %}{%- endif %}
+{%- if 'br-prv' not in neutron.get('bridge_mappings', {}).values() %}{%- if "vlan" in neutron.backend.tenant_network_types %}
+{%- do bridge_mappings.append('physnet2:br-prv') %}{%- endif %}{%- endif %}
+{%- if 'br-baremetal' not in neutron.get('bridge_mappings', {}).values() %}{%- if neutron.get('ironic_enabled', False) %}
+{%- do bridge_mappings.append('physnet3:br-baremetal') %}{%- endif %}{%- endif %}
+{%- if bridge_mappings %}
+bridge_mappings = {{ ','.join(bridge_mappings) }}
+{%- else %}
+#bridge_mappings =
+{%- endif %}
+
+
+[network_log]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Maximum packets logging per second. (integer value)
+# Minimum value: 100
+#rate_limit = 100
+
+# Maximum number of packets per rate_limit. (integer value)
+# Minimum value: 25
+#burst_limit = 25
+
+# Output logfile path on agent side, default syslog file. (string value)
+#local_output_log_base = <None>
+
+
+[vxlan]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Enable VXLAN on the agent. Can be enabled when agent is managed by ml2 plugin
+# using linuxbridge mechanism driver (boolean value)
+{%- if "vxlan" in neutron.backend.tenant_network_types %}
+enable_vxlan = true
+{%- endif %}
+
+# TTL for vxlan interface protocol packets. (integer value)
+#ttl = <None>
+
+# TOS for vxlan interface protocol packets. (integer value)
+#tos = <None>
+
+# Multicast group(s) for vxlan interface. A range of group addresses may be
+# specified by using CIDR notation. Specifying a range allows different VNIs to
+# use different group addresses, reducing or eliminating spurious broadcast
+# traffic to the tunnel endpoints. To reserve a unique group for each possible
+# (24-bit) VNI, use a /8 such as 239.0.0.0/8. This setting must be the same on
+# all the agents. (string value)
+#vxlan_group = 224.0.0.1
+
+# IP address of local overlay (tunnel) network endpoint. Use either an IPv4 or
+# IPv6 address that resides on one of the host network interfaces. The IP
+# version of this value must match the value of the 'overlay_ip_version' option
+# in the ML2 plug-in configuration file on the neutron server node(s). (IP
+# address value)
+#local_ip = <None>
+local_ip = {{ neutron.local_ip }}
+
+# The minimum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_min = 0
+
+# The maximum of the UDP source port range used for VXLAN communication. (port
+# value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_srcport_max = 0
+
+# The UDP port used for VXLAN communication. By default, the Linux kernel
+# doesn't use the IANA assigned standard value, so if you want to use it, this
+# option must be set to 4789. It is not set by default because of backward
+# compatibiltiy. (port value)
+# Minimum value: 0
+# Maximum value: 65535
+#udp_dstport = <None>
+
+# Extension to use alongside ml2 plugin's l2population mechanism driver. It
+# enables the plugin to populate VXLAN forwarding table. (boolean value)
+l2_population = True
+
+# Enable local ARP responder which provides local responses instead of
+# performing ARP broadcast into the overlay. Enabling local ARP responder is
+# not fully compatible with the allowed-address-pairs extension. (boolean
+# value)
+#arp_responder = false
+
+# Optional comma-separated list of <multicast address>:<vni_min>:<vni_max>
+# triples describing how to assign a multicast address to VXLAN according to
+# its VNI ID. (list value)
+#multicast_ranges =
+
+[securitygroup]
+
+#
+# From neutron.ml2.linuxbridge.agent
+#
+
+# Driver for security groups firewall in the L2 agent (string value)
+#firewall_driver = <None>
+{%- if not neutron.get('security_groups_enabled', True) %}
+{%-   set _firewall_driver = 'noop' %}
+{%- else %}
+{%-   set _firewall_driver = 'iptables' %}
+{%- endif %}
+firewall_driver = {{ neutron.get('firewall_driver', _firewall_driver) }}
+
+# Controls whether the neutron security group API is enabled in the server. It
+# should be false when using no security groups or using the nova security
+# group API. (boolean value)
+#enable_security_group = true
+enable_security_group = {{ neutron.get('security_groups_enabled', True) }}
+
+# Use ipset to speed-up the iptables based security groups. Enabling ipset
+# support requires that ipset is installed on L2 agent node. (boolean value)
+#enable_ipset = true
diff --git a/neutron/files/queens/ml2_conf.ini b/neutron/files/queens/ml2_conf.ini
index 6f0ee0d..bb2f126 100644
--- a/neutron/files/queens/ml2_conf.ini
+++ b/neutron/files/queens/ml2_conf.ini
@@ -181,7 +181,15 @@
 {%- set network_vlan_ranges = [] %}
 
 {%- for physnet, params in server.backend.get('physnets', {}).iteritems() %}
-{%- do network_vlan_ranges.append([physnet, params.get('vlan_range')]|join(":") if params.get('vlan_range', False) else physnet) if 'vlan' in params.get('types', ['vlan']) %}
+{%-   if 'vlan' in params.get('types', ['vlan']) %}
+{%-     if params.get('vlan_range', False) %}
+{%-       for vlan_range in params.get('vlan_range').split(',') %}
+{%-         do network_vlan_ranges.append([physnet, vlan_range]|join(":")) %}
+{%-       endfor %}
+{%-     else %}
+{%-       do network_vlan_ranges.append(physnet) %}
+{%-     endif %}
+{%-   endif %}
 {%- endfor %}
 
 {%- if not network_vlan_ranges %}
diff --git a/neutron/files/queens/neutron-generic.conf b/neutron/files/queens/neutron-generic.conf
index 4eef1a4..30fa7a8 100644
--- a/neutron/files/queens/neutron-generic.conf
+++ b/neutron/files/queens/neutron-generic.conf
@@ -420,6 +420,9 @@
 {%- set _data = neutron.identity %}
 {%- if 'cacert_file' not in _data.keys() %}{% do _data.update({'cacert_file': neutron.cacert_file}) %}{% endif %}
 {%- set auth_type = _data.get('auth_type', 'password') %}
+{%- if neutron.get('cache',{}).members is defined and 'cache' not in _data.keys() %}
+{% do _data.update({'cache': neutron.cache}) %}
+{%- endif %}
 {%- include "oslo_templates/files/queens/keystonemiddleware/_auth_token.conf" %}
 {%- include "oslo_templates/files/queens/keystoneauth/_type_" + auth_type + ".conf" %}
 {%- endif %}
diff --git a/neutron/files/queens/neutron-server.conf b/neutron/files/queens/neutron-server.conf
index f20ac88..e057afd 100644
--- a/neutron/files/queens/neutron-server.conf
+++ b/neutron/files/queens/neutron-server.conf
@@ -458,6 +458,9 @@
 {%- set _data = server.identity %}
 {%- if 'cacert_file' not in _data.keys() %}{% do _data.update({'cacert_file': server.cacert_file}) %}{% endif %}
 {%- set auth_type = _data.get('auth_type', 'password') %}
+{%- if server.get('cache',{}).members is defined and 'cache' not in _data.keys() %}
+{% do _data.update({'cache': server.cache}) %}
+{%- endif %}
 {%- include "oslo_templates/files/queens/keystonemiddleware/_auth_token.conf" %}
 {%- include "oslo_templates/files/queens/keystoneauth/_type_" + auth_type + ".conf" %}
 
diff --git a/neutron/files/queens/sriov_agent.ini b/neutron/files/queens/sriov_agent.ini
new file mode 100644
index 0000000..734c7bd
--- /dev/null
+++ b/neutron/files/queens/sriov_agent.ini
@@ -0,0 +1,165 @@
+{%- if pillar.neutron.gateway is defined %}
+{%- from "neutron/map.jinja" import gateway as neutron with context %}
+{%- else %}
+{%- from "neutron/map.jinja" import compute as neutron with context %}
+{%- endif %}
+[DEFAULT]
+
+#
+# From oslo.log
+#
+
+# If set to true, the logging level will be set to DEBUG instead of the default
+# INFO level. (boolean value)
+# Note: This option can be changed without restarting.
+#debug = false
+
+# DEPRECATED: If set to false, the logging level will be set to WARNING instead
+# of the default INFO level. (boolean value)
+# This option is deprecated for removal.
+# Its value may be silently ignored in the future.
+#verbose = true
+
+# The name of a logging configuration file. This file is appended to any
+# existing logging configuration files. For details about logging configuration
+# files, see the Python logging module documentation. Note that when logging
+# configuration files are used then all logging configuration is set in the
+# configuration file and other logging configuration options are ignored (for
+# example, logging_context_format_string). (string value)
+# Note: This option can be changed without restarting.
+# Deprecated group/name - [DEFAULT]/log_config
+#log_config_append = <None>
+
+# Defines the format string for %%(asctime)s in log records. Default:
+# %(default)s . This option is ignored if log_config_append is set. (string
+# value)
+#log_date_format = %Y-%m-%d %H:%M:%S
+
+# (Optional) Name of log file to send logging output to. If no default is set,
+# logging will go to stderr as defined by use_stderr. This option is ignored if
+# log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logfile
+#log_file = <None>
+
+# (Optional) The base directory used for relative log_file  paths. This option
+# is ignored if log_config_append is set. (string value)
+# Deprecated group/name - [DEFAULT]/logdir
+#log_dir = <None>
+
+# Uses logging handler designed to watch file system. When log file is moved or
+# removed this handler will open a new log file with specified path
+# instantaneously. It makes sense only if log_file option is specified and
+# Linux platform is used. This option is ignored if log_config_append is set.
+# (boolean value)
+#watch_log_file = false
+
+# Use syslog for logging. Existing syslog format is DEPRECATED and will be
+# changed later to honor RFC5424. This option is ignored if log_config_append
+# is set. (boolean value)
+#use_syslog = false
+
+# Syslog facility to receive log lines. This option is ignored if
+# log_config_append is set. (string value)
+#syslog_log_facility = LOG_USER
+
+# Log output to standard error. This option is ignored if log_config_append is
+# set. (boolean value)
+#use_stderr = false
+
+# Format string to use for log messages with context. (string value)
+#logging_context_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [%(request_id)s %(user_identity)s] %(instance)s%(message)s
+
+# Format string to use for log messages when context is undefined. (string
+# value)
+#logging_default_format_string = %(asctime)s.%(msecs)03d %(process)d %(levelname)s %(name)s [-] %(instance)s%(message)s
+
+# Additional data to append to log message when logging level for the message
+# is DEBUG. (string value)
+#logging_debug_format_suffix = %(funcName)s %(pathname)s:%(lineno)d
+
+# Prefix each line of exception output with this format. (string value)
+#logging_exception_prefix = %(asctime)s.%(msecs)03d %(process)d ERROR %(name)s %(instance)s
+
+# Defines the format string for %(user_identity)s that is used in
+# logging_context_format_string. (string value)
+#logging_user_identity_format = %(user)s %(tenant)s %(domain)s %(user_domain)s %(project_domain)s
+
+# List of package logging levels in logger=LEVEL pairs. This option is ignored
+# if log_config_append is set. (list value)
+#default_log_levels = amqp=WARN,amqplib=WARN,boto=WARN,qpid=WARN,sqlalchemy=WARN,suds=INFO,oslo.messaging=INFO,iso8601=WARN,requests.packages.urllib3.connectionpool=WARN,urllib3.connectionpool=WARN,websocket=WARN,requests.packages.urllib3.util.retry=WARN,urllib3.util.retry=WARN,keystonemiddleware=WARN,routes.middleware=WARN,stevedore=WARN,taskflow=WARN,keystoneauth=WARN,oslo.cache=INFO,dogpile.core.dogpile=INFO
+
+# Enables or disables publication of error events. (boolean value)
+#publish_errors = false
+
+# The format for an instance that is passed with the log message. (string
+# value)
+#instance_format = "[instance: %(uuid)s] "
+
+# The format for an instance UUID that is passed with the log message. (string
+# value)
+#instance_uuid_format = "[instance: %(uuid)s] "
+
+# Interval, number of seconds, of log rate limiting. (integer value)
+#rate_limit_interval = 0
+
+# Maximum number of logged messages per rate_limit_interval. (integer value)
+#rate_limit_burst = 0
+
+# Log level name used by rate limiting: CRITICAL, ERROR, INFO, WARNING, DEBUG
+# or empty string. Logs with level greater or equal to rate_limit_except_level
+# are not filtered. An empty string means that all levels are filtered. (string
+# value)
+#rate_limit_except_level = CRITICAL
+
+# Enables or disables fatal status of deprecations. (boolean value)
+#fatal_deprecations = false
+
+
+[agent]
+
+#
+# From neutron.ml2.sriov.agent
+#
+
+# Extensions list to use (list value)
+{# Get neutron:backend:extension mapping and prepare tmp_ext_list list with extentions where enabled = True #}
+{%- set tmp_ext_list = [] %}
+
+{%- for ext_name, ext_params in neutron.backend.get('sriov_extension', {}).iteritems() %}
+{%- do tmp_ext_list.append(ext_name) if ext_params.get('enabled', False)  %}
+{%- endfor %}
+
+{%- for ext_name, ext_params in neutron.backend.get('extension', {}).iteritems() %}
+{%- do tmp_ext_list.append(ext_name) if ext_params.get('enabled', False) and ext_name != 'bagpipe_bgpvpn' and ext_name not in tmp_ext_list %}
+{%- endfor %}
+{# Below section is for backward compatible when extentions were separated properties without neutron:backend:extension pillar #}
+{%- do tmp_ext_list.append('qos') if neutron.get('qos', 'True') and 'qos' not in tmp_ext_list %}
+extensions={{ tmp_ext_list|join(',') }}
+
+
+[sriov_nic]
+
+#
+# From neutron.ml2.sriov.agent
+#
+
+# Comma-separated list of <physical_network>:<network_device> tuples mapping
+# physical network names to the agent's node-specific physical network device
+# interfaces of SR-IOV physical function to be used for VLAN networks. All
+# physical networks listed in network_vlan_ranges on the server should have
+# mappings to appropriate interfaces on each agent. (list value)
+#physical_device_mappings =
+physical_device_mappings = {%- for nic_name, sriov in neutron.backend.sriov.iteritems() %}{{ sriov.physical_network }}:{{ sriov.devname }}{% if not loop.last %},{% endif %}{%- endfor %}
+
+# Comma-separated list of <network_device>:<vfs_to_exclude> tuples, mapping
+# network_device to the agent's node-specific list of virtual functions that
+# should not be used for virtual networking. vfs_to_exclude is a semicolon-
+# separated list of virtual functions to exclude from network_device. The
+# network_device in the mapping should appear in the physical_device_mappings
+# list. (list value)
+#exclude_devices =
+
+{%- if pillar.neutron.compute is defined %}
+[securitygroup]
+firewall_driver = neutron.agent.firewall.NoopFirewallDriver
+{%- endif %}
diff --git a/neutron/gateway.sls b/neutron/gateway.sls
index a605722..61b4372 100644
--- a/neutron/gateway.sls
+++ b/neutron/gateway.sls
@@ -56,14 +56,31 @@
   - require:
     - pkg: neutron_gateway_packages
 
-/etc/neutron/plugins/ml2/openvswitch_agent.ini:
+{%- if gateway.backend.get('mechanism', {}).get('lb', {}).get('driver', {}) == "linuxbridge" %}
+
+neutron_plugins_ml2_linuxbridge_agent_ini:
   file.managed:
+  - name: /etc/neutron/plugins/ml2/linuxbridge_agent.ini
+  - source: salt://neutron/files/{{ gateway.version }}/linuxbridge_agent.ini
+  - mode: 0640
+  - group: neutron
+  - template: jinja
+  - require:
+    - pkg: neutron_gateway_packages
+
+{%- else %}
+
+neutron_plugins_ml2_openvswitch_agent_ini:
+  file.managed:
+  - name: /etc/neutron/plugins/ml2/openvswitch_agent.ini
   - source: salt://neutron/files/{{ gateway.version }}/openvswitch_agent.ini
   - mode: 0640
   - group: neutron
   - template: jinja
   - require:
     - pkg: neutron_gateway_packages
+
+{%- endif %}
 {%- endif %}
 
 /etc/neutron/dhcp_agent.ini:
@@ -162,8 +179,12 @@
     - file: /etc/neutron/dhcp_agent.ini
     {%- if gateway.opendaylight is not defined %}
     - file: /etc/neutron/l3_agent.ini
+    {%- if gateway.backend.get('mechanism', {}).get('lb', {}).get('driver', {}) == "linuxbridge" %}
+    - file: /etc/neutron/plugins/ml2/linuxbridge_agent.ini
+    {%- else %}
     - file: /etc/neutron/plugins/ml2/openvswitch_agent.ini
     {%- endif %}
+    {%- endif %}
     {%- if fwaas.get('enabled', False) %}
     - file: /etc/neutron/fwaas_driver.ini
     {%- endif %}
diff --git a/neutron/map.jinja b/neutron/map.jinja
index 8070183..78e2867 100644
--- a/neutron/map.jinja
+++ b/neutron/map.jinja
@@ -11,15 +11,24 @@
 {%- if pillar.neutron.compute is defined and pillar.neutron.compute.metadata is defined %}
 {%- do compute_pkgs_ovn.extend(['neutron-common', 'python-networking-ovn', 'haproxy']) %}
 {%- endif %}
+{%- set linuxbridge_enabled = pillar.neutron.compute is defined and pillar.neutron.compute.get('backend', {}).get('mechanism', {}).get('lb', {}).get('driver', {}) == "linuxbridge" %}
+{%- if linuxbridge_enabled %}
+{%- set pkgs_cmp = ['neutron-linuxbridge-agent'] %}
+{%- set services_cmp = ['neutron-linuxbridge-agent'] %}
+{%- else %}
+{%- set pkgs_cmp = ['neutron-openvswitch-agent', 'python-pycadf'] %}
+{%- set services_cmp = ['neutron-openvswitch-agent'] %}
 {%- endif %}
+{%- endif %}
+
 
 {% set compute = salt['grains.filter_by']({
     'BaseDefaults': default_params,
     'Debian': {
-        'pkgs': ['neutron-openvswitch-agent', 'python-pycadf'],
+        'pkgs': pkgs_cmp,
         'pkgs_ovn': compute_pkgs_ovn,
         'pkgs_bagpipe': ['python-networking-bagpipe'],
-        'services': ['neutron-openvswitch-agent'],
+        'services': services_cmp,
         'services_ovn': ['ovn-host'],
         'dpdk': false,
         'notification': {},
@@ -60,9 +69,13 @@
 }, merge=pillar.neutron.get('compute', {}), base='BaseDefaults') %}
 
 {%- set opendaylight_enabled = pillar.neutron.gateway is defined and pillar.neutron.gateway.opendaylight is defined %}
+{%- set linuxbridge_enabled = pillar.neutron.gateway is defined and pillar.neutron.gateway.get('backend', {}).get('mechanism', {}).get('lb', {}).get('driver', {}) == "linuxbridge" %}
 {%- set pkgs_list = ['neutron-dhcp-agent', 'neutron-metadata-agent'] %}
 {%- set services_list = ['neutron-metadata-agent', 'neutron-dhcp-agent'] %}
-{%- if not opendaylight_enabled %}
+{%- if linuxbridge_enabled %}
+{%- do pkgs_list.extend(['neutron-linuxbridge-agent', 'neutron-l3-agent']) %}
+{%- do services_list.extend(['neutron-linuxbridge-agent', 'neutron-l3-agent']) %}
+{%- elif not opendaylight_enabled %}
 {%- do pkgs_list.extend(['neutron-openvswitch-agent', 'neutron-l3-agent']) %}
 {%- do services_list.extend(['neutron-openvswitch-agent', 'neutron-l3-agent']) %}
 {%- endif %}
diff --git a/neutron/ml2_ovs/init.sls b/neutron/ml2_ovs/init.sls
index 19b5379..28fa379 100644
--- a/neutron/ml2_ovs/init.sls
+++ b/neutron/ml2_ovs/init.sls
@@ -108,21 +108,43 @@
 
     {% endif %}
 
-/etc/neutron/plugins/ml2/openvswitch_agent.ini:
+{%- if compute.backend.get('mechanism', {}).get('lb', {}).get('driver', {}) == "linuxbridge" %}
+
+neutron_plugins_ml2_linuxbridge_agent_ini:
   file.managed:
-  - source: salt://neutron/files/{{ compute.version }}/openvswitch_agent.ini
+  - name: /etc/neutron/plugins/ml2/linuxbridge_agent.ini
+  - source: salt://neutron/files/{{ compute.version }}/linuxbridge_agent.ini
+  - mode: 0640
+  - group: neutron
   - template: jinja
   - require:
     - pkg: neutron_compute_packages
 
+{%- else %}
+
+neutron_plugins_ml2_openvswitch_agent_ini:
+  file.managed:
+  - name: /etc/neutron/plugins/ml2/openvswitch_agent.ini
+  - source: salt://neutron/files/{{ compute.version }}/openvswitch_agent.ini
+  - mode: 0640
+  - group: neutron
+  - template: jinja
+  - require:
+    - pkg: neutron_compute_packages
+
+{%- endif %}
+
 neutron_compute_services:
   service.running:
   - names: {{ compute.services }}
   - enable: true
   - watch:
     - file: /etc/neutron/neutron.conf
+    {%- if compute.backend.get('mechanism', {}).get('lb', {}).get('driver', {}) == "linuxbridge" %}
+    - file: /etc/neutron/plugins/ml2/linuxbridge_agent.ini
+    {%- else %}
     - file: /etc/neutron/plugins/ml2/openvswitch_agent.ini
-
+    {%- endif %}
     {%- set neutron_compute_services_list = compute.services %}
     {%- if compute.backend.sriov is defined %}
       {%- do neutron_compute_services_list.append('neutron-sriov-agent') %}
diff --git a/neutron/upgrade/pkgs_latest.sls b/neutron/upgrade/pkgs_latest.sls
index 6023128..afa31c0 100644
--- a/neutron/upgrade/pkgs_latest.sls
+++ b/neutron/upgrade/pkgs_latest.sls
@@ -33,7 +33,13 @@
     {%- do npkgs.append('python-vmware-nsx') %}
   {%- endif %}
   {% if server.get('bgp_vpn', {}).get('enabled', False) %}
-    {%- do npkgs.extend(server.pkgs_bagpipe) %}
+    {%- do npkgs.extend(server.pkgs_bgpvpn) %}
+    {% if server.bgp_vpn.driver == "bagpipe" %}
+      {%- do npkgs.extend(server.pkgs_bagpipe) %}
+    {%- endif %}
+  {%- endif %}
+  {% if server.get('l2gw', {}).get('enabled', False) %}
+    {%- do npkgs.extend(server.pkgs_l2gw) %}
   {%- endif %}
   {%- if fwaas.get('enabled', False) %}
     {%- do npkgs.extend(fwaas.pkgs) %}
@@ -41,9 +47,15 @@
 {%- endif %}
 {%- if gateway.enabled is defined and gateway.enabled %}
   {%- do npkgs.extend(gateway.pkgs) %}
+  {% if gateway.get('l2gw', {}).get('enabled', False) %}
+    {%- do npkgs.extend(gateway.pkgs_l2gw_agent) %}
+  {%- endif %}
 {%- endif %}
 {%- if compute.enabled is defined and compute.enabled %}
   {%- do npkgs.extend(compute.pkgs) %}
+  {% if compute.get('bgp_vpn', {}).get('enabled', False) and compute.bgp_vpn.driver == "bagpipe" %}
+    {%- do npkgs.extend(compute.pkgs_bagpipe) %}
+  {%- endif %}
 {%- endif %}
 {%- if client.enabled is defined and client.enabled %}
   {%- do npkgs.extend(client.pkgs) %}
diff --git a/neutron/upgrade/render_config.sls b/neutron/upgrade/render_config.sls
index 1f5acaa..77bc673 100644
--- a/neutron/upgrade/render_config.sls
+++ b/neutron/upgrade/render_config.sls
@@ -34,6 +34,9 @@
                              ['/etc/neutron/plugins/ml2/openvswitch_agent.ini', "salt://neutron/files/" + gateway.version + "/openvswitch_agent.ini"],
                              ['/etc/neutron/dhcp_agent.ini', "salt://neutron/files/" + gateway.version + "/dhcp_agent.ini"],
                              ['/etc/neutron/metadata_agent.ini',"salt://neutron/files/" + gateway.version + "/metadata_agent.ini"]]) %}
+  {%- if gateway.get('l2gw', {}).get('enabled', False) %}
+    {%- do conf_mapping.append(['/etc/neutron/l2gateway_agent.ini', "salt://neutron/files/" + gateway.version + "/l2gw/l2gateway_agent.ini"]) %}
+  {%- endif %}
 {%- elif compute.enabled %}
   {% if compute.get('bgp_vpn', {}).get('enabled', False) and server.bgp_vpn.driver == "bagpipe" %}
     {%- do conf_mapping.append(['/etc/bagpipe-bgp/bgp.conf', "salt://neutron/files/" + compute.version + "/bagpipe-bgp.conf"]) %}
diff --git a/neutron/upgrade/service_running.sls b/neutron/upgrade/service_running.sls
index d2ac334..1be3502 100644
--- a/neutron/upgrade/service_running.sls
+++ b/neutron/upgrade/service_running.sls
@@ -14,6 +14,9 @@
 {%- endif %}
 {%- if gateway.enabled is defined and gateway.enabled%}
   {%- do nservices.extend(gateway.services) %}
+  {% if gateway.get('l2gw', {}).get('enabled', False) %}
+    {%- do nservices.append('neutron-l2gateway-agent') %}
+  {%- endif %}
 {%- endif %}
 {%- if compute.enabled is defined and compute.enabled%}
   {%- do nservices.extend(compute.services) %}
@@ -26,6 +29,9 @@
   {% if compute.backend.sriov is defined %}
     {%- do nservices.append('neutron-sriov-agent') %}
   {%- endif %}
+  {% if compute.get('bgp_vpn', {}).get('enabled', False) and compute.bgp_vpn.driver == "bagpipe" %}
+    {%- do nservices.append('bagpipe-bgp') %}
+  {%- endif %}
 {%- endif %}
 
 {%- for nservice in nservices|unique %}
diff --git a/neutron/upgrade/service_stopped.sls b/neutron/upgrade/service_stopped.sls
index 6e33e5c..1709382 100644
--- a/neutron/upgrade/service_stopped.sls
+++ b/neutron/upgrade/service_stopped.sls
@@ -14,6 +14,9 @@
 {%- endif %}
 {%- if gateway.enabled is defined and gateway.enabled %}
   {%- do nservices.extend(gateway.services) %}
+  {% if gateway.get('l2gw', {}).get('enabled', False) %}
+    {%- do nservices.append('neutron-l2gateway-agent') %}
+  {%- endif %}
 {%- endif %}
 {%- if compute.enabled is defined and compute.enabled %}
   {%- do nservices.extend(compute.services) %}
@@ -26,6 +29,9 @@
   {% if compute.backend.sriov is defined %}
     {%- do nservices.append('neutron-sriov-agent') %}
   {%- endif %}
+  {% if compute.get('bgp_vpn', {}).get('enabled', False) and compute.bgp_vpn.driver == "bagpipe" %}
+    {%- do nservices.append('bagpipe-bgp') %}
+  {%- endif %}
 {%- endif %}
 
 
diff --git a/neutron/upgrade/upgrade/init.sls b/neutron/upgrade/upgrade/init.sls
index 4ca8dea..9a58255 100644
--- a/neutron/upgrade/upgrade/init.sls
+++ b/neutron/upgrade/upgrade/init.sls
@@ -5,7 +5,6 @@
     - text: "Running neutron.upgrade.upgrade"
 
 include:
- - neutron.upgrade.upgrade.pre
  - neutron.upgrade.service_stopped
  - neutron.upgrade.pkgs_latest
  - neutron.upgrade.render_config
@@ -13,4 +12,3 @@
  - neutron.db.offline_sync
 {%- endif %}
  - neutron.upgrade.service_running
- - neutron.upgrade.upgrade.post
diff --git a/tests/pillar/compute_linuxbridge.sls b/tests/pillar/compute_linuxbridge.sls
new file mode 100644
index 0000000..5c29787
--- /dev/null
+++ b/tests/pillar/compute_linuxbridge.sls
@@ -0,0 +1,26 @@
+neutron:
+  compute:
+    agent_mode: legacy
+    firewall_driver: iptables
+    backend:
+      engine: ml2
+      tenant_network_types: "flat,vxlan"
+      mechanism:
+        lb:
+          driver: linuxbridge
+    dvr: false
+    enabled: true
+    external_access: false
+    local_ip: 10.1.0.105
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      password: workshop
+      port: 5672
+      user: openstack
+      virtual_host: /openstack
+    metadata:
+      host: 127.0.0.1
+      password: password
+      workers: 2
+    version: mitaka
diff --git a/tests/pillar/compute_ovn.sls b/tests/pillar/compute_ovn.sls
index 487faa3..f3fbaf1 100644
--- a/tests/pillar/compute_ovn.sls
+++ b/tests/pillar/compute_ovn.sls
@@ -13,11 +13,4 @@
       ovsdb_server_iface: ptcp:6640:127.0.0.1
       host: 10.1.0.101
       password: unsegreto
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_queens:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/queens/xenial queens main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/queens/xenial/archive-mcpqueens.key"
+
diff --git a/tests/pillar/control_bgpvpn.sls b/tests/pillar/control_bgpvpn.sls
index d7b4d16..b8926fd 100644
--- a/tests/pillar/control_bgpvpn.sls
+++ b/tests/pillar/control_bgpvpn.sls
@@ -7,11 +7,3 @@
     bgp_vpn:
       enabled: true
       driver: bagpipe
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_pike:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/pike/xenial pike main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/pike/xenial/archive-mcppike.key"
\ No newline at end of file
diff --git a/tests/pillar/control_l2gw.sls b/tests/pillar/control_l2gw.sls
index b1c2065..30e5b72 100644
--- a/tests/pillar/control_l2gw.sls
+++ b/tests/pillar/control_l2gw.sls
@@ -53,12 +53,4 @@
       'create_network:shared':
     version: pike
     l2gw:
-      enabled: true
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_pike:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/pike/xenial pike main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/pike/xenial/archive-mcppike.key"
+      enabled: true
\ No newline at end of file
diff --git a/tests/pillar/control_linuxbridge.sls b/tests/pillar/control_linuxbridge.sls
new file mode 100644
index 0000000..8bc35b6
--- /dev/null
+++ b/tests/pillar/control_linuxbridge.sls
@@ -0,0 +1,54 @@
+neutron:
+  server:
+    api_workers: 2
+    rpc_workers: 2
+    rpc_state_report_workers: 2
+    backend:
+      engine: ml2
+      external_mtu: 1500
+      mechanism:
+        lb:
+          driver: linuxbridge
+      tenant_network_types: flat,vxlan
+    bind:
+      address: 172.16.10.101
+      port: 9696
+    compute:
+      host: 127.0.0.1
+      password: workshop
+      region: RegionOne
+      tenant: service
+      user: nova
+    database:
+      engine: mysql
+      host: 127.0.0.1
+      name: neutron
+      password: workshop
+      port: 3306
+      user: neutron
+    dns_domain: novalocal
+    dvr: false
+    enabled: true
+    global_physnet_mtu: 1500
+    identity:
+      engine: keystone
+      host: 127.0.0.1
+      password: workshop
+      port: 35357
+      region: RegionOne
+      tenant: service
+      user: neutron
+      endpoint_type: internal
+    l3_ha: True
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      password: workshop
+      port: 5672
+      user: openstack
+      virtual_host: /openstack
+    version: mitaka
+    policy:
+      create_subnet: 'rule:admin_or_network_owner'
+      'get_network:queue_id': 'rule:admin_only'
+      'create_network:shared':
diff --git a/tests/pillar/control_opendaylight.sls b/tests/pillar/control_opendaylight.sls
index 76a4c90..86310e9 100644
--- a/tests/pillar/control_opendaylight.sls
+++ b/tests/pillar/control_opendaylight.sls
@@ -61,11 +61,3 @@
         ovs:
           driver: opendaylight
           order: 77
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_pike:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/pike/xenial pike main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/pike/xenial/archive-mcppike.key"
diff --git a/tests/pillar/control_ovn.sls b/tests/pillar/control_ovn.sls
index f5348fa..e891cb4 100644
--- a/tests/pillar/control_ovn.sls
+++ b/tests/pillar/control_ovn.sls
@@ -57,11 +57,3 @@
       db-nb-create-insecure-remote: 'yes'
       db-sb-create-insecure-remote: 'yes'
 
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_queens:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/queens/xenial queens main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/queens/xenial/archive-mcpqueens.key"
diff --git a/tests/pillar/control_sfc.sls b/tests/pillar/control_sfc.sls
index 81a4bc2..c460274 100644
--- a/tests/pillar/control_sfc.sls
+++ b/tests/pillar/control_sfc.sls
@@ -10,12 +10,3 @@
         - ovs
       flow_classifier_drivers:
         - ovs
-
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_queens:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/queens/xenial queens main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/queens/xenial/archive-mcpqueens.key"
diff --git a/tests/pillar/control_single.sls b/tests/pillar/control_single.sls
index f6fb4e2..75113f5 100644
--- a/tests/pillar/control_single.sls
+++ b/tests/pillar/control_single.sls
@@ -25,7 +25,7 @@
             - flat
         sriov_net:
           mtu: 9000 # Optional, defaults to 1500
-          vlan_range: '100:200' # Optional
+          vlan_range: '100:200,300:400' # Optional
           types:
             - vlan
         ext_net2:
diff --git a/tests/pillar/gateway_legacy_l2gw.sls b/tests/pillar/gateway_legacy_l2gw.sls
index d3cd4a8..df45399 100644
--- a/tests/pillar/gateway_legacy_l2gw.sls
+++ b/tests/pillar/gateway_legacy_l2gw.sls
@@ -27,11 +27,4 @@
       enabled: true
       ovsdb_hosts:
         ovsdbx: 10.164.5.33:6632
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_pike:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/pike/xenial pike main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/pike/xenial/archive-mcppike.key"
+
diff --git a/tests/pillar/gateway_legacy_opendaylight.sls b/tests/pillar/gateway_legacy_opendaylight.sls
index 2f43676..948955b 100644
--- a/tests/pillar/gateway_legacy_opendaylight.sls
+++ b/tests/pillar/gateway_legacy_opendaylight.sls
@@ -31,11 +31,3 @@
       ovsdb_odl_iface: tcp:127.0.0.1:6640
       tunnel_ip: 10.1.0.110
       provider_mappings: physnet1:br-floating
-linux:
-  system:
-    enabled: true
-    repo:
-      mirantis_openstack_pike:
-        source: "deb http://mirror.fuel-infra.org/mcp-repos/pike/xenial pike main"
-        architectures: amd64
-        key_url: "http://mirror.fuel-infra.org/mcp-repos/pike/xenial/archive-mcppike.key"
diff --git a/tests/pillar/gateway_linuxbridge.sls b/tests/pillar/gateway_linuxbridge.sls
new file mode 100644
index 0000000..4cbac35
--- /dev/null
+++ b/tests/pillar/gateway_linuxbridge.sls
@@ -0,0 +1,32 @@
+neutron:
+  gateway:
+    agent_mode: legacy
+    dhcp_lease_duration: 86400
+    firewall_driver: iptables
+    backend:
+      engine: ml2
+      tenant_network_types: "flat,vxlan"
+      mechanism:
+        ovs:
+          driver: openvswitch
+    dvr: false
+    enabled: true
+    external_access: True
+    local_ip: 10.1.0.110
+    message_queue:
+      engine: rabbitmq
+      host: 127.0.0.1
+      password: workshop
+      port: 5672
+      user: openstack
+      virtual_host: /openstack
+    metadata:
+      host: 127.0.0.1
+      password: password
+      workers: 2
+    version: mitaka
+    agents:
+      dhcp:
+        interface_driver: linuxbridge
+      l3:
+        interface_driver: linuxbridge
diff --git a/tests/pillar/repo_mitaka.sls b/tests/pillar/repo_mitaka.sls
new file mode 100644
index 0000000..625210a
--- /dev/null
+++ b/tests/pillar/repo_mitaka.sls
@@ -0,0 +1,8 @@
+linux:
+  system:
+    enabled: true
+    repo:
+      mirantis_openstack:
+        source: "deb http://mirror.fuel-infra.org/mcp-repos/mitaka/xenial/ mitaka main"
+        architectures: amd64
+        key_url: "http://mirror.fuel-infra.org/mcp-repos/mitaka/xenial/archive-mcpmitaka.key"
\ No newline at end of file
diff --git a/tests/pillar/repo_newton.sls b/tests/pillar/repo_newton.sls
new file mode 100644
index 0000000..e11cb18
--- /dev/null
+++ b/tests/pillar/repo_newton.sls
@@ -0,0 +1,8 @@
+linux:
+  system:
+    enabled: true
+    repo:
+      mirantis_openstack:
+        source: "deb http://mirror.fuel-infra.org/mcp-repos/newton/xenial/ newton main"
+        architectures: amd64
+        key_url: "http://mirror.fuel-infra.org/mcp-repos/newton/xenial/archive-mcpnewton.key"
\ No newline at end of file
diff --git a/tests/pillar/repo_ocata.sls b/tests/pillar/repo_ocata.sls
new file mode 100644
index 0000000..41d42d1
--- /dev/null
+++ b/tests/pillar/repo_ocata.sls
@@ -0,0 +1,8 @@
+linux:
+  system:
+    enabled: true
+    repo:
+      mirantis_openstack:
+        source: "deb http://mirror.fuel-infra.org/mcp-repos/ocata/xenial ocata main"
+        architectures: amd64
+        key_url: "http://mirror.fuel-infra.org/mcp-repos/ocata/xenial/archive-mcpocata.key"
\ No newline at end of file
diff --git a/tests/pillar/repo_pike.sls b/tests/pillar/repo_pike.sls
new file mode 100644
index 0000000..bc006ea
--- /dev/null
+++ b/tests/pillar/repo_pike.sls
@@ -0,0 +1,8 @@
+linux:
+  system:
+    enabled: true
+    repo:
+      mirantis_openstack_repo:
+        source: "deb http://mirror.mirantis.com/stable/openstack-pike/xenial xenial main"
+        architectures: amd64
+        key_url: "http://mirror.mirantis.com/stable/openstack-pike/xenial/archive-pike.key"
diff --git a/tests/pillar/repo_queens.sls b/tests/pillar/repo_queens.sls
new file mode 100644
index 0000000..46f7bd9
--- /dev/null
+++ b/tests/pillar/repo_queens.sls
@@ -0,0 +1,8 @@
+linux:
+  system:
+    enabled: true
+    repo:
+      mirantis_openstack_queens:
+        source: "deb http://mirror.mirantis.com/stable/openstack-queens/xenial xenial main"
+        architectures: amd64
+        key_url: "http://mirror.mirantis.com/stable/openstack-queens/xenial/archive-queens.key"
\ No newline at end of file