Merge "Preserve floating IP address in FloatingIpMultipleRoutersTest"
diff --git a/.zuul.yaml b/.zuul.yaml
deleted file mode 100644
index 4496ef7..0000000
--- a/.zuul.yaml
+++ /dev/null
@@ -1,1650 +0,0 @@
-- job:
-    name: neutron-tempest-plugin
-    parent: devstack-tempest
-    abstract: true
-    description: |
-      Perform setup common to all Neutron tempest tests
-    roles:
-      - zuul: openstack/devstack
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - openstack/neutron-tempest-plugin
-      - openstack/tempest
-    vars:
-      tempest_concurrency: 4
-      tox_envlist: all
-      network_api_extensions_common: &api_extensions_master
-        - address-scope
-        - agent
-        - allowed-address-pairs
-        - auto-allocated-topology
-        - availability_zone
-        - binding
-        - default-subnetpools
-        - dhcp_agent_scheduler
-        - dns-domain-ports
-        - dns-integration
-        - empty-string-filtering
-        - expose-port-forwarding-in-fip
-        - expose-l3-conntrack-helper
-        - ext-gw-mode
-        - external-net
-        - extra_dhcp_opt
-        - extraroute
-        - extraroute-atomic
-        - filter-validation
-        - fip-port-details
-        - flavors
-        - floating-ip-port-forwarding
-        - floatingip-pools
-        - ip-substring-filtering
-        - l3-conntrack-helper
-        - l3-flavors
-        - l3-ha
-        - l3_agent_scheduler
-        - logging
-        - metering
-        - multi-provider
-        - net-mtu
-        - net-mtu-writable
-        - network-ip-availability
-        - network_availability_zone
-        - network-segment-range
-        - pagination
-        - port-resource-request
-        - port-mac-address-regenerate
-        - port-security
-        - port-security-groups-filtering
-        - project-id
-        - provider
-        - qos
-        - qos-bw-minimum-ingress
-        - qos-fip
-        - quotas
-        - quota_details
-        - rbac-address-scope
-        - rbac-policies
-        - rbac-security-groups
-        - rbac-subnetpool
-        - router
-        - router-admin-state-down-before-update
-        - router_availability_zone
-        - security-group
-        - segment
-        - service-type
-        - sorting
-        - standard-attr-description
-        - standard-attr-revisions
-        - standard-attr-segment
-        - standard-attr-tag
-        - standard-attr-timestamp
-        - subnet_allocation
-        - subnet-dns-publish-fixed-ip
-        - subnetpool-prefix-ops
-        - tag-ports-during-bulk-creation
-        - trunk
-        - trunk-details
-        - uplink-status-propagation
-      network_api_extensions_tempest:
-        - dvr
-      devstack_localrc:
-        USE_PYTHON3: true
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
-      devstack_plugins:
-        neutron: https://opendev.org/openstack/neutron.git
-        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
-      tempest_plugins:
-        - neutron-tempest-plugin
-      devstack_services:
-        tls-proxy: false
-        tempest: true
-        neutron-dns: true
-        neutron-qos: true
-        neutron-segments: true
-        neutron-trunk: true
-        neutron-uplink-status-propagation: true
-        neutron-network-segment-range: true
-        neutron-port-forwarding: true
-        neutron-conntrack-helper: true
-        neutron-tag-ports-during-bulk-creation: true
-      devstack_local_conf:
-        post-config:
-          $NEUTRON_CONF:
-            QUOTAS:
-              quota_router: 100
-              quota_floatingip: 500
-              quota_security_group: 150
-              quota_security_group_rule: 1000
-          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-          # devstack-tempest job will be switched to use lib/neutron instead of
-          # lib/neutron-legacy
-          /$NEUTRON_CORE_PLUGIN_CONF:
-            ml2:
-              type_drivers: flat,geneve,vlan,gre,local,vxlan
-            ml2_type_vlan:
-              network_vlan_ranges: foo:1:10
-            ml2_type_vxlan:
-              vni_ranges: 1:2000
-            ml2_type_gre:
-              tunnel_id_ranges: 1:1000
-          $NEUTRON_L3_CONF:
-            agent:
-              availability_zone: nova
-          $NEUTRON_DHCP_CONF:
-            agent:
-              availability_zone: nova
-          /etc/neutron/api-paste.ini:
-            composite:neutronapi_v2_0:
-              use: call:neutron.auth:pipeline_factory
-              noauth: cors request_id catch_errors osprofiler extensions neutronapiapp_v2_0
-              keystone: cors request_id catch_errors osprofiler authtoken keystonecontext extensions neutronapiapp_v2_0
-        test-config:
-          $TEMPEST_CONFIG:
-            neutron_plugin_options:
-              provider_vlans: foo,
-              agent_availability_zone: nova
-              image_is_advanced: true
-              available_type_drivers: flat,geneve,vlan,gre,local,vxlan
-              provider_net_base_segm_id: 1
-    irrelevant-files: &tempest-irrelevant-files
-      - ^(test-|)requirements.txt$
-      - ^releasenotes/.*$
-      - ^doc/.*$
-      - ^setup.cfg$
-      - ^.*\.rst$
-      - ^neutron/locale/.*$
-      - ^neutron/tests/unit/.*$
-      - ^tools/.*$
-      - ^tox.ini$
-
-- job:
-    name: neutron-tempest-plugin-api
-    parent: neutron-tempest-plugin
-    vars:
-      tempest_test_regex: ^neutron_tempest_plugin\.api
-      devstack_services:
-        neutron-log: true
-      devstack_local_conf:
-        post-config:
-          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-          # devstack-tempest job will be switched to use lib/neutron instead of
-          # lib/neutron-legacy
-          /$NEUTRON_CORE_PLUGIN_CONF:
-            AGENT:
-              tunnel_types: gre,vxlan
-            network_log:
-              local_output_log_base: /tmp/test_log.log
-
-- job:
-    name: neutron-tempest-plugin-api-queens
-    nodeset: openstack-single-node-xenial
-    parent: neutron-tempest-plugin-api
-    override-checkout: stable/queens
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - name: openstack/neutron-tempest-plugin
-        override-checkout: 0.3.0
-      - openstack/tempest
-    vars:
-      branch_override: stable/queens
-      # TODO(slaweq): find a way to put this list of extensions in
-      # neutron repository and keep it different per branch,
-      # then it could be removed from here
-      network_api_extensions_common: &api_extensions_queens
-        - address-scope
-        - agent
-        - allowed-address-pairs
-        - auto-allocated-topology
-        - availability_zone
-        - binding
-        - default-subnetpools
-        - dhcp_agent_scheduler
-        - dns-domain-ports
-        - dns-integration
-        - ext-gw-mode
-        - external-net
-        - extra_dhcp_opt
-        - extraroute
-        - flavors
-        - ip-substring-filtering
-        - l3-flavors
-        - l3-ha
-        - l3_agent_scheduler
-        - logging
-        - metering
-        - multi-provider
-        - net-mtu
-        - net-mtu-writable
-        - network-ip-availability
-        - network_availability_zone
-        - pagination
-        - port-security
-        - project-id
-        - provider
-        - qos
-        - qos-fip
-        - quotas
-        - quota_details
-        - rbac-policies
-        - router
-        - router_availability_zone
-        - security-group
-        - segment
-        - service-type
-        - sorting
-        - standard-attr-description
-        - standard-attr-revisions
-        - standard-attr-timestamp
-        - standard-attr-tag
-        - subnet_allocation
-        - trunk
-        - trunk-details
-      network_api_extensions_tempest:
-        - dvr
-      devstack_localrc:
-        USE_PYTHON3: false
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-
-- job:
-    name: neutron-tempest-plugin-api-rocky
-    nodeset: openstack-single-node-xenial
-    parent: neutron-tempest-plugin-api
-    description: |
-      This job run on py2 for stable/rocky gate.
-    override-checkout: stable/rocky
-    required-projects: &required-projects-rocky
-      - openstack/devstack-gate
-      - openstack/neutron
-      - name: openstack/neutron-tempest-plugin
-        override-checkout: 0.9.0
-      - openstack/tempest
-    vars: &api_vars_rocky
-      branch_override: stable/rocky
-      # TODO(slaweq): find a way to put this list of extensions in
-      # neutron repository and keep it different per branch,
-      # then it could be removed from here
-      network_api_extensions_common: &api_extensions_rocky
-        - address-scope
-        - agent
-        - allowed-address-pairs
-        - auto-allocated-topology
-        - availability_zone
-        - binding
-        - default-subnetpools
-        - dhcp_agent_scheduler
-        - dns-domain-ports
-        - dns-integration
-        - empty-string-filtering
-        - expose-port-forwarding-in-fip
-        - ext-gw-mode
-        - external-net
-        - extra_dhcp_opt
-        - extraroute
-        - fip-port-details
-        - flavors
-        - floating-ip-port-forwarding
-        - ip-substring-filtering
-        - l3-flavors
-        - l3-ha
-        - l3_agent_scheduler
-        - logging
-        - metering
-        - multi-provider
-        - net-mtu
-        - net-mtu-writable
-        - network-ip-availability
-        - network_availability_zone
-        - pagination
-        - port-mac-address-regenerate
-        - port-security
-        - port-security-groups-filtering
-        - project-id
-        - provider
-        - qos
-        - qos-fip
-        - quotas
-        - quota_details
-        - rbac-policies
-        - router
-        - router_availability_zone
-        - security-group
-        - segment
-        - service-type
-        - sorting
-        - standard-attr-description
-        - standard-attr-revisions
-        - standard-attr-segment
-        - standard-attr-timestamp
-        - standard-attr-tag
-        - subnet_allocation
-        - trunk
-        - trunk-details
-      network_api_extensions_tempest:
-        - dvr
-      devstack_localrc:
-        USE_PYTHON3: false
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-    # NOTE(gmann): This job run on py2 for stable/rocky gate.
-    branches:
-      - stable/rocky
-
-
-- job:
-    name: neutron-tempest-plugin-api-rocky
-    nodeset: openstack-single-node-xenial
-    parent: neutron-tempest-plugin-api
-    description: |
-      This job run on py3 for other than stable/rocky gate
-      which is nothing but neutron-tempest-pluign master gate.
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars:
-      <<: *api_vars_rocky
-      devstack_localrc:
-        USE_PYTHON3: True
-    branches: ^(?!stable/rocky).*$
-
-- job:
-    name: neutron-tempest-plugin-api-stein
-    parent: neutron-tempest-plugin-api
-    override-checkout: stable/stein
-    vars:
-      branch_override: stable/stein
-      # TODO(slaweq): find a way to put this list of extensions in
-      # neutron repository and keep it different per branch,
-      # then it could be removed from here
-      network_api_extensions_common: &api_extensions_stein
-        - address-scope
-        - agent
-        - allowed-address-pairs
-        - auto-allocated-topology
-        - availability_zone
-        - binding
-        - default-subnetpools
-        - dhcp_agent_scheduler
-        - dns-domain-ports
-        - dns-integration
-        - empty-string-filtering
-        - expose-port-forwarding-in-fip
-        - ext-gw-mode
-        - external-net
-        - extra_dhcp_opt
-        - extraroute
-        - filter-validation
-        - fip-port-details
-        - flavors
-        - floatingip-pools
-        - floating-ip-port-forwarding
-        - ip-substring-filtering
-        - l3-flavors
-        - l3-ha
-        - l3_agent_scheduler
-        - logging
-        - metering
-        - multi-provider
-        - net-mtu
-        - net-mtu-writable
-        - network-ip-availability
-        - network_availability_zone
-        - network-segment-range
-        - pagination
-        - port-resource-request
-        - port-mac-address-regenerate
-        - port-security
-        - port-security-groups-filtering
-        - project-id
-        - provider
-        - qos
-        - qos-bw-minimum-ingress
-        - qos-fip
-        - quotas
-        - quota_details
-        - rbac-policies
-        - rbac-security-groups
-        - router
-        - router_availability_zone
-        - security-group
-        - segment
-        - service-type
-        - sorting
-        - standard-attr-description
-        - standard-attr-revisions
-        - standard-attr-segment
-        - standard-attr-tag
-        - standard-attr-timestamp
-        - subnet_allocation
-        - trunk
-        - trunk-details
-        - uplink-status-propagation
-      network_api_extensions_tempest:
-        - dvr
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-api-train
-    parent: neutron-tempest-plugin-api
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      # TODO(slaweq): find a way to put this list of extensions in
-      # neutron repository and keep it different per branch,
-      # then it could be removed from here
-      network_api_extensions_common: &api_extensions_train
-        - address-scope
-        - agent
-        - allowed-address-pairs
-        - auto-allocated-topology
-        - availability_zone
-        - binding
-        - default-subnetpools
-        - dhcp_agent_scheduler
-        - dns-domain-ports
-        - dns-integration
-        - empty-string-filtering
-        - expose-port-forwarding-in-fip
-        - expose-l3-conntrack-helper
-        - ext-gw-mode
-        - external-net
-        - extra_dhcp_opt
-        - extraroute
-        - extraroute-atomic
-        - filter-validation
-        - fip-port-details
-        - flavors
-        - floating-ip-port-forwarding
-        - floatingip-pools
-        - ip-substring-filtering
-        - l3-conntrack-helper
-        - l3-flavors
-        - l3-ha
-        - l3_agent_scheduler
-        - logging
-        - metering
-        - multi-provider
-        - net-mtu
-        - net-mtu-writable
-        - network-ip-availability
-        - network_availability_zone
-        - network-segment-range
-        - pagination
-        - port-resource-request
-        - port-mac-address-regenerate
-        - port-security
-        - port-security-groups-filtering
-        - project-id
-        - provider
-        - qos
-        - qos-bw-minimum-ingress
-        - qos-fip
-        - quotas
-        - quota_details
-        - rbac-policies
-        - rbac-security-groups
-        - router
-        - router-admin-state-down-before-update
-        - router_availability_zone
-        - security-group
-        - segment
-        - service-type
-        - sorting
-        - standard-attr-description
-        - standard-attr-revisions
-        - standard-attr-segment
-        - standard-attr-tag
-        - standard-attr-timestamp
-        - subnet_allocation
-        - subnetpool-prefix-ops
-        - trunk
-        - trunk-details
-        - uplink-status-propagation
-      network_api_extensions_tempest:
-        - dvr
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-api-ussuri
-    parent: neutron-tempest-plugin-api
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      # TODO(slaweq): find a way to put this list of extensions in
-      # neutron repository and keep it different per branch,
-      # then it could be removed from here
-      network_api_extensions_common: &api_extensions_ussuri
-        - address-scope
-        - agent
-        - allowed-address-pairs
-        - auto-allocated-topology
-        - availability_zone
-        - binding
-        - default-subnetpools
-        - dhcp_agent_scheduler
-        - dns-domain-ports
-        - dns-integration
-        - empty-string-filtering
-        - expose-port-forwarding-in-fip
-        - expose-l3-conntrack-helper
-        - ext-gw-mode
-        - external-net
-        - extra_dhcp_opt
-        - extraroute
-        - extraroute-atomic
-        - filter-validation
-        - fip-port-details
-        - flavors
-        - floating-ip-port-forwarding
-        - floatingip-pools
-        - ip-substring-filtering
-        - l3-conntrack-helper
-        - l3-flavors
-        - l3-ha
-        - l3_agent_scheduler
-        - logging
-        - metering
-        - multi-provider
-        - net-mtu
-        - net-mtu-writable
-        - network-ip-availability
-        - network_availability_zone
-        - network-segment-range
-        - pagination
-        - port-resource-request
-        - port-mac-address-regenerate
-        - port-security
-        - port-security-groups-filtering
-        - project-id
-        - provider
-        - qos
-        - qos-bw-minimum-ingress
-        - qos-fip
-        - quotas
-        - quota_details
-        - rbac-address-scope
-        - rbac-policies
-        - rbac-security-groups
-        - rbac-subnetpool
-        - router
-        - router-admin-state-down-before-update
-        - router_availability_zone
-        - security-group
-        - segment
-        - service-type
-        - sorting
-        - standard-attr-description
-        - standard-attr-revisions
-        - standard-attr-segment
-        - standard-attr-tag
-        - standard-attr-timestamp
-        - subnet_allocation
-        - subnet-dns-publish-fixed-ip
-        - subnetpool-prefix-ops
-        - tag-ports-during-bulk-creation
-        - trunk
-        - trunk-details
-        - uplink-status-propagation
-      network_api_extensions_tempest:
-        - dvr
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario
-    parent: neutron-tempest-plugin
-    abstract: true
-    description: |
-      Perform setup common to all tempest scenario test jobs.
-    vars:
-      # NOTE(slaweq): in case of some tests, which requires advanced image,
-      # default test timeout set to 1200 seconds may be not enough if job is
-      # run on slow node
-      tempest_test_timeout: 2400
-      tempest_test_regex: ^neutron_tempest_plugin\.scenario
-      devstack_localrc:
-        PHYSICAL_NETWORK: default
-        IMAGE_URLS: https://cloud-images.ubuntu.com/releases/xenial/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img
-        ADVANCED_IMAGE_NAME: ubuntu-16.04-server-cloudimg-amd64-disk1
-        ADVANCED_INSTANCE_TYPE: ds512M
-        ADVANCED_INSTANCE_USER: ubuntu
-        BUILD_TIMEOUT: 784
-      devstack_services:
-        cinder: true
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch
-    parent: neutron-tempest-plugin-scenario
-    timeout: 10000
-    vars:
-      network_api_extensions: *api_extensions_master
-      devstack_localrc:
-        Q_AGENT: openvswitch
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-      devstack_local_conf:
-        post-config:
-          $NEUTRON_CONF:
-            DEFAULT:
-              enable_dvr: false
-          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-          # devstack-tempest job will be switched to use lib/neutron instead of
-          # lib/neutron-legacy
-          /$NEUTRON_CORE_PLUGIN_CONF:
-            agent:
-              tunnel_types: vxlan,gre
-            ovs:
-              tunnel_bridge: br-tun
-              bridge_mappings: public:br-ex
-        test-config:
-          $TEMPEST_CONFIG:
-            neutron_plugin_options:
-              available_type_drivers: flat,vlan,local,vxlan
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-queens
-    parent: neutron-tempest-plugin-scenario-openvswitch
-    nodeset: openstack-single-node-xenial
-    override-checkout: stable/queens
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - name: openstack/neutron-tempest-plugin
-        override-checkout: 0.3.0
-      - openstack/tempest
-    vars:
-      branch_override: stable/queens
-      network_api_extensions: *api_extensions_queens
-      # TODO(slaweq): remove trunks subport_connectivity test from blacklist
-      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
-      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
-      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)|\
-          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
-      devstack_localrc:
-        USE_PYTHON3: false
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-rocky
-    parent: neutron-tempest-plugin-scenario-openvswitch
-    description: |
-      This job run on py2 for stable/rocky gate.
-    nodeset: openstack-single-node-xenial
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars: &scenario_vars_rocky
-      branch_override: stable/rocky
-      network_api_extensions: *api_extensions_rocky
-      devstack_localrc:
-        USE_PYTHON3: false
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-      # NOTE(bcafarel): newer tests, unstable on rocky branch
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
-          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
-    branches:
-      - stable/rocky
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-rocky
-    parent: neutron-tempest-plugin-scenario-openvswitch
-    nodeset: openstack-single-node-xenial
-    description: |
-      This job run on py3 for other than stable/rocky gate
-      which is nothing but neutron-tempest-pluign master gate.
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars:
-      <<: *scenario_vars_rocky
-      devstack_localrc:
-        USE_PYTHON3: True
-    branches: ^(?!stable/rocky).*$
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-stein
-    parent: neutron-tempest-plugin-scenario-openvswitch
-    override-checkout: stable/stein
-    vars:
-      branch_override: stable/stein
-      network_api_extensions: *api_extensions_stein
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-train
-    parent: neutron-tempest-plugin-scenario-openvswitch
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      network_api_extensions: *api_extensions_train
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-ussuri
-    parent: neutron-tempest-plugin-scenario-openvswitch
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions: *api_extensions_ussuri
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-    parent: neutron-tempest-plugin-scenario
-    timeout: 10000
-    vars:
-      network_api_extensions: *api_extensions_master
-      # TODO(slaweq): remove trunks subport_connectivity test from blacklist
-      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
-      tempest_black_regex: "(^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)"
-      devstack_localrc:
-        Q_AGENT: openvswitch
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-      devstack_local_conf:
-        post-config:
-          $NEUTRON_CONF:
-            DEFAULT:
-              enable_dvr: false
-          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-          # devstack-tempest job will be switched to use lib/neutron instead of
-          # lib/neutron-legacy
-          /$NEUTRON_CORE_PLUGIN_CONF:
-            agent:
-              tunnel_types: vxlan,gre
-            ovs:
-              tunnel_bridge: br-tun
-              bridge_mappings: public:br-ex
-            securitygroup:
-              firewall_driver: iptables_hybrid
-        test-config:
-          $TEMPEST_CONFIG:
-            neutron_plugin_options:
-              available_type_drivers: flat,vlan,local,vxlan
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
-    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-    nodeset: openstack-single-node-xenial
-    description: |
-      This job run on py2 for stable/rocky gate.
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars: &openvswitch_vars_rocky
-      branch_override: stable/rocky
-      network_api_extensions: *api_extensions_rocky
-      devstack_localrc:
-        USE_PYTHON3: false
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-      # TODO(bcafarel): remove trunks subport_connectivity test from blacklist
-      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
-      # NOTE(bcafarel): other are newer tests, unstable on rocky branch
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)|\
-          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
-          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
-    branches:
-      - stable/rocky
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
-    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-    nodeset: openstack-single-node-xenial
-    description: |
-      This job run on py3 for other than stable/rocky gate
-      which is nothing but neutron-tempest-pluign master gate.
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars:
-      <<: *openvswitch_vars_rocky
-      devstack_localrc:
-        USE_PYTHON3: True
-    branches: ^(?!stable/rocky).*$
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-stein
-    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-    override-checkout: stable/stein
-    vars:
-      branch_override: stable/stein
-      network_api_extensions: *api_extensions_stein
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-train
-    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      network_api_extensions: *api_extensions_train
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-ussuri
-    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-    override-checkout: stable-ussuri
-    vars:
-      branch_override: stable-ussuri
-      network_api_extensions: *api_extensions_ussuri
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-linuxbridge
-    parent: neutron-tempest-plugin-scenario
-    timeout: 10000
-    vars:
-      network_api_extensions: *api_extensions_master
-      devstack_localrc:
-        Q_AGENT: linuxbridge
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-      devstack_local_conf:
-        post-config:
-          $NEUTRON_CONF:
-            DEFAULT:
-              enable_dvr: false
-            AGENT:
-              debug_iptables_rules: true
-          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-          # devstack-tempest job will be switched to use lib/neutron instead of
-          # lib/neutron-legacy
-          /$NEUTRON_CORE_PLUGIN_CONF:
-            ml2:
-              type_drivers: flat,vlan,local,vxlan
-        test-config:
-          $TEMPEST_CONFIG:
-            neutron_plugin_options:
-              available_type_drivers: flat,vlan,local,vxlan
-              q_agent: linuxbridge
-
-- job:
-    name: neutron-tempest-plugin-scenario-linuxbridge-queens
-    parent: neutron-tempest-plugin-scenario-linuxbridge
-    nodeset: openstack-single-node-xenial
-    override-checkout: stable/queens
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - name: openstack/neutron-tempest-plugin
-        override-checkout: 0.3.0
-      - openstack/tempest
-    vars:
-      branch_override: stable/queens
-      network_api_extensions: *api_extensions_queens
-      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
-      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
-      devstack_localrc:
-        USE_PYTHON3: false
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-      devstack_local_conf:
-        test-config:
-          # NOTE: ignores linux bridge's trunk delete on bound port test
-          # for queens branch (as https://review.opendev.org/#/c/605589/
-          # fix will not apply for queens branch)
-          $TEMPEST_CONFIG:
-            neutron_plugin_options:
-              q_agent: None
-
-- job:
-    name: neutron-tempest-plugin-scenario-linuxbridge-rocky
-    parent: neutron-tempest-plugin-scenario-linuxbridge
-    description: |
-      This job run on py2 for stable/rocky gate.
-    nodeset: openstack-single-node-xenial
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars: &linuxbridge_vars_rocky
-      branch_override: stable/rocky
-      network_api_extensions: *api_extensions_rocky
-      devstack_localrc:
-        USE_PYTHON3: false
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-      devstack_local_conf:
-        test-config:
-          # NOTE: ignores linux bridge's trunk delete on bound port test
-          # for rocky branch (as https://review.opendev.org/#/c/605589/
-          # fix will not apply for rocky branch)
-          $TEMPEST_CONFIG:
-            neutron_plugin_options:
-              q_agent: None
-      # NOTE(bcafarel): newer tests, unstable on rocky branch
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
-          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
-    branches:
-      - stable/rocky
-
-- job:
-    name: neutron-tempest-plugin-scenario-linuxbridge-rocky
-    parent: neutron-tempest-plugin-scenario-linuxbridge
-    nodeset: openstack-single-node-xenial
-    description: |
-      This job run on py3 for other than stable/rocky gate
-      which is nothing but neutron-tempest-pluign master gate.
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars:
-      <<: *linuxbridge_vars_rocky
-      devstack_localrc:
-        USE_PYTHON3: True
-    branches: ^(?!stable/rocky).*$
-
-- job:
-    name: neutron-tempest-plugin-scenario-linuxbridge-stein
-    parent: neutron-tempest-plugin-scenario-linuxbridge
-    override-checkout: stable/stein
-    vars:
-      branch_override: stable/stein
-      network_api_extensions: *api_extensions_stein
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-linuxbridge-train
-    parent: neutron-tempest-plugin-scenario-linuxbridge
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      network_api_extensions: *api_extensions_train
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-scenario-linuxbridge-ussuri
-    parent: neutron-tempest-plugin-scenario-linuxbridge
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions: *api_extensions_ussuri
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-dvr-multinode-scenario
-    parent: tempest-multinode-full
-    description: |
-        Perform setup for Neutron tempest tests in multinode with DVR scenario
-    roles:
-      - zuul: openstack/devstack
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - openstack/neutron-tempest-plugin
-      - openstack/tempest
-    pre-run: playbooks/dvr-multinode-scenario-pre-run.yaml
-    voting: false
-    vars:
-      tempest_concurrency: 4
-      tox_envlist: all
-      tempest_test_regex: ^neutron_tempest_plugin\.scenario
-      # NOTE(slaweq): in case of some tests, which requires advanced image,
-      # default test timeout set to 1200 seconds may be not enough if job is
-      # run on slow node
-      tempest_test_timeout: 2400
-      network_api_extensions_common: *api_extensions_master
-      network_api_extensions_dvr:
-        - dvr
-      devstack_localrc:
-        USE_PYTHON3: true
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_dvr) | join(',') }}"
-        PHYSICAL_NETWORK: default
-        IMAGE_URLS: https://cloud-images.ubuntu.com/releases/xenial/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img
-        ADVANCED_IMAGE_NAME: ubuntu-16.04-server-cloudimg-amd64-disk1
-        ADVANCED_INSTANCE_TYPE: ds512M
-        ADVANCED_INSTANCE_USER: ubuntu
-        BUILD_TIMEOUT: 784
-      devstack_plugins:
-        neutron: https://opendev.org/openstack/neutron.git
-        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
-      tempest_plugins:
-        - neutron-tempest-plugin
-      devstack_services:
-        tls-proxy: false
-        tempest: true
-        neutron-dns: true
-        neutron-qos: true
-        neutron-segments: true
-        neutron-trunk: true
-        neutron-log: true
-        neutron-port-forwarding: true
-        cinder: true
-      devstack_local_conf:
-        post-config:
-          $NEUTRON_CONF:
-            quotas:
-              quota_router: 100
-              quota_floatingip: 500
-              quota_security_group: 100
-              quota_security_group_rule: 1000
-            DEFAULT:
-              router_distributed: True
-          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-          # devstack-tempest job will be switched to use lib/neutron instead of
-          # lib/neutron-legacy
-          "/$NEUTRON_CORE_PLUGIN_CONF":
-            ml2:
-              type_drivers: flat,geneve,vlan,gre,local,vxlan
-              mechanism_drivers: openvswitch,l2population
-            ml2_type_vlan:
-              network_vlan_ranges: foo:1:10
-            ml2_type_vxlan:
-              vni_ranges: 1:2000
-            ml2_type_gre:
-              tunnel_id_ranges: 1:1000
-            agent:
-              enable_distributed_routing: True
-              l2_population: True
-              tunnel_types: vxlan,gre
-            ovs:
-              tunnel_bridge: br-tun
-              bridge_mappings: public:br-ex
-          $NEUTRON_L3_CONF:
-            DEFAULT:
-              agent_mode: dvr_snat
-            agent:
-              availability_zone: nova
-          $NEUTRON_DHCP_CONF:
-            agent:
-              availability_zone: nova
-          "/etc/neutron/api-paste.ini":
-            "composite:neutronapi_v2_0":
-              use: "call:neutron.auth:pipeline_factory"
-              noauth: "cors request_id catch_errors osprofiler extensions neutronapiapp_v2_0"
-              keystone: "cors request_id catch_errors osprofiler authtoken keystonecontext extensions neutronapiapp_v2_0"
-        test-config:
-          $TEMPEST_CONFIG:
-            neutron_plugin_options:
-              provider_vlans: foo,
-              agent_availability_zone: nova
-              image_is_advanced: true
-              available_type_drivers: flat,geneve,vlan,gre,local,vxlan
-              l3_agent_mode: dvr_snat
-    group-vars:
-      subnode:
-        devstack_services:
-          tls-proxy: false
-          q-agt: true
-          q-l3: true
-          q-meta: true
-          neutron-qos: true
-          neutron-trunk: true
-          neutron-log: true
-          neutron-port-forwarding: true
-        devstack_localrc:
-          USE_PYTHON3: true
-        devstack_local_conf:
-          post-config:
-            $NEUTRON_CONF:
-              DEFAULT:
-                router_distributed: True
-            # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-            # devstack-tempest job will be switched to use lib/neutron instead of
-            # lib/neutron-legacy
-            "/$NEUTRON_CORE_PLUGIN_CONF":
-              agent:
-                enable_distributed_routing: True
-                l2_population: True
-                tunnel_types: vxlan,gre
-              ovs:
-                tunnel_bridge: br-tun
-                bridge_mappings: public:br-ex
-            $NEUTRON_L3_CONF:
-              DEFAULT:
-                agent_mode: dvr_snat
-              agent:
-                availability_zone: nova
-    irrelevant-files: *tempest-irrelevant-files
-
-- job:
-    name: neutron-tempest-plugin-dvr-multinode-scenario-queens
-    parent: neutron-tempest-plugin-dvr-multinode-scenario
-    nodeset: openstack-two-node-xenial
-    override-checkout: stable/queens
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - name: openstack/neutron-tempest-plugin
-        override-checkout: 0.3.0
-      - openstack/tempest
-    vars:
-      branch_override: stable/queens
-      network_api_extensions_common: *api_extensions_queens
-      # TODO(slaweq): remove trunks subport_connectivity test from blacklist
-      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
-      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
-      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)|\
-          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
-      devstack_localrc:
-        USE_PYTHON3: false
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-
-- job:
-    name: neutron-tempest-plugin-dvr-multinode-scenario-rocky
-    parent: neutron-tempest-plugin-dvr-multinode-scenario
-    description: |
-      This job run on py2 for stable/rocky gate.
-    nodeset: openstack-two-node-xenial
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars: &multinode_scenario_vars_rocky
-      branch_override: stable/rocky
-      network_api_extensions_common: *api_extensions_rocky
-      devstack_localrc:
-        USE_PYTHON3: false
-        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
-      # NOTE(bcafarel): newer tests, unstable on rocky branch
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
-          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
-    branches:
-      - stable/rocky
-
-- job:
-    name: neutron-tempest-plugin-dvr-multinode-scenario-rocky
-    parent: neutron-tempest-plugin-dvr-multinode-scenario
-    nodeset: openstack-two-node-xenial
-    description: |
-      This job run on py3 for other than stable/rocky gate
-      which is nothing but neutron-tempest-pluign master gate.
-    override-checkout: stable/rocky
-    vars:
-      <<: *multinode_scenario_vars_rocky
-      devstack_localrc:
-        USE_PYTHON3: True
-    required-projects: *required-projects-rocky
-    group-vars:
-      subnode:
-        devstack_localrc:
-          USE_PYTHON3: True
-    branches: ^(?!stable/rocky).*$
-
-- job:
-    name: neutron-tempest-plugin-dvr-multinode-scenario-stein
-    parent: neutron-tempest-plugin-dvr-multinode-scenario
-    override-checkout: stable/stein
-    vars:
-      network_api_extensions_common: *api_extensions_stein
-      branch_override: stable/stein
-
-- job:
-    name: neutron-tempest-plugin-dvr-multinode-scenario-train
-    parent: neutron-tempest-plugin-dvr-multinode-scenario
-    override-checkout: stable/train
-    vars:
-      network_api_extensions_common: *api_extensions_train
-      branch_override: stable/train
-
-- job:
-    name: neutron-tempest-plugin-dvr-multinode-scenario-ussuri
-    parent: neutron-tempest-plugin-dvr-multinode-scenario
-    override-checkout: stable/ussuri
-    vars:
-      network_api_extensions_common: *api_extensions_ussuri
-      branch_override: stable/ussuri
-
-- job:
-    name: neutron-tempest-plugin-designate-scenario
-    parent: neutron-tempest-plugin-scenario
-    description: Neutron designate integration scenario
-    required-projects:
-      - openstack/designate
-      - openstack/designate-dashboard
-      - openstack/designate-tempest-plugin
-    timeout: 3600
-    vars:
-      devstack_localrc:
-        DESIGNATE_BACKEND_DRIVER: bind9
-        Q_AGENT: openvswitch
-        # In this job advanced image is not needed, so it's name should be
-        # empty
-        ADVANCED_IMAGE_NAME: ""
-      devstack_local_conf:
-        post-config:
-          $NEUTRON_CONF:
-            DEFAULT:
-              enable_dvr: false
-          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
-          # devstack-tempest job will be switched to use lib/neutron instead of
-          # lib/neutron-legacy
-          /$NEUTRON_CORE_PLUGIN_CONF:
-            agent:
-              tunnel_types: vxlan,gre
-            ovs:
-              tunnel_bridge: br-tun
-              bridge_mappings: public:br-ex
-      devstack_plugins:
-        designate: https://opendev.org/openstack/designate.git
-      devstack_services:
-        cinder: false
-        designate: true
-      tempest_plugins:
-        - designate-tempest-plugin
-        - neutron-tempest-plugin
-      tempest_test_regex: ^neutron_tempest_plugin\.scenario\.test_dns_integration
-    irrelevant-files: *tempest-irrelevant-files
-
-- job:
-    name: neutron-tempest-plugin-designate-scenario-queens
-    parent: neutron-tempest-plugin-designate-scenario
-    nodeset: openstack-single-node-xenial
-    override-checkout: stable/queens
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - name: openstack/neutron-tempest-plugin
-        override-checkout: 0.3.0
-      - name: openstack/designate-tempest-plugin
-        override-checkout: 0.7.0
-      - openstack/tempest
-    vars:
-      branch_override: stable/queens
-      network_api_extensions_common: *api_extensions_queens
-      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
-      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
-      tempest_black_regex: "\
-          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
-      devstack_localrc:
-        USE_PYTHON3: false
-        TEMPEST_PLUGINS: '"/opt/stack/designate-tempest-plugin /opt/stack/neutron-tempest-plugin"'
-
-- job:
-    name: neutron-tempest-plugin-designate-scenario-rocky
-    parent: neutron-tempest-plugin-designate-scenario
-    description: |
-      This job run on py2 for stable/rocky gate.
-    nodeset: openstack-single-node-xenial
-    override-checkout: stable/rocky
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - name: openstack/neutron-tempest-plugin
-        override-checkout: 0.9.0
-      - name: openstack/designate-tempest-plugin
-        override-checkout: 0.7.0
-      - openstack/tempest
-    vars: &designate_scenario_vars_rocky
-      branch_override: stable/rocky
-      network_api_extensions_common: *api_extensions_rocky
-      devstack_localrc:
-        USE_PYTHON3: false
-        TEMPEST_PLUGINS: '"/opt/stack/designate-tempest-plugin /opt/stack/neutron-tempest-plugin"'
-    branches:
-      - stable/rocky
-
-- job:
-    name: neutron-tempest-plugin-designate-scenario-rocky
-    parent: neutron-tempest-plugin-designate-scenario
-    nodeset: openstack-single-node-xenial
-    description: |
-      This job run on py3 for other than stable/rocky gate
-      which is nothing but neutron-tempest-plugin master gate.
-    override-checkout: stable/rocky
-    required-projects: *required-projects-rocky
-    vars:
-      <<: *designate_scenario_vars_rocky
-      devstack_localrc:
-        USE_PYTHON3: True
-    branches: ^(?!stable/rocky).*$
-
-- job:
-    name: neutron-tempest-plugin-designate-scenario-stein
-    parent: neutron-tempest-plugin-designate-scenario
-    override-checkout: stable/stein
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - openstack/neutron-tempest-plugin
-      - name: openstack/designate-tempest-plugin
-        override-checkout: 0.7.0
-      - openstack/tempest
-    vars:
-      branch_override: stable/stein
-      network_api_extensions_common: *api_extensions_stein
-
-- job:
-    name: neutron-tempest-plugin-designate-scenario-train
-    parent: neutron-tempest-plugin-designate-scenario
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      network_api_extensions_common: *api_extensions_train
-
-- job:
-    name: neutron-tempest-plugin-designate-scenario-ussuri
-    parent: neutron-tempest-plugin-designate-scenario
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions_common: *api_extensions_ussuri
-
-- job:
-    name: neutron-tempest-plugin-sfc
-    parent: neutron-tempest-plugin
-    timeout: 10800
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/networking-sfc
-      - openstack/neutron
-      - openstack/neutron-tempest-plugin
-      - openstack/tempest
-    vars:
-      tempest_test_regex: ^neutron_tempest_plugin\.sfc
-      devstack_plugins:
-        networking-sfc: https://opendev.org/openstack/networking-sfc
-        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin
-      network_api_extensions_sfc:
-        - flow_classifier
-        - sfc
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_sfc) | join(',') }}"
-      # TODO(bcafarel): tests still fail from time to time in parallel
-      # https://bugs.launchpad.net/neutron/+bug/1851500
-      # https://bugs.launchpad.net/networking-sfc/+bug/1660366
-      tempest_concurrency: 1
-
-- job:
-    name: neutron-tempest-plugin-sfc-train
-    parent: neutron-tempest-plugin-sfc
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      network_api_extensions_common: *api_extensions_train
-
-- job:
-    name: neutron-tempest-plugin-sfc-ussuri
-    parent: neutron-tempest-plugin-sfc
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions_common: *api_extensions_ussuri
-
-- job:
-    name: neutron-tempest-plugin-bgpvpn-bagpipe
-    parent: neutron-tempest-plugin
-    required-projects:
-      - openstack/networking-bagpipe
-      - openstack/networking-bgpvpn
-    vars:
-      tempest_test_regex: ^neutron_tempest_plugin\.bgpvpn
-      network_api_extensions: *api_extensions_master
-      network_api_extensions_bgpvpn:
-        - bgpvpn
-        - bgpvpn-routes-control
-      devstack_localrc:
-        NETWORKING_BGPVPN_DRIVER: "BGPVPN:BaGPipe:networking_bgpvpn.neutron.services.service_drivers.bagpipe.bagpipe_v2.BaGPipeBGPVPNDriver:default"
-        BAGPIPE_DATAPLANE_DRIVER_IPVPN: "ovs"
-        BAGPIPE_BGP_PEERS: "-"
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions + network_api_extensions_bgpvpn) | join(',') }}"
-      devstack_plugins:
-        networking-bgpvpn: https://git.openstack.org/openstack/networking-bgpvpn
-        networking-bagpipe: https://git.openstack.org/openstack/networking-bagpipe
-
-- job:
-    name: neutron-tempest-plugin-bgpvpn-bagpipe-train
-    parent: neutron-tempest-plugin-bgpvpn-bagpipe
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      network_api_extensions: *api_extensions_train
-
-- job:
-    name: neutron-tempest-plugin-bgpvpn-bagpipe-ussuri
-    parent: neutron-tempest-plugin-bgpvpn-bagpipe
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions: *api_extensions_ussuri
-
-- job:
-    name: neutron-tempest-plugin-fwaas
-    parent: neutron-tempest-plugin
-    timeout: 10800
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron-fwaas
-      - openstack/neutron
-      - openstack/neutron-tempest-plugin
-      - openstack/tempest
-    vars:
-      tempest_test_regex: ^neutron_tempest_plugin\.fwaas
-      devstack_plugins:
-        neutron-fwaas: https://opendev.org/openstack/neutron-fwaas.git
-        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
-      network_api_extensions_common: *api_extensions_master
-      network_api_extensions_fwaas:
-        - fwaas_v2
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_fwaas) | join(',') }}"
-
-- job:
-    name: neutron-tempest-plugin-fwaas-train
-    parent: neutron-tempest-plugin-fwaas
-    override-checkout: stable/train
-    vars:
-      branch_override: stable/train
-      network_api_extensions_common: *api_extensions_train
-
-- job:
-    name: neutron-tempest-plugin-fwaas-ussuri
-    parent: neutron-tempest-plugin-fwaas
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions_common: *api_extensions_ussuri
-
-- job:
-    name: neutron-tempest-plugin-dynamic-routing
-    parent: neutron-tempest-plugin
-    description: |
-      Perform setup common to all Neutron dynamic routing tempest tests
-    required-projects:
-      - openstack/neutron
-      - openstack/neutron-dynamic-routing
-      - openstack/os-ken
-      - openstack/tempest
-    pre-run: playbooks/dynamic-routing-pre-run.yaml
-    vars:
-      devstack_plugins:
-        neutron-dynamic-routing: https://opendev.org/openstack/neutron-dynamic-routing
-        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin
-      network_api_extensions_common: *api_extensions_master
-      network_api_extensions_bgp:
-        - bgp
-        - bgp_dragent_scheduler
-        - bgp_4byte_asn
-      devstack_localrc:
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_bgp) | join(',') }}"
-      devstack_services:
-        neutron-dr: true
-        neutron-dr-agent: true
-        q-l3: true
-      tempest_concurrency: 1
-      tempest_test_regex: ^neutron_tempest_plugin\.neutron_dynamic_routing
-
-- job:
-    name: neutron-tempest-plugin-dynamic-routing-ussuri
-    parent: neutron-tempest-plugin-dynamic-routing
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions_common: *api_extensions_ussuri
-
-- job:
-    name: neutron-tempest-plugin-vpnaas
-    parent: neutron-tempest-plugin
-    timeout: 3900
-    required-projects:
-      - openstack/devstack-gate
-      - openstack/neutron
-      - openstack/neutron-vpnaas
-      - openstack/neutron-tempest-plugin
-      - openstack/tempest
-    vars:
-      tempest_test_regex: ^neutron_tempest_plugin\.vpnaas
-      devstack_plugins:
-        neutron-vpnaas: https://opendev.org/openstack/neutron-vpnaas.git
-        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
-      network_api_extensions_common: *api_extensions_master
-      network_api_extensions_vpnaas:
-        - vpnaas
-      devstack_localrc:
-        IPSEC_PACKAGE: strongswan
-        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_vpnaas) | join(',') }}"
-    irrelevant-files:
-      - ^.*\.rst$
-      - ^doc/.*$
-      - ^neutron_vpnaas/tests/unit/.*$
-      - ^releasenotes/.*$
-
-- job:
-    name: neutron-tempest-plugin-vpnaas-ussuri
-    parent: neutron-tempest-plugin-vpnaas
-    override-checkout: stable/ussuri
-    vars:
-      branch_override: stable/ussuri
-      network_api_extensions_common: *api_extensions_ussuri
-
-- project-template:
-    name: neutron-tempest-plugin-jobs
-    check:
-      jobs:
-        - neutron-tempest-plugin-api
-        - neutron-tempest-plugin-designate-scenario
-        - neutron-tempest-plugin-dvr-multinode-scenario
-        - neutron-tempest-plugin-scenario-linuxbridge
-        - neutron-tempest-plugin-scenario-openvswitch
-        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-    gate:
-      jobs:
-        - neutron-tempest-plugin-api
-        - neutron-tempest-plugin-scenario-linuxbridge
-        - neutron-tempest-plugin-scenario-openvswitch
-        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
-
-- project-template:
-    name: neutron-tempest-plugin-jobs-queens
-    check:
-      jobs:
-        - neutron-tempest-plugin-api-queens
-        - neutron-tempest-plugin-designate-scenario-queens
-        - neutron-tempest-plugin-dvr-multinode-scenario-queens
-        - neutron-tempest-plugin-scenario-linuxbridge-queens
-        - neutron-tempest-plugin-scenario-openvswitch-queens
-    gate:
-      jobs:
-        - neutron-tempest-plugin-api-queens
-
-- project-template:
-    name: neutron-tempest-plugin-jobs-rocky
-    check:
-      jobs:
-        - neutron-tempest-plugin-api-rocky
-        - neutron-tempest-plugin-designate-scenario-rocky
-        - neutron-tempest-plugin-dvr-multinode-scenario-rocky
-        - neutron-tempest-plugin-scenario-linuxbridge-rocky
-        - neutron-tempest-plugin-scenario-openvswitch-rocky
-        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
-    gate:
-      jobs:
-        - neutron-tempest-plugin-api-rocky
-
-- project-template:
-    name: neutron-tempest-plugin-jobs-stein
-    check:
-      jobs:
-        - neutron-tempest-plugin-api-stein
-        - neutron-tempest-plugin-designate-scenario-stein
-        - neutron-tempest-plugin-dvr-multinode-scenario-stein
-        - neutron-tempest-plugin-scenario-linuxbridge-stein
-        - neutron-tempest-plugin-scenario-openvswitch-stein
-        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-stein
-    gate:
-      jobs:
-        - neutron-tempest-plugin-api-stein
-
-- project-template:
-    name: neutron-tempest-plugin-jobs-train
-    check:
-      jobs:
-        - neutron-tempest-plugin-api-train
-        - neutron-tempest-plugin-designate-scenario-train
-        - neutron-tempest-plugin-dvr-multinode-scenario-train
-        - neutron-tempest-plugin-scenario-linuxbridge-train
-        - neutron-tempest-plugin-scenario-openvswitch-train
-        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-train
-    gate:
-      jobs:
-        - neutron-tempest-plugin-api-train
-
-- project-template:
-    name: neutron-tempest-plugin-jobs-ussuri
-    check:
-      jobs:
-        - neutron-tempest-plugin-api-ussuri
-        - neutron-tempest-plugin-designate-scenario-ussuri
-        - neutron-tempest-plugin-dvr-multinode-scenario-ussuri
-        - neutron-tempest-plugin-scenario-linuxbridge-ussuri
-        - neutron-tempest-plugin-scenario-openvswitch-ussuri
-        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-ussuri
-    gate:
-      jobs:
-        - neutron-tempest-plugin-api-ussuri
-
-- project:
-    templates:
-      - build-openstack-docs-pti
-      - neutron-tempest-plugin-jobs
-      - neutron-tempest-plugin-jobs-stein
-      - neutron-tempest-plugin-jobs-train
-      - neutron-tempest-plugin-jobs-ussuri
-      - check-requirements
-      - tempest-plugin-jobs
-      - release-notes-jobs-python3
-    check:
-      jobs:
-        - neutron-tempest-plugin-sfc
-        - neutron-tempest-plugin-sfc-train
-        - neutron-tempest-plugin-sfc-ussuri
-        - neutron-tempest-plugin-bgpvpn-bagpipe
-        - neutron-tempest-plugin-bgpvpn-bagpipe-train
-        - neutron-tempest-plugin-bgpvpn-bagpipe-ussuri
-        - neutron-tempest-plugin-fwaas:
-            # TODO(slaweq): switch it to be voting when bug
-            # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
-            voting: false
-        - neutron-tempest-plugin-fwaas-train:
-            # TODO(slaweq): switch it to be voting when bug
-            # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
-            voting: false
-        - neutron-tempest-plugin-fwaas-ussuri:
-            # TODO(slaweq): switch it to be voting when bug
-            # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
-            voting: false
-        - neutron-tempest-plugin-dynamic-routing
-        - neutron-tempest-plugin-dynamic-routing-ussuri
-        - neutron-tempest-plugin-vpnaas
-
-    gate:
-      jobs:
-        - neutron-tempest-plugin-sfc
-        - neutron-tempest-plugin-bgpvpn-bagpipe
-        # TODO(slaweq): bring it back to gate queue
-        # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
-        # - neutron-tempest-plugin-fwaas
-        - neutron-tempest-plugin-dynamic-routing
diff --git a/doc/source/conf.py b/doc/source/conf.py
index 3a4cff9..4b4189d 100755
--- a/doc/source/conf.py
+++ b/doc/source/conf.py
@@ -39,9 +39,9 @@
 copyright = u'2017, OpenStack Developers'
 
 # openstackdocstheme options
-repository_name = 'openstack/openstack'
-bug_project = 'neutron_tempest_plugin'
-bug_tag = ''
+openstackdocs_repo_name = 'openstack/neutron-tempest-plugin'
+openstackdocs_bug_project = 'neutron_tempest_plugin'
+openstackdocs_bug_tag = ''
 
 # If true, '()' will be appended to :func: etc. cross-reference text.
 add_function_parentheses = True
@@ -51,7 +51,7 @@
 add_module_names = True
 
 # The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = 'native'
 
 # -- Options for HTML output --------------------------------------------------
 
diff --git a/neutron_tempest_plugin/api/admin/test_ports.py b/neutron_tempest_plugin/api/admin/test_ports.py
index bdb66ef..9c94322 100644
--- a/neutron_tempest_plugin/api/admin/test_ports.py
+++ b/neutron_tempest_plugin/api/admin/test_ports.py
@@ -89,9 +89,7 @@
 
         cls.vnic_type = 'normal'
 
-        # Note(lajoskatona): to avoid creating provider network use vxlan
-        # as provider network type:
-        cls.network = cls.create_network(provider_network_type='vxlan')
+        cls.network = cls.create_network()
         cls.physnet_name = CONF.neutron_plugin_options.provider_vlans[0]
         base_segm = CONF.neutron_plugin_options.provider_net_base_segm_id
         cls.prov_network = cls.create_provider_network(
diff --git a/neutron_tempest_plugin/api/test_qos.py b/neutron_tempest_plugin/api/test_qos.py
index 0fc7b15..5fb0511 100644
--- a/neutron_tempest_plugin/api/test_qos.py
+++ b/neutron_tempest_plugin/api/test_qos.py
@@ -82,6 +82,33 @@
         retrieved_policy = policies[0]
         self.assertEqual('test', retrieved_policy['name'])
 
+    @decorators.idempotent_id('dde0b449-a400-4a87-b5a5-4d1c413c917b')
+    def test_list_policy_sort_by_name(self):
+        policyA = 'A' + data_utils.rand_name("policy")
+        policyB = 'B' + data_utils.rand_name("policy")
+        self.create_qos_policy(name=policyA, description='test policy',
+                               shared=False)
+        self.create_qos_policy(name=policyB, description='test policy',
+                               shared=False)
+
+        param = {
+            'sort_key': 'name',
+            'sort_dir': 'asc'
+        }
+        policies = (self.admin_client.list_qos_policies(**param)['policies'])
+        policy_names = [p['name'] for p in policies]
+        self.assertLess(policy_names.index(policyA),
+                        policy_names.index(policyB))
+
+        param = {
+            'sort_key': 'name',
+            'sort_dir': 'desc'
+        }
+        policies = (self.admin_client.list_qos_policies(**param)['policies'])
+        policy_names = [p['name'] for p in policies]
+        self.assertLess(policy_names.index(policyB),
+                        policy_names.index(policyA))
+
     @decorators.idempotent_id('8e88a54b-f0b2-4b7d-b061-a15d93c2c7d6')
     def test_policy_update(self):
         policy = self.create_qos_policy(name='test-policy',
diff --git a/neutron_tempest_plugin/api/test_qos_negative.py b/neutron_tempest_plugin/api/test_qos_negative.py
index ada0efa..c069360 100644
--- a/neutron_tempest_plugin/api/test_qos_negative.py
+++ b/neutron_tempest_plugin/api/test_qos_negative.py
@@ -47,3 +47,21 @@
                           self.client.create_qos_policy,
                           'test-policy', 'test policy desc1',
                           False, LONG_TENANT_ID_NG)
+
+    @decorators.attr(type='negative')
+    @decorators.idempotent_id('0e85f3e4-7a93-4187-b847-8f4e835aae1b')
+    def test_update_policy_with_too_long_name(self):
+        policy = self.create_qos_policy(name='test', description='test policy',
+                                        shared=False)
+        self.assertRaises(lib_exc.BadRequest,
+                          self.client.update_qos_policy, policy['id'],
+                          name=LONG_NAME_NG)
+
+    @decorators.attr(type='negative')
+    @decorators.idempotent_id('925c7eaf-474b-4a02-a4ba-76a9f82bc45a')
+    def test_update_policy_with_too_long_description(self):
+        policy = self.create_qos_policy(name='test', description='test policy',
+                                        shared=False)
+        self.assertRaises(lib_exc.BadRequest,
+                          self.client.update_qos_policy, policy['id'],
+                          description=LONG_DESCRIPTION_NG)
diff --git a/neutron_tempest_plugin/common/ip.py b/neutron_tempest_plugin/common/ip.py
index 70a3dd5..592f040 100644
--- a/neutron_tempest_plugin/common/ip.py
+++ b/neutron_tempest_plugin/common/ip.py
@@ -117,6 +117,12 @@
         output = self.execute('route', 'show', *args)
         return list(parse_routes(output))
 
+    def get_nic_name_by_mac(self, mac_address):
+        nics = self.execute("-o", "link")
+        for nic_line in nics.split("\n"):
+            if mac_address in nic_line:
+                return nic_line.split(":")[1].strip()
+
 
 def parse_addresses(command_output):
     address = device = None
diff --git a/neutron_tempest_plugin/scenario/base.py b/neutron_tempest_plugin/scenario/base.py
index 9dd830c..35e5c31 100644
--- a/neutron_tempest_plugin/scenario/base.py
+++ b/neutron_tempest_plugin/scenario/base.py
@@ -259,8 +259,10 @@
                                                'server']['id'])['ports'][0]
         self.fip = self.create_floatingip(port=self.port)
 
-    def check_connectivity(self, host, ssh_user, ssh_key, servers=None):
-        ssh_client = ssh.Client(host, ssh_user, pkey=ssh_key)
+    def check_connectivity(self, host, ssh_user, ssh_key,
+                           servers=None, ssh_timeout=None):
+        ssh_client = ssh.Client(host, ssh_user,
+                                pkey=ssh_key, timeout=ssh_timeout)
         try:
             ssh_client.test_connection_auth()
         except lib_exc.SSHTimeout as ssh_e:
@@ -336,7 +338,7 @@
                     mtu=mtu, ip_version=ip_version))
             if pattern:
                 cmd += ' -p {pattern}'.format(pattern=pattern)
-            cmd += ' -c{0} -w{0} -s{1} {2}'.format(count, size, host)
+            cmd += ' -c{0} -W{0} -s{1} {2}'.format(count, size, host)
             return source.exec_command(cmd)
 
         def ping_remote():
diff --git a/neutron_tempest_plugin/scenario/test_ipv6.py b/neutron_tempest_plugin/scenario/test_ipv6.py
new file mode 100644
index 0000000..844f995
--- /dev/null
+++ b/neutron_tempest_plugin/scenario/test_ipv6.py
@@ -0,0 +1,172 @@
+# Copyright 2020 Red Hat, Inc.
+# All Rights Reserved.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+from neutron_lib import constants as lib_constants
+from oslo_log import log
+from tempest.common import utils as tempest_utils
+from tempest.common import waiters
+from tempest.lib.common.utils import data_utils
+from tempest.lib import decorators
+from tempest.lib import exceptions as lib_exc
+
+from neutron_tempest_plugin.common import ip
+from neutron_tempest_plugin.common import ssh
+from neutron_tempest_plugin.common import utils
+from neutron_tempest_plugin import config
+from neutron_tempest_plugin.scenario import base
+
+CONF = config.CONF
+
+LOG = log.getLogger(__name__)
+
+
+def turn_nic6_on(ssh, ipv6_port):
+    """Turns the IPv6 vNIC on
+
+    Required because guest images usually set only the first vNIC on boot.
+    Searches for the IPv6 vNIC's MAC and brings it up.
+
+    @param ssh: RemoteClient ssh instance to server
+    @param ipv6_port: port from IPv6 network attached to the server
+    """
+    ip_command = ip.IPCommand(ssh)
+    nic = ip_command.get_nic_name_by_mac(ipv6_port['mac_address'])
+
+    # NOTE(slaweq): on RHEL based OS ifcfg file for new interface is
+    # needed to make IPv6 working on it, so if
+    # /etc/sysconfig/network-scripts directory exists ifcfg-%(nic)s file
+    # should be added in it
+    if sysconfig_network_scripts_dir_exists(ssh):
+        try:
+            ssh.execute_script(
+                'echo -e "DEVICE=%(nic)s\\nNAME=%(nic)s\\nIPV6INIT=yes" | '
+                'tee /etc/sysconfig/network-scripts/ifcfg-%(nic)s; '
+                'nmcli connection reload' % {'nic': nic},
+                become_root=True)
+            ssh.execute_script('nmcli connection up %s' % nic,
+                               become_root=True)
+        except lib_exc.SSHExecCommandFailed as e:
+            # NOTE(slaweq): Sometimes it can happen that this SSH command
+            # will fail because of some error from network manager in
+            # guest os.
+            # But even then doing ip link set up below is fine and
+            # IP address should be configured properly.
+            LOG.debug("Error during restarting %(nic)s interface on "
+                      "instance. Error message: %(error)s",
+                      {'nic': nic, 'error': e})
+    ip_command.set_link(nic, "up")
+
+
+def sysconfig_network_scripts_dir_exists(ssh):
+    return "False" not in ssh.execute_script(
+        'test -d /etc/sysconfig/network-scripts/ || echo "False"')
+
+
+class IPv6Test(base.BaseTempestTestCase):
+    credentials = ['primary', 'admin']
+
+    ipv6_ra_mode = 'slaac'
+    ipv6_address_mode = 'slaac'
+
+    @classmethod
+    @tempest_utils.requires_ext(extension="router", service="network")
+    def resource_setup(cls):
+        super(IPv6Test, cls).resource_setup()
+        cls._setup_basic_resources()
+
+    @classmethod
+    def _setup_basic_resources(cls):
+        cls.network = cls.create_network()
+        cls.subnet = cls.create_subnet(cls.network)
+        cls.router = cls.create_router_by_client()
+        cls.create_router_interface(cls.router['id'], cls.subnet['id'])
+        cls.keypair = cls.create_keypair()
+        cls.secgroup = cls.create_security_group(
+            name=data_utils.rand_name('secgroup'))
+        cls.create_loginable_secgroup_rule(secgroup_id=cls.secgroup['id'])
+        cls.create_pingable_secgroup_rule(secgroup_id=cls.secgroup['id'])
+
+    def _test_ipv6_address_configured(self, ssh_client, vm, ipv6_port):
+        ipv6_address = ipv6_port['fixed_ips'][0]['ip_address']
+        ip_command = ip.IPCommand(ssh_client)
+
+        def guest_has_address(expected_address):
+            ip_addresses = [a.address for a in ip_command.list_addresses()]
+            for ip_address in ip_addresses:
+                if expected_address in ip_address:
+                    return True
+            return False
+
+        # Set NIC with IPv6 to be UP and wait until IPv6 address will be
+        # configured on this NIC
+        turn_nic6_on(ssh_client, ipv6_port)
+        # And check if IPv6 address will be properly configured on this NIC
+        utils.wait_until_true(
+            lambda: guest_has_address(ipv6_address),
+            timeout=120,
+            exception=RuntimeError(
+                "Timed out waiting for IP address {!r} to be configured in "
+                "the VM {!r}.".format(ipv6_address, vm['id'])))
+
+    def _test_ipv6_hotplug(self, ra_mode, address_mode):
+        ipv6_networks = [self.create_network() for _ in range(2)]
+        for net in ipv6_networks:
+            subnet = self.create_subnet(
+                network=net, ip_version=6,
+                ipv6_ra_mode=ra_mode, ipv6_address_mode=address_mode)
+            self.create_router_interface(self.router['id'], subnet['id'])
+
+        server_kwargs = {
+            'flavor_ref': CONF.compute.flavor_ref,
+            'image_ref': CONF.compute.image_ref,
+            'key_name': self.keypair['name'],
+            'networks': [
+                {'uuid': self.network['id']},
+                {'uuid': ipv6_networks[0]['id']}],
+            'security_groups': [{'name': self.secgroup['name']}],
+        }
+        vm = self.create_server(**server_kwargs)['server']
+        self.wait_for_server_active(vm)
+        ipv4_port = self.client.list_ports(
+            network_id=self.network['id'],
+            device_id=vm['id'])['ports'][0]
+        fip = self.create_floatingip(port=ipv4_port)
+        ssh_client = ssh.Client(
+            fip['floating_ip_address'], CONF.validation.image_ssh_user,
+            pkey=self.keypair['private_key'])
+
+        ipv6_port = self.client.list_ports(
+            network_id=ipv6_networks[0]['id'],
+            device_id=vm['id'])['ports'][0]
+        self._test_ipv6_address_configured(ssh_client, vm, ipv6_port)
+
+        # Now remove this port IPv6 port from the VM and attach new one
+        self.delete_interface(vm['id'], ipv6_port['id'])
+
+        # And plug VM to the second IPv6 network
+        ipv6_port = self.create_port(ipv6_networks[1])
+        self.create_interface(vm['id'], ipv6_port['id'])
+        waiters.wait_for_interface_status(
+            self.os_primary.interfaces_client, vm['id'],
+            ipv6_port['id'], lib_constants.PORT_STATUS_ACTIVE)
+        self._test_ipv6_address_configured(ssh_client, vm, ipv6_port)
+
+    @decorators.idempotent_id('b13e5408-5250-4a42-8e46-6996ce613e91')
+    def test_ipv6_hotplug_slaac(self):
+        self._test_ipv6_hotplug("slaac", "slaac")
+
+    @decorators.idempotent_id('9aaedbc4-986d-42d5-9177-3e721728e7e0')
+    def test_ipv6_hotplug_dhcpv6stateless(self):
+        self._test_ipv6_hotplug("dhcpv6-stateless", "dhcpv6-stateless")
diff --git a/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py b/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py
index 1e5c60a..1a51198 100644
--- a/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py
+++ b/neutron_tempest_plugin/vpnaas/scenario/test_vpnaas.py
@@ -17,6 +17,7 @@
 from oslo_config import cfg
 import testtools
 
+from neutron_lib.utils import test
 from tempest.common import utils
 from tempest.common import waiters
 from tempest.lib.common import ssh
@@ -220,6 +221,7 @@
             subnet_id, port)
         raise self.fail(msg)
 
+    @test.unstable_test("bug 1882220")
     def _test_vpnaas(self):
         # RIGHT
         right_server = self._create_server(network=self._right_network,
diff --git a/releasenotes/source/conf.py b/releasenotes/source/conf.py
index 770396a..24a38a4 100644
--- a/releasenotes/source/conf.py
+++ b/releasenotes/source/conf.py
@@ -55,9 +55,9 @@
 copyright = u'2017, Neutron Tempest Plugin Developers'
 
 # openstackdocstheme options
-repository_name = 'openstack/neutron-tempest-plugin'
-bug_project = 'neutron'
-bug_tag = ''
+openstackdocs_repo_name = 'openstack/neutron-tempest-plugin'
+openstackdocs_bug_project = 'neutron'
+openstackdocs_bug_tag = ''
 
 # The language for content autogenerated by Sphinx. Refer to documentation
 # for a list of supported languages.
@@ -89,7 +89,7 @@
 # show_authors = False
 
 # The name of the Pygments (syntax highlighting) style to use.
-pygments_style = 'sphinx'
+pygments_style = 'native'
 
 # A list of ignored prefixes for module index sorting.
 # modindex_common_prefix = []
diff --git a/setup.cfg b/setup.cfg
index 544ea90..144569f 100644
--- a/setup.cfg
+++ b/setup.cfg
@@ -16,6 +16,8 @@
     Programming Language :: Python
     Programming Language :: Python :: 3
     Programming Language :: Python :: 3.6
+    Programming Language :: Python :: 3.7
+    Programming Language :: Python :: 3.8
 
 [files]
 packages =
diff --git a/test-requirements.txt b/test-requirements.txt
index 6cff185..6cbe947 100644
--- a/test-requirements.txt
+++ b/test-requirements.txt
@@ -11,6 +11,6 @@
 oslotest>=3.2.0 # Apache-2.0
 stestr>=1.0.0 # Apache-2.0
 testtools>=2.2.0 # MIT
-openstackdocstheme>=2.0.0 # Apache-2.0
+openstackdocstheme>=2.2.1 # Apache-2.0
 # releasenotes
-reno>=2.5.0 # Apache-2.0
+reno>=3.1.0 # Apache-2.0
diff --git a/zuul.d/base.yaml b/zuul.d/base.yaml
new file mode 100644
index 0000000..b6d9f90
--- /dev/null
+++ b/zuul.d/base.yaml
@@ -0,0 +1,108 @@
+- job:
+    name: neutron-tempest-plugin-base
+    parent: devstack-tempest
+    abstract: true
+    description: |
+      Perform setup common to all Neutron tempest tests
+    roles:
+      - zuul: openstack/devstack
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - openstack/neutron-tempest-plugin
+      - openstack/tempest
+    vars:
+      tempest_concurrency: 4
+      tox_envlist: all
+      devstack_localrc:
+        USE_PYTHON3: true
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
+      devstack_plugins:
+        neutron: https://opendev.org/openstack/neutron.git
+        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
+      tempest_plugins:
+        - neutron-tempest-plugin
+      devstack_services:
+        tls-proxy: false
+        tempest: true
+        neutron-dns: true
+        neutron-qos: true
+        neutron-segments: true
+        neutron-trunk: true
+        neutron-uplink-status-propagation: true
+        neutron-network-segment-range: true
+        neutron-port-forwarding: true
+        neutron-conntrack-helper: true
+        neutron-tag-ports-during-bulk-creation: true
+      devstack_local_conf:
+        post-config:
+          $NEUTRON_CONF:
+            QUOTAS:
+              quota_router: 100
+              quota_floatingip: 500
+              quota_security_group: 150
+              quota_security_group_rule: 1000
+          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+          # devstack-tempest job will be switched to use lib/neutron instead of
+          # lib/neutron-legacy
+          /$NEUTRON_CORE_PLUGIN_CONF:
+            ml2:
+              type_drivers: flat,geneve,vlan,gre,local,vxlan
+            ml2_type_vlan:
+              network_vlan_ranges: foo:1:10
+            ml2_type_vxlan:
+              vni_ranges: 1:2000
+            ml2_type_gre:
+              tunnel_id_ranges: 1:1000
+          $NEUTRON_L3_CONF:
+            agent:
+              availability_zone: nova
+          $NEUTRON_DHCP_CONF:
+            agent:
+              availability_zone: nova
+          /etc/neutron/api-paste.ini:
+            composite:neutronapi_v2_0:
+              use: call:neutron.auth:pipeline_factory
+              noauth: cors request_id catch_errors osprofiler extensions neutronapiapp_v2_0
+              keystone: cors request_id catch_errors osprofiler authtoken keystonecontext extensions neutronapiapp_v2_0
+        test-config:
+          $TEMPEST_CONFIG:
+            neutron_plugin_options:
+              provider_vlans: foo,
+              agent_availability_zone: nova
+              image_is_advanced: true
+              available_type_drivers: flat,geneve,vlan,gre,local,vxlan
+              provider_net_base_segm_id: 1
+    irrelevant-files: &tempest-irrelevant-files
+      - ^(test-|)requirements.txt$
+      - ^releasenotes/.*$
+      - ^doc/.*$
+      - ^setup.cfg$
+      - ^.*\.rst$
+      - ^neutron/locale/.*$
+      - ^neutron/tests/unit/.*$
+      - ^tools/.*$
+      - ^tox.ini$
+
+- job:
+    name: neutron-tempest-plugin-scenario
+    parent: neutron-tempest-plugin-base
+    abstract: true
+    description: |
+      Perform setup common to all tempest scenario test jobs.
+    vars:
+      # NOTE(slaweq): in case of some tests, which requires advanced image,
+      # default test timeout set to 1200 seconds may be not enough if job is
+      # run on slow node
+      tempest_test_timeout: 2400
+      tempest_test_regex: ^neutron_tempest_plugin\.scenario
+      devstack_localrc:
+        PHYSICAL_NETWORK: default
+        IMAGE_URLS: https://cloud-images.ubuntu.com/releases/xenial/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img
+        ADVANCED_IMAGE_NAME: ubuntu-16.04-server-cloudimg-amd64-disk1
+        ADVANCED_INSTANCE_TYPE: ds512M
+        ADVANCED_INSTANCE_USER: ubuntu
+        BUILD_TIMEOUT: 784
+      devstack_services:
+        cinder: true
+
diff --git a/zuul.d/master_jobs.yaml b/zuul.d/master_jobs.yaml
new file mode 100644
index 0000000..d4927c5
--- /dev/null
+++ b/zuul.d/master_jobs.yaml
@@ -0,0 +1,491 @@
+- job:
+    name: neutron-tempest-plugin-api
+    parent: neutron-tempest-plugin-base
+    vars:
+      # TODO(slaweq): find a way to put this list of extensions in
+      # neutron repository and keep it different per branch,
+      # then it could be removed from here
+      network_api_extensions_common: &api_extensions
+        - address-scope
+        - agent
+        - allowed-address-pairs
+        - auto-allocated-topology
+        - availability_zone
+        - binding
+        - default-subnetpools
+        - dhcp_agent_scheduler
+        - dns-domain-ports
+        - dns-integration
+        - empty-string-filtering
+        - expose-port-forwarding-in-fip
+        - expose-l3-conntrack-helper
+        - ext-gw-mode
+        - external-net
+        - extra_dhcp_opt
+        - extraroute
+        - extraroute-atomic
+        - filter-validation
+        - fip-port-details
+        - flavors
+        - floating-ip-port-forwarding
+        - floatingip-pools
+        - ip-substring-filtering
+        - l3-conntrack-helper
+        - l3-flavors
+        - l3-ha
+        - l3_agent_scheduler
+        - logging
+        - metering
+        - multi-provider
+        - net-mtu
+        - net-mtu-writable
+        - network-ip-availability
+        - network_availability_zone
+        - network-segment-range
+        - pagination
+        - port-resource-request
+        - port-mac-address-regenerate
+        - port-security
+        - port-security-groups-filtering
+        - project-id
+        - provider
+        - qos
+        - qos-bw-minimum-ingress
+        - qos-fip
+        - quotas
+        - quota_details
+        - rbac-address-scope
+        - rbac-policies
+        - rbac-security-groups
+        - rbac-subnetpool
+        - router
+        - router-admin-state-down-before-update
+        - router_availability_zone
+        - security-group
+        - segment
+        - service-type
+        - sorting
+        - standard-attr-description
+        - standard-attr-revisions
+        - standard-attr-segment
+        - standard-attr-tag
+        - standard-attr-timestamp
+        - subnet_allocation
+        - subnet-dns-publish-fixed-ip
+        - subnetpool-prefix-ops
+        - tag-ports-during-bulk-creation
+        - trunk
+        - trunk-details
+        - uplink-status-propagation
+      network_api_extensions_tempest:
+        - dvr
+      tempest_test_regex: ^neutron_tempest_plugin\.api
+      devstack_services:
+        neutron-log: true
+      devstack_local_conf:
+        post-config:
+          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+          # devstack-tempest job will be switched to use lib/neutron instead of
+          # lib/neutron-legacy
+          /$NEUTRON_CORE_PLUGIN_CONF:
+            AGENT:
+              tunnel_types: gre,vxlan
+            network_log:
+              local_output_log_base: /tmp/test_log.log
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch
+    parent: neutron-tempest-plugin-scenario
+    timeout: 10000
+    vars:
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        Q_AGENT: openvswitch
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+      devstack_local_conf:
+        post-config:
+          $NEUTRON_CONF:
+            DEFAULT:
+              enable_dvr: false
+          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+          # devstack-tempest job will be switched to use lib/neutron instead of
+          # lib/neutron-legacy
+          /$NEUTRON_CORE_PLUGIN_CONF:
+            agent:
+              tunnel_types: vxlan,gre
+            ovs:
+              tunnel_bridge: br-tun
+              bridge_mappings: public:br-ex
+        test-config:
+          $TEMPEST_CONFIG:
+            neutron_plugin_options:
+              available_type_drivers: flat,vlan,local,vxlan
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    parent: neutron-tempest-plugin-scenario
+    timeout: 10000
+    vars:
+      network_api_extensions: *api_extensions
+      # TODO(slaweq): remove trunks subport_connectivity test from blacklist
+      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
+      tempest_black_regex: "(^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)"
+      devstack_localrc:
+        Q_AGENT: openvswitch
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+      devstack_local_conf:
+        post-config:
+          $NEUTRON_CONF:
+            DEFAULT:
+              enable_dvr: false
+          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+          # devstack-tempest job will be switched to use lib/neutron instead of
+          # lib/neutron-legacy
+          /$NEUTRON_CORE_PLUGIN_CONF:
+            agent:
+              tunnel_types: vxlan,gre
+            ovs:
+              tunnel_bridge: br-tun
+              bridge_mappings: public:br-ex
+            securitygroup:
+              firewall_driver: iptables_hybrid
+        test-config:
+          $TEMPEST_CONFIG:
+            neutron_plugin_options:
+              available_type_drivers: flat,vlan,local,vxlan
+
+- job:
+    name: neutron-tempest-plugin-scenario-linuxbridge
+    parent: neutron-tempest-plugin-scenario
+    timeout: 10000
+    vars:
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        Q_AGENT: linuxbridge
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+      devstack_local_conf:
+        post-config:
+          $NEUTRON_CONF:
+            DEFAULT:
+              enable_dvr: false
+            AGENT:
+              debug_iptables_rules: true
+          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+          # devstack-tempest job will be switched to use lib/neutron instead of
+          # lib/neutron-legacy
+          /$NEUTRON_CORE_PLUGIN_CONF:
+            ml2:
+              type_drivers: flat,vlan,local,vxlan
+        test-config:
+          $TEMPEST_CONFIG:
+            neutron_plugin_options:
+              available_type_drivers: flat,vlan,local,vxlan
+              q_agent: linuxbridge
+
+- job:
+    name: neutron-tempest-plugin-dvr-multinode-scenario
+    parent: tempest-multinode-full
+    description: |
+        Perform setup for Neutron tempest tests in multinode with DVR scenario
+    roles:
+      - zuul: openstack/devstack
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - openstack/neutron-tempest-plugin
+      - openstack/tempest
+    pre-run: playbooks/dvr-multinode-scenario-pre-run.yaml
+    voting: false
+    vars:
+      tempest_concurrency: 4
+      tox_envlist: all
+      tempest_test_regex: ^neutron_tempest_plugin\.scenario
+      # NOTE(slaweq): in case of some tests, which requires advanced image,
+      # default test timeout set to 1200 seconds may be not enough if job is
+      # run on slow node
+      tempest_test_timeout: 2400
+      network_api_extensions_common: *api_extensions
+      network_api_extensions_dvr:
+        - dvr
+      devstack_localrc:
+        USE_PYTHON3: true
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_dvr) | join(',') }}"
+        PHYSICAL_NETWORK: default
+        IMAGE_URLS: https://cloud-images.ubuntu.com/releases/xenial/release/ubuntu-16.04-server-cloudimg-amd64-disk1.img
+        ADVANCED_IMAGE_NAME: ubuntu-16.04-server-cloudimg-amd64-disk1
+        ADVANCED_INSTANCE_TYPE: ds512M
+        ADVANCED_INSTANCE_USER: ubuntu
+        BUILD_TIMEOUT: 784
+      devstack_plugins:
+        neutron: https://opendev.org/openstack/neutron.git
+        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
+      tempest_plugins:
+        - neutron-tempest-plugin
+      devstack_services:
+        tls-proxy: false
+        tempest: true
+        neutron-dns: true
+        neutron-qos: true
+        neutron-segments: true
+        neutron-trunk: true
+        neutron-log: true
+        neutron-port-forwarding: true
+        cinder: true
+      devstack_local_conf:
+        post-config:
+          $NEUTRON_CONF:
+            quotas:
+              quota_router: 100
+              quota_floatingip: 500
+              quota_security_group: 100
+              quota_security_group_rule: 1000
+            DEFAULT:
+              router_distributed: True
+          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+          # devstack-tempest job will be switched to use lib/neutron instead of
+          # lib/neutron-legacy
+          "/$NEUTRON_CORE_PLUGIN_CONF":
+            ml2:
+              type_drivers: flat,geneve,vlan,gre,local,vxlan
+              mechanism_drivers: openvswitch,l2population
+            ml2_type_vlan:
+              network_vlan_ranges: foo:1:10
+            ml2_type_vxlan:
+              vni_ranges: 1:2000
+            ml2_type_gre:
+              tunnel_id_ranges: 1:1000
+            agent:
+              enable_distributed_routing: True
+              l2_population: True
+              tunnel_types: vxlan,gre
+            ovs:
+              tunnel_bridge: br-tun
+              bridge_mappings: public:br-ex
+          $NEUTRON_L3_CONF:
+            DEFAULT:
+              agent_mode: dvr_snat
+            agent:
+              availability_zone: nova
+          $NEUTRON_DHCP_CONF:
+            agent:
+              availability_zone: nova
+          "/etc/neutron/api-paste.ini":
+            "composite:neutronapi_v2_0":
+              use: "call:neutron.auth:pipeline_factory"
+              noauth: "cors request_id catch_errors osprofiler extensions neutronapiapp_v2_0"
+              keystone: "cors request_id catch_errors osprofiler authtoken keystonecontext extensions neutronapiapp_v2_0"
+        test-config:
+          $TEMPEST_CONFIG:
+            neutron_plugin_options:
+              provider_vlans: foo,
+              agent_availability_zone: nova
+              image_is_advanced: true
+              available_type_drivers: flat,geneve,vlan,gre,local,vxlan
+              l3_agent_mode: dvr_snat
+    group-vars:
+      subnode:
+        devstack_services:
+          tls-proxy: false
+          q-agt: true
+          q-l3: true
+          q-meta: true
+          neutron-qos: true
+          neutron-trunk: true
+          neutron-log: true
+          neutron-port-forwarding: true
+        devstack_localrc:
+          USE_PYTHON3: true
+        devstack_local_conf:
+          post-config:
+            $NEUTRON_CONF:
+              DEFAULT:
+                router_distributed: True
+            # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+            # devstack-tempest job will be switched to use lib/neutron instead of
+            # lib/neutron-legacy
+            "/$NEUTRON_CORE_PLUGIN_CONF":
+              agent:
+                enable_distributed_routing: True
+                l2_population: True
+                tunnel_types: vxlan,gre
+              ovs:
+                tunnel_bridge: br-tun
+                bridge_mappings: public:br-ex
+            $NEUTRON_L3_CONF:
+              DEFAULT:
+                agent_mode: dvr_snat
+              agent:
+                availability_zone: nova
+    irrelevant-files: &tempest-irrelevant-files
+      - ^(test-|)requirements.txt$
+      - ^releasenotes/.*$
+      - ^doc/.*$
+      - ^setup.cfg$
+      - ^.*\.rst$
+      - ^neutron.*/locale/.*$
+      - ^neutron.*/tests/unit/.*$
+      - ^tools/.*$
+      - ^tox.ini$
+
+- job:
+    name: neutron-tempest-plugin-designate-scenario
+    parent: neutron-tempest-plugin-scenario
+    description: Neutron designate integration scenario
+    required-projects:
+      - openstack/designate
+      - openstack/designate-dashboard
+      - openstack/designate-tempest-plugin
+    timeout: 3600
+    vars:
+      network_api_extensions_common: *api_extensions
+      devstack_localrc:
+        DESIGNATE_BACKEND_DRIVER: bind9
+        Q_AGENT: openvswitch
+        # In this job advanced image is not needed, so it's name should be
+        # empty
+        ADVANCED_IMAGE_NAME: ""
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions_common | join(',') }}"
+      devstack_local_conf:
+        post-config:
+          $NEUTRON_CONF:
+            DEFAULT:
+              enable_dvr: false
+          # NOTE(slaweq): We can get rid of this hardcoded absolute path when
+          # devstack-tempest job will be switched to use lib/neutron instead of
+          # lib/neutron-legacy
+          /$NEUTRON_CORE_PLUGIN_CONF:
+            agent:
+              tunnel_types: vxlan,gre
+            ovs:
+              tunnel_bridge: br-tun
+              bridge_mappings: public:br-ex
+      devstack_plugins:
+        designate: https://opendev.org/openstack/designate.git
+      devstack_services:
+        cinder: false
+        designate: true
+      tempest_plugins:
+        - designate-tempest-plugin
+        - neutron-tempest-plugin
+      tempest_test_regex: ^neutron_tempest_plugin\.scenario\.test_dns_integration
+    irrelevant-files: *tempest-irrelevant-files
+
+- job:
+    name: neutron-tempest-plugin-sfc
+    parent: neutron-tempest-plugin-base
+    timeout: 10800
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/networking-sfc
+      - openstack/neutron
+      - openstack/neutron-tempest-plugin
+      - openstack/tempest
+    vars:
+      network_api_extensions_common: *api_extensions
+      tempest_test_regex: ^neutron_tempest_plugin\.sfc
+      devstack_plugins:
+        networking-sfc: https://opendev.org/openstack/networking-sfc
+        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin
+      network_api_extensions_sfc:
+        - flow_classifier
+        - sfc
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_sfc) | join(',') }}"
+      # TODO(bcafarel): tests still fail from time to time in parallel
+      # https://bugs.launchpad.net/neutron/+bug/1851500
+      # https://bugs.launchpad.net/networking-sfc/+bug/1660366
+      tempest_concurrency: 1
+
+- job:
+    name: neutron-tempest-plugin-bgpvpn-bagpipe
+    parent: neutron-tempest-plugin-base
+    required-projects:
+      - openstack/networking-bagpipe
+      - openstack/networking-bgpvpn
+    vars:
+      tempest_test_regex: ^neutron_tempest_plugin\.bgpvpn
+      network_api_extensions: *api_extensions
+      network_api_extensions_bgpvpn:
+        - bgpvpn
+        - bgpvpn-routes-control
+      devstack_localrc:
+        NETWORKING_BGPVPN_DRIVER: "BGPVPN:BaGPipe:networking_bgpvpn.neutron.services.service_drivers.bagpipe.bagpipe_v2.BaGPipeBGPVPNDriver:default"
+        BAGPIPE_DATAPLANE_DRIVER_IPVPN: "ovs"
+        BAGPIPE_BGP_PEERS: "-"
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions + network_api_extensions_bgpvpn) | join(',') }}"
+      devstack_plugins:
+        networking-bgpvpn: https://git.openstack.org/openstack/networking-bgpvpn
+        networking-bagpipe: https://git.openstack.org/openstack/networking-bagpipe
+
+- job:
+    name: neutron-tempest-plugin-fwaas
+    parent: neutron-tempest-plugin-base
+    timeout: 10800
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron-fwaas
+      - openstack/neutron
+      - openstack/neutron-tempest-plugin
+      - openstack/tempest
+    vars:
+      tempest_test_regex: ^neutron_tempest_plugin\.fwaas
+      devstack_plugins:
+        neutron-fwaas: https://opendev.org/openstack/neutron-fwaas.git
+        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
+      network_api_extensions_common: *api_extensions
+      network_api_extensions_fwaas:
+        - fwaas_v2
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_fwaas) | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-dynamic-routing
+    parent: neutron-tempest-plugin-base
+    description: |
+      Perform setup common to all Neutron dynamic routing tempest tests
+    required-projects:
+      - openstack/neutron
+      - openstack/neutron-dynamic-routing
+      - openstack/os-ken
+      - openstack/tempest
+    pre-run: playbooks/dynamic-routing-pre-run.yaml
+    vars:
+      devstack_plugins:
+        neutron-dynamic-routing: https://opendev.org/openstack/neutron-dynamic-routing
+        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin
+      network_api_extensions_common: *api_extensions
+      network_api_extensions_bgp:
+        - bgp
+        - bgp_dragent_scheduler
+        - bgp_4byte_asn
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_bgp) | join(',') }}"
+      devstack_services:
+        neutron-dr: true
+        neutron-dr-agent: true
+        q-l3: true
+      tempest_concurrency: 1
+      tempest_test_regex: ^neutron_tempest_plugin\.neutron_dynamic_routing
+
+- job:
+    name: neutron-tempest-plugin-vpnaas
+    parent: neutron-tempest-plugin-base
+    timeout: 3900
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - openstack/neutron-vpnaas
+      - openstack/neutron-tempest-plugin
+      - openstack/tempest
+    vars:
+      tempest_test_regex: ^neutron_tempest_plugin\.vpnaas
+      devstack_plugins:
+        neutron-vpnaas: https://opendev.org/openstack/neutron-vpnaas.git
+        neutron-tempest-plugin: https://opendev.org/openstack/neutron-tempest-plugin.git
+      network_api_extensions_common: *api_extensions
+      network_api_extensions_vpnaas:
+        - vpnaas
+      devstack_localrc:
+        IPSEC_PACKAGE: strongswan
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_vpnaas) | join(',') }}"
+    irrelevant-files: *tempest-irrelevant-files
diff --git a/zuul.d/project.yaml b/zuul.d/project.yaml
new file mode 100644
index 0000000..7c46a9e
--- /dev/null
+++ b/zuul.d/project.yaml
@@ -0,0 +1,159 @@
+- project-template:
+    name: neutron-tempest-plugin-jobs
+    check:
+      jobs:
+        - neutron-tempest-plugin-api
+        - neutron-tempest-plugin-designate-scenario
+        - neutron-tempest-plugin-scenario-linuxbridge
+        - neutron-tempest-plugin-scenario-openvswitch
+        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    gate:
+      jobs:
+        - neutron-tempest-plugin-api
+        - neutron-tempest-plugin-scenario-linuxbridge
+        - neutron-tempest-plugin-scenario-openvswitch
+        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    #TODO(slaweq): Move neutron-tempest-plugin-dvr-multinode-scenario out of
+    #              the experimental queue when it will be more stable
+    experimental:
+      jobs:
+        - neutron-tempest-plugin-dvr-multinode-scenario
+
+
+- project-template:
+    name: neutron-tempest-plugin-jobs-queens
+    check:
+      jobs:
+        - neutron-tempest-plugin-api-queens
+        - neutron-tempest-plugin-dvr-multinode-scenario-queens
+        - neutron-tempest-plugin-scenario-linuxbridge-queens
+        - neutron-tempest-plugin-scenario-openvswitch-queens
+    gate:
+      jobs:
+        - neutron-tempest-plugin-api-queens
+    #TODO(slaweq): Move neutron-tempest-plugin-dvr-multinode-scenario out of
+    #              the experimental queue when it will be more stable
+    experimental:
+      jobs:
+        - neutron-tempest-plugin-dvr-multinode-scenario-queens
+
+
+- project-template:
+    name: neutron-tempest-plugin-jobs-rocky
+    check:
+      jobs:
+        - neutron-tempest-plugin-api-rocky
+        - neutron-tempest-plugin-designate-scenario-rocky
+        - neutron-tempest-plugin-scenario-linuxbridge-rocky
+        - neutron-tempest-plugin-scenario-openvswitch-rocky
+        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
+    gate:
+      jobs:
+        - neutron-tempest-plugin-api-rocky
+    #TODO(slaweq): Move neutron-tempest-plugin-dvr-multinode-scenario out of
+    #              the experimental queue when it will be more stable
+    experimental:
+      jobs:
+        - neutron-tempest-plugin-dvr-multinode-scenario-rocky
+
+
+- project-template:
+    name: neutron-tempest-plugin-jobs-stein
+    check:
+      jobs:
+        - neutron-tempest-plugin-api-stein
+        - neutron-tempest-plugin-designate-scenario-stein
+        - neutron-tempest-plugin-scenario-linuxbridge-stein
+        - neutron-tempest-plugin-scenario-openvswitch-stein
+        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-stein
+    gate:
+      jobs:
+        - neutron-tempest-plugin-api-stein
+    #TODO(slaweq): Move neutron-tempest-plugin-dvr-multinode-scenario out of
+    #              the experimental queue when it will be more stable
+    experimental:
+      jobs:
+        - neutron-tempest-plugin-dvr-multinode-scenario-stein
+
+
+- project-template:
+    name: neutron-tempest-plugin-jobs-train
+    check:
+      jobs:
+        - neutron-tempest-plugin-api-train
+        - neutron-tempest-plugin-designate-scenario-train
+        - neutron-tempest-plugin-scenario-linuxbridge-train
+        - neutron-tempest-plugin-scenario-openvswitch-train
+        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-train
+    gate:
+      jobs:
+        - neutron-tempest-plugin-api-train
+    #TODO(slaweq): Move neutron-tempest-plugin-dvr-multinode-scenario out of
+    #              the experimental queue when it will be more stable
+    experimental:
+      jobs:
+        - neutron-tempest-plugin-dvr-multinode-scenario-train
+
+
+- project-template:
+    name: neutron-tempest-plugin-jobs-ussuri
+    check:
+      jobs:
+        - neutron-tempest-plugin-api-ussuri
+        - neutron-tempest-plugin-designate-scenario-ussuri
+        - neutron-tempest-plugin-scenario-linuxbridge-ussuri
+        - neutron-tempest-plugin-scenario-openvswitch-ussuri
+        - neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-ussuri
+    gate:
+      jobs:
+        - neutron-tempest-plugin-api-ussuri
+    #TODO(slaweq): Move neutron-tempest-plugin-dvr-multinode-scenario out of
+    #              the experimental queue when it will be more stable
+    experimental:
+      jobs:
+        - neutron-tempest-plugin-dvr-multinode-scenario-ussuri
+
+
+- project:
+    templates:
+      - build-openstack-docs-pti
+      - neutron-tempest-plugin-jobs
+      - neutron-tempest-plugin-jobs-stein
+      - neutron-tempest-plugin-jobs-train
+      - neutron-tempest-plugin-jobs-ussuri
+      - check-requirements
+      - tempest-plugin-jobs
+      - release-notes-jobs-python3
+    check:
+      jobs:
+        - neutron-tempest-plugin-sfc
+        - neutron-tempest-plugin-sfc-train
+        - neutron-tempest-plugin-sfc-ussuri
+        - neutron-tempest-plugin-bgpvpn-bagpipe
+        - neutron-tempest-plugin-bgpvpn-bagpipe-train
+        - neutron-tempest-plugin-bgpvpn-bagpipe-ussuri
+        - neutron-tempest-plugin-fwaas:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
+            voting: false
+        - neutron-tempest-plugin-fwaas-train:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
+            voting: false
+        - neutron-tempest-plugin-fwaas-ussuri:
+            # TODO(slaweq): switch it to be voting when bug
+            # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
+            voting: false
+        - neutron-tempest-plugin-dynamic-routing
+        - neutron-tempest-plugin-dynamic-routing-ussuri
+        - neutron-tempest-plugin-vpnaas
+        - neutron-tempest-plugin-vpnaas-ussuri
+
+    gate:
+      jobs:
+        - neutron-tempest-plugin-sfc
+        - neutron-tempest-plugin-bgpvpn-bagpipe
+        # TODO(slaweq): bring it back to gate queue
+        # https://bugs.launchpad.net/neutron/+bug/1858645 will be fixed
+        # - neutron-tempest-plugin-fwaas
+        - neutron-tempest-plugin-dynamic-routing
diff --git a/zuul.d/queens_jobs.yaml b/zuul.d/queens_jobs.yaml
new file mode 100644
index 0000000..2b52978
--- /dev/null
+++ b/zuul.d/queens_jobs.yaml
@@ -0,0 +1,179 @@
+- job:
+    name: neutron-tempest-plugin-api-queens
+    nodeset: openstack-single-node-xenial
+    parent: neutron-tempest-plugin-api
+    override-checkout: stable/queens
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 0.3.0
+      - openstack/tempest
+    vars:
+      branch_override: stable/queens
+      # TODO(slaweq): find a way to put this list of extensions in
+      # neutron repository and keep it different per branch,
+      # then it could be removed from here
+      network_api_extensions_common: &api_extensions
+        - address-scope
+        - agent
+        - allowed-address-pairs
+        - auto-allocated-topology
+        - availability_zone
+        - binding
+        - default-subnetpools
+        - dhcp_agent_scheduler
+        - dns-domain-ports
+        - dns-integration
+        - ext-gw-mode
+        - external-net
+        - extra_dhcp_opt
+        - extraroute
+        - flavors
+        - ip-substring-filtering
+        - l3-flavors
+        - l3-ha
+        - l3_agent_scheduler
+        - logging
+        - metering
+        - multi-provider
+        - net-mtu
+        - net-mtu-writable
+        - network-ip-availability
+        - network_availability_zone
+        - pagination
+        - port-security
+        - project-id
+        - provider
+        - qos
+        - qos-fip
+        - quotas
+        - quota_details
+        - rbac-policies
+        - router
+        - router_availability_zone
+        - security-group
+        - segment
+        - service-type
+        - sorting
+        - standard-attr-description
+        - standard-attr-revisions
+        - standard-attr-timestamp
+        - standard-attr-tag
+        - subnet_allocation
+        - trunk
+        - trunk-details
+      network_api_extensions_tempest:
+        - dvr
+      devstack_localrc:
+        USE_PYTHON3: false
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+
+
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-queens
+    parent: neutron-tempest-plugin-scenario-openvswitch
+    nodeset: openstack-single-node-xenial
+    override-checkout: stable/queens
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 0.3.0
+      - openstack/tempest
+    vars:
+      branch_override: stable/queens
+      network_api_extensions: *api_extensions
+      # TODO(slaweq): remove trunks subport_connectivity test from blacklist
+      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
+      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
+      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)|\
+          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
+      devstack_localrc:
+        USE_PYTHON3: false
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+
+- job:
+    name: neutron-tempest-plugin-scenario-linuxbridge-queens
+    parent: neutron-tempest-plugin-scenario-linuxbridge
+    nodeset: openstack-single-node-xenial
+    override-checkout: stable/queens
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 0.3.0
+      - openstack/tempest
+    vars:
+      branch_override: stable/queens
+      network_api_extensions: *api_extensions
+      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
+      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
+      devstack_localrc:
+        USE_PYTHON3: false
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+      devstack_local_conf:
+        test-config:
+          # NOTE: ignores linux bridge's trunk delete on bound port test
+          # for queens branch (as https://review.opendev.org/#/c/605589/
+          # fix will not apply for queens branch)
+          $TEMPEST_CONFIG:
+            neutron_plugin_options:
+              q_agent: None
+
+- job:
+    name: neutron-tempest-plugin-dvr-multinode-scenario-queens
+    parent: neutron-tempest-plugin-dvr-multinode-scenario
+    nodeset: openstack-two-node-xenial
+    override-checkout: stable/queens
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 0.3.0
+      - openstack/tempest
+    vars:
+      branch_override: stable/queens
+      network_api_extensions_common: *api_extensions
+      # TODO(slaweq): remove trunks subport_connectivity test from blacklist
+      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
+      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
+      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)|\
+          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
+      devstack_localrc:
+        USE_PYTHON3: false
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+
+- job:
+    name: neutron-tempest-plugin-designate-scenario-queens
+    parent: neutron-tempest-plugin-designate-scenario
+    nodeset: openstack-single-node-xenial
+    override-checkout: stable/queens
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 0.3.0
+      - name: openstack/designate-tempest-plugin
+        override-checkout: 0.7.0
+      - openstack/tempest
+    vars:
+      branch_override: stable/queens
+      network_api_extensions_common: *api_extensions
+      # NOTE(bcafarel): remove DNS test as queens pinned version does not have
+      # fix for https://bugs.launchpad.net/neutron/+bug/1826419
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_internal_dns.InternalDNSTest.test_dns_domain_and_name)"
+      devstack_localrc:
+        USE_PYTHON3: false
+        TEMPEST_PLUGINS: '"/opt/stack/designate-tempest-plugin /opt/stack/neutron-tempest-plugin"'
diff --git a/zuul.d/rocky_jobs.yaml b/zuul.d/rocky_jobs.yaml
new file mode 100644
index 0000000..a45cae8
--- /dev/null
+++ b/zuul.d/rocky_jobs.yaml
@@ -0,0 +1,299 @@
+- job:
+    name: neutron-tempest-plugin-api-rocky
+    nodeset: openstack-single-node-xenial
+    parent: neutron-tempest-plugin-api
+    description: |
+      This job run on py2 for stable/rocky gate.
+    override-checkout: stable/rocky
+    required-projects: &required-projects-rocky
+      - openstack/devstack-gate
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 0.9.0
+      - openstack/tempest
+    vars: &api_vars_rocky
+      branch_override: stable/rocky
+      # TODO(slaweq): find a way to put this list of extensions in
+      # neutron repository and keep it different per branch,
+      # then it could be removed from here
+      network_api_extensions_common: &api_extensions
+        - address-scope
+        - agent
+        - allowed-address-pairs
+        - auto-allocated-topology
+        - availability_zone
+        - binding
+        - default-subnetpools
+        - dhcp_agent_scheduler
+        - dns-domain-ports
+        - dns-integration
+        - empty-string-filtering
+        - expose-port-forwarding-in-fip
+        - ext-gw-mode
+        - external-net
+        - extra_dhcp_opt
+        - extraroute
+        - fip-port-details
+        - flavors
+        - floating-ip-port-forwarding
+        - ip-substring-filtering
+        - l3-flavors
+        - l3-ha
+        - l3_agent_scheduler
+        - logging
+        - metering
+        - multi-provider
+        - net-mtu
+        - net-mtu-writable
+        - network-ip-availability
+        - network_availability_zone
+        - pagination
+        - port-mac-address-regenerate
+        - port-security
+        - port-security-groups-filtering
+        - project-id
+        - provider
+        - qos
+        - qos-fip
+        - quotas
+        - quota_details
+        - rbac-policies
+        - router
+        - router_availability_zone
+        - security-group
+        - segment
+        - service-type
+        - sorting
+        - standard-attr-description
+        - standard-attr-revisions
+        - standard-attr-segment
+        - standard-attr-timestamp
+        - standard-attr-tag
+        - subnet_allocation
+        - trunk
+        - trunk-details
+      network_api_extensions_tempest:
+        - dvr
+      devstack_localrc:
+        USE_PYTHON3: false
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+    # NOTE(gmann): This job run on py2 for stable/rocky gate.
+    branches:
+      - stable/rocky
+
+- job:
+    name: neutron-tempest-plugin-api-rocky
+    nodeset: openstack-single-node-xenial
+    parent: neutron-tempest-plugin-api
+    description: |
+      This job run on py3 for other than stable/rocky gate
+      which is nothing but neutron-tempest-pluign master gate.
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars:
+      <<: *api_vars_rocky
+      devstack_localrc:
+        USE_PYTHON3: True
+    branches: ^(?!stable/rocky).*$
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-rocky
+    parent: neutron-tempest-plugin-scenario-openvswitch
+    description: |
+      This job run on py2 for stable/rocky gate.
+    nodeset: openstack-single-node-xenial
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars: &scenario_vars_rocky
+      branch_override: stable/rocky
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        USE_PYTHON3: false
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+      # NOTE(bcafarel): newer tests, unstable on rocky branch
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
+          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
+    branches:
+      - stable/rocky
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-rocky
+    parent: neutron-tempest-plugin-scenario-openvswitch
+    nodeset: openstack-single-node-xenial
+    description: |
+      This job run on py3 for other than stable/rocky gate
+      which is nothing but neutron-tempest-pluign master gate.
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars:
+      <<: *scenario_vars_rocky
+      devstack_localrc:
+        USE_PYTHON3: True
+    branches: ^(?!stable/rocky).*$
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
+    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    nodeset: openstack-single-node-xenial
+    description: |
+      This job run on py2 for stable/rocky gate.
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars: &openvswitch_vars_rocky
+      branch_override: stable/rocky
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        USE_PYTHON3: false
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+      # TODO(bcafarel): remove trunks subport_connectivity test from blacklist
+      # when bug https://bugs.launchpad.net/neutron/+bug/1838760 will be fixed
+      # NOTE(bcafarel): other are newer tests, unstable on rocky branch
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_trunk.TrunkTest.test_subport_connectivity)|\
+          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
+          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
+    branches:
+      - stable/rocky
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-rocky
+    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    nodeset: openstack-single-node-xenial
+    description: |
+      This job run on py3 for other than stable/rocky gate
+      which is nothing but neutron-tempest-pluign master gate.
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars:
+      <<: *openvswitch_vars_rocky
+      devstack_localrc:
+        USE_PYTHON3: True
+    branches: ^(?!stable/rocky).*$
+
+- job:
+    name: neutron-tempest-plugin-scenario-linuxbridge-rocky
+    parent: neutron-tempest-plugin-scenario-linuxbridge
+    description: |
+      This job run on py2 for stable/rocky gate.
+    nodeset: openstack-single-node-xenial
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars: &linuxbridge_vars_rocky
+      branch_override: stable/rocky
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        USE_PYTHON3: false
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+      devstack_local_conf:
+        test-config:
+          # NOTE: ignores linux bridge's trunk delete on bound port test
+          # for rocky branch (as https://review.opendev.org/#/c/605589/
+          # fix will not apply for rocky branch)
+          $TEMPEST_CONFIG:
+            neutron_plugin_options:
+              q_agent: None
+      # NOTE(bcafarel): newer tests, unstable on rocky branch
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
+          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
+    branches:
+      - stable/rocky
+
+- job:
+    name: neutron-tempest-plugin-scenario-linuxbridge-rocky
+    parent: neutron-tempest-plugin-scenario-linuxbridge
+    nodeset: openstack-single-node-xenial
+    description: |
+      This job run on py3 for other than stable/rocky gate
+      which is nothing but neutron-tempest-pluign master gate.
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars:
+      <<: *linuxbridge_vars_rocky
+      devstack_localrc:
+        USE_PYTHON3: True
+    branches: ^(?!stable/rocky).*$
+
+- job:
+    name: neutron-tempest-plugin-dvr-multinode-scenario-rocky
+    parent: neutron-tempest-plugin-dvr-multinode-scenario
+    description: |
+      This job run on py2 for stable/rocky gate.
+    nodeset: openstack-two-node-xenial
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars: &multinode_scenario_vars_rocky
+      branch_override: stable/rocky
+      network_api_extensions_common: *api_extensions
+      devstack_localrc:
+        USE_PYTHON3: false
+        TEMPEST_PLUGINS: /opt/stack/neutron-tempest-plugin
+      # NOTE(bcafarel): newer tests, unstable on rocky branch
+      tempest_black_regex: "\
+          (^neutron_tempest_plugin.scenario.test_port_forwardings.PortForwardingTestJSON.test_port_forwarding_to_2_servers)|\
+          (^neutron_tempest_plugin.scenario.test_security_groups.NetworkSecGroupTest.test_multiple_ports_portrange_remote)"
+    branches:
+      - stable/rocky
+
+- job:
+    name: neutron-tempest-plugin-dvr-multinode-scenario-rocky
+    parent: neutron-tempest-plugin-dvr-multinode-scenario
+    nodeset: openstack-two-node-xenial
+    description: |
+      This job run on py3 for other than stable/rocky gate
+      which is nothing but neutron-tempest-pluign master gate.
+    override-checkout: stable/rocky
+    vars:
+      <<: *multinode_scenario_vars_rocky
+      devstack_localrc:
+        USE_PYTHON3: True
+    required-projects: *required-projects-rocky
+    group-vars:
+      subnode:
+        devstack_localrc:
+          USE_PYTHON3: True
+    branches: ^(?!stable/rocky).*$
+
+- job:
+    name: neutron-tempest-plugin-designate-scenario-rocky
+    parent: neutron-tempest-plugin-designate-scenario
+    description: |
+      This job run on py2 for stable/rocky gate.
+    nodeset: openstack-single-node-xenial
+    override-checkout: stable/rocky
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - name: openstack/neutron-tempest-plugin
+        override-checkout: 0.9.0
+      - name: openstack/designate-tempest-plugin
+        override-checkout: 0.7.0
+      - openstack/tempest
+    vars: &designate_scenario_vars_rocky
+      branch_override: stable/rocky
+      network_api_extensions_common: *api_extensions
+      devstack_localrc:
+        USE_PYTHON3: false
+        TEMPEST_PLUGINS: '"/opt/stack/designate-tempest-plugin /opt/stack/neutron-tempest-plugin"'
+    branches:
+      - stable/rocky
+
+- job:
+    name: neutron-tempest-plugin-designate-scenario-rocky
+    parent: neutron-tempest-plugin-designate-scenario
+    nodeset: openstack-single-node-xenial
+    description: |
+      This job run on py3 for other than stable/rocky gate
+      which is nothing but neutron-tempest-plugin master gate.
+    override-checkout: stable/rocky
+    required-projects: *required-projects-rocky
+    vars:
+      <<: *designate_scenario_vars_rocky
+      devstack_localrc:
+        USE_PYTHON3: True
+    branches: ^(?!stable/rocky).*$
diff --git a/zuul.d/stein_jobs.yaml b/zuul.d/stein_jobs.yaml
new file mode 100644
index 0000000..1c9e299
--- /dev/null
+++ b/zuul.d/stein_jobs.yaml
@@ -0,0 +1,129 @@
+- job:
+    name: neutron-tempest-plugin-api-stein
+    parent: neutron-tempest-plugin-api
+    override-checkout: stable/stein
+    vars:
+      branch_override: stable/stein
+      # TODO(slaweq): find a way to put this list of extensions in
+      # neutron repository and keep it different per branch,
+      # then it could be removed from here
+      network_api_extensions_common: &api_extensions
+        - address-scope
+        - agent
+        - allowed-address-pairs
+        - auto-allocated-topology
+        - availability_zone
+        - binding
+        - default-subnetpools
+        - dhcp_agent_scheduler
+        - dns-domain-ports
+        - dns-integration
+        - empty-string-filtering
+        - expose-port-forwarding-in-fip
+        - ext-gw-mode
+        - external-net
+        - extra_dhcp_opt
+        - extraroute
+        - filter-validation
+        - fip-port-details
+        - flavors
+        - floatingip-pools
+        - floating-ip-port-forwarding
+        - ip-substring-filtering
+        - l3-flavors
+        - l3-ha
+        - l3_agent_scheduler
+        - logging
+        - metering
+        - multi-provider
+        - net-mtu
+        - net-mtu-writable
+        - network-ip-availability
+        - network_availability_zone
+        - network-segment-range
+        - pagination
+        - port-resource-request
+        - port-mac-address-regenerate
+        - port-security
+        - port-security-groups-filtering
+        - project-id
+        - provider
+        - qos
+        - qos-bw-minimum-ingress
+        - qos-fip
+        - quotas
+        - quota_details
+        - rbac-policies
+        - rbac-security-groups
+        - router
+        - router_availability_zone
+        - security-group
+        - segment
+        - service-type
+        - sorting
+        - standard-attr-description
+        - standard-attr-revisions
+        - standard-attr-segment
+        - standard-attr-tag
+        - standard-attr-timestamp
+        - subnet_allocation
+        - trunk
+        - trunk-details
+        - uplink-status-propagation
+      network_api_extensions_tempest:
+        - dvr
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-stein
+    parent: neutron-tempest-plugin-scenario-openvswitch
+    override-checkout: stable/stein
+    vars:
+      branch_override: stable/stein
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-stein
+    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    override-checkout: stable/stein
+    vars:
+      branch_override: stable/stein
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-linuxbridge-stein
+    parent: neutron-tempest-plugin-scenario-linuxbridge
+    override-checkout: stable/stein
+    vars:
+      branch_override: stable/stein
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-dvr-multinode-scenario-stein
+    parent: neutron-tempest-plugin-dvr-multinode-scenario
+    override-checkout: stable/stein
+    vars:
+      network_api_extensions_common: *api_extensions
+      branch_override: stable/stein
+
+- job:
+    name: neutron-tempest-plugin-designate-scenario-stein
+    parent: neutron-tempest-plugin-designate-scenario
+    override-checkout: stable/stein
+    required-projects:
+      - openstack/devstack-gate
+      - openstack/neutron
+      - openstack/neutron-tempest-plugin
+      - name: openstack/designate-tempest-plugin
+        override-checkout: 0.7.0
+      - openstack/tempest
+    vars:
+      branch_override: stable/stein
+      network_api_extensions_common: *api_extensions
diff --git a/zuul.d/train_jobs.yaml b/zuul.d/train_jobs.yaml
new file mode 100644
index 0000000..f2dd6b7
--- /dev/null
+++ b/zuul.d/train_jobs.yaml
@@ -0,0 +1,151 @@
+- job:
+    name: neutron-tempest-plugin-api-train
+    parent: neutron-tempest-plugin-api
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      # TODO(slaweq): find a way to put this list of extensions in
+      # neutron repository and keep it different per branch,
+      # then it could be removed from here
+      network_api_extensions_common: &api_extensions
+        - address-scope
+        - agent
+        - allowed-address-pairs
+        - auto-allocated-topology
+        - availability_zone
+        - binding
+        - default-subnetpools
+        - dhcp_agent_scheduler
+        - dns-domain-ports
+        - dns-integration
+        - empty-string-filtering
+        - expose-port-forwarding-in-fip
+        - expose-l3-conntrack-helper
+        - ext-gw-mode
+        - external-net
+        - extra_dhcp_opt
+        - extraroute
+        - extraroute-atomic
+        - filter-validation
+        - fip-port-details
+        - flavors
+        - floating-ip-port-forwarding
+        - floatingip-pools
+        - ip-substring-filtering
+        - l3-conntrack-helper
+        - l3-flavors
+        - l3-ha
+        - l3_agent_scheduler
+        - logging
+        - metering
+        - multi-provider
+        - net-mtu
+        - net-mtu-writable
+        - network-ip-availability
+        - network_availability_zone
+        - network-segment-range
+        - pagination
+        - port-resource-request
+        - port-mac-address-regenerate
+        - port-security
+        - port-security-groups-filtering
+        - project-id
+        - provider
+        - qos
+        - qos-bw-minimum-ingress
+        - qos-fip
+        - quotas
+        - quota_details
+        - rbac-policies
+        - rbac-security-groups
+        - router
+        - router-admin-state-down-before-update
+        - router_availability_zone
+        - security-group
+        - segment
+        - service-type
+        - sorting
+        - standard-attr-description
+        - standard-attr-revisions
+        - standard-attr-segment
+        - standard-attr-tag
+        - standard-attr-timestamp
+        - subnet_allocation
+        - subnetpool-prefix-ops
+        - trunk
+        - trunk-details
+        - uplink-status-propagation
+      network_api_extensions_tempest:
+        - dvr
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-train
+    parent: neutron-tempest-plugin-scenario-openvswitch
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-train
+    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-linuxbridge-train
+    parent: neutron-tempest-plugin-scenario-linuxbridge
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-dvr-multinode-scenario-train
+    parent: neutron-tempest-plugin-dvr-multinode-scenario
+    override-checkout: stable/train
+    vars:
+      network_api_extensions_common: *api_extensions
+      branch_override: stable/train
+
+- job:
+    name: neutron-tempest-plugin-designate-scenario-train
+    parent: neutron-tempest-plugin-designate-scenario
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      network_api_extensions_common: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-sfc-train
+    parent: neutron-tempest-plugin-sfc
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      network_api_extensions_common: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-bgpvpn-bagpipe-train
+    parent: neutron-tempest-plugin-bgpvpn-bagpipe
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      network_api_extensions: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-fwaas-train
+    parent: neutron-tempest-plugin-fwaas
+    override-checkout: stable/train
+    vars:
+      branch_override: stable/train
+      network_api_extensions_common: *api_extensions
diff --git a/zuul.d/ussuri_jobs.yaml b/zuul.d/ussuri_jobs.yaml
new file mode 100644
index 0000000..a9c369f
--- /dev/null
+++ b/zuul.d/ussuri_jobs.yaml
@@ -0,0 +1,171 @@
+- job:
+    name: neutron-tempest-plugin-api-ussuri
+    parent: neutron-tempest-plugin-api
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      # TODO(slaweq): find a way to put this list of extensions in
+      # neutron repository and keep it different per branch,
+      # then it could be removed from here
+      network_api_extensions_common: &api_extensions
+        - address-scope
+        - agent
+        - allowed-address-pairs
+        - auto-allocated-topology
+        - availability_zone
+        - binding
+        - default-subnetpools
+        - dhcp_agent_scheduler
+        - dns-domain-ports
+        - dns-integration
+        - empty-string-filtering
+        - expose-port-forwarding-in-fip
+        - expose-l3-conntrack-helper
+        - ext-gw-mode
+        - external-net
+        - extra_dhcp_opt
+        - extraroute
+        - extraroute-atomic
+        - filter-validation
+        - fip-port-details
+        - flavors
+        - floating-ip-port-forwarding
+        - floatingip-pools
+        - ip-substring-filtering
+        - l3-conntrack-helper
+        - l3-flavors
+        - l3-ha
+        - l3_agent_scheduler
+        - logging
+        - metering
+        - multi-provider
+        - net-mtu
+        - net-mtu-writable
+        - network-ip-availability
+        - network_availability_zone
+        - network-segment-range
+        - pagination
+        - port-resource-request
+        - port-mac-address-regenerate
+        - port-security
+        - port-security-groups-filtering
+        - project-id
+        - provider
+        - qos
+        - qos-bw-minimum-ingress
+        - qos-fip
+        - quotas
+        - quota_details
+        - rbac-address-scope
+        - rbac-policies
+        - rbac-security-groups
+        - rbac-subnetpool
+        - router
+        - router-admin-state-down-before-update
+        - router_availability_zone
+        - security-group
+        - segment
+        - service-type
+        - sorting
+        - standard-attr-description
+        - standard-attr-revisions
+        - standard-attr-segment
+        - standard-attr-tag
+        - standard-attr-timestamp
+        - subnet_allocation
+        - subnet-dns-publish-fixed-ip
+        - subnetpool-prefix-ops
+        - tag-ports-during-bulk-creation
+        - trunk
+        - trunk-details
+        - uplink-status-propagation
+      network_api_extensions_tempest:
+        - dvr
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ (network_api_extensions_common + network_api_extensions_tempest) | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-ussuri
+    parent: neutron-tempest-plugin-scenario-openvswitch
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid-ussuri
+    parent: neutron-tempest-plugin-scenario-openvswitch-iptables_hybrid
+    override-checkout: stable-ussuri
+    vars:
+      branch_override: stable-ussuri
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-scenario-linuxbridge-ussuri
+    parent: neutron-tempest-plugin-scenario-linuxbridge
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions: *api_extensions
+      devstack_localrc:
+        NETWORK_API_EXTENSIONS: "{{ network_api_extensions | join(',') }}"
+
+- job:
+    name: neutron-tempest-plugin-dvr-multinode-scenario-ussuri
+    parent: neutron-tempest-plugin-dvr-multinode-scenario
+    override-checkout: stable/ussuri
+    vars:
+      network_api_extensions_common: *api_extensions
+      branch_override: stable/ussuri
+
+- job:
+    name: neutron-tempest-plugin-designate-scenario-ussuri
+    parent: neutron-tempest-plugin-designate-scenario
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions_common: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-sfc-ussuri
+    parent: neutron-tempest-plugin-sfc
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions_common: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-bgpvpn-bagpipe-ussuri
+    parent: neutron-tempest-plugin-bgpvpn-bagpipe
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-fwaas-ussuri
+    parent: neutron-tempest-plugin-fwaas
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions_common: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-dynamic-routing-ussuri
+    parent: neutron-tempest-plugin-dynamic-routing
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions_common: *api_extensions
+
+- job:
+    name: neutron-tempest-plugin-vpnaas-ussuri
+    parent: neutron-tempest-plugin-vpnaas
+    override-checkout: stable/ussuri
+    vars:
+      branch_override: stable/ussuri
+      network_api_extensions_common: *api_extensions