--- /dev/null
+From 1a2c7f23229050b1694565c5e2ee13146001eb18 Mon Sep 17 00:00:00 2001
+From: Michael Polenchuk <mpolenchuk@mirantis.com>
+Date: Thu, 29 Jun 2017 12:05:25 +0400
+Subject: [PATCH] Bring in opendaylight support
+
+Change-Id: Ie9073fafccba336f94b1996bd85c98d7a7f5060b
+---
+
+diff --git a/neutron/files/ocata/ml2_conf.ini b/neutron/files/ocata/ml2_conf.ini
+index 0d48951..347eb15 100644
+--- a/neutron/files/ocata/ml2_conf.ini
++++ b/neutron/files/ocata/ml2_conf.ini
+@@ -269,3 +269,11 @@
+ # Use ipset to speed-up the iptables based security groups. Enabling ipset
+ # support requires that ipset is installed on L2 agent node. (boolean value)
+ #enable_ipset = true
++
++{%- if server.backend.engine == "opendaylight" %}
++[ml2_odl]
++port_binding_controller = network-topology
++url = http://{{ server.backend.host }}:{{ server.backend.rest_api_port }}/controller/nb/v2/neutron
++username = {{ server.backend.user }}
++password = {{ server.backend.password }}
++{%- endif %}
+diff --git a/neutron/files/ocata/neutron-generic.conf.Debian b/neutron/files/ocata/neutron-generic.conf.Debian
+index 5b7058d..bc438b9 100644
+--- a/neutron/files/ocata/neutron-generic.conf.Debian
++++ b/neutron/files/ocata/neutron-generic.conf.Debian
+@@ -33,7 +33,7 @@
+ #auth_strategy = keystone
+ auth_strategy = keystone
+
+-{% if neutron.backend.engine == "ml2" %}
++{% if neutron.backend.engine in ["ml2", "opendaylight"] %}
+
+ core_plugin = neutron.plugins.ml2.plugin.Ml2Plugin
+
+diff --git a/neutron/files/ocata/neutron-server b/neutron/files/ocata/neutron-server
+index 54f6ceb..1682ee0 100644
+--- a/neutron/files/ocata/neutron-server
++++ b/neutron/files/ocata/neutron-server
+@@ -7,10 +7,10 @@
+ # neutron.conf
+ #NEUTRON_PLUGIN_CONFIG="/etc/neutron/plugins/openvswitch/ovs_neutron_plugin.ini"
+
+-{%- if server.backend.engine == "ml2" %}
++{%- if server.backend.engine in ["ml2", "opendaylight"] %}
+ NEUTRON_PLUGIN_CONFIG="/etc/neutron/plugins/ml2/ml2_conf.ini"
+ {%- endif %}
+
+ {%- if server.backend.engine == "contrail" %}
+ NEUTRON_PLUGIN_CONFIG="/etc/neutron/plugins/opencontrail/ContrailPlugin.ini"
+-{%- endif %}
+\ No newline at end of file
++{%- endif %}
+diff --git a/neutron/files/ocata/neutron-server.conf.Debian b/neutron/files/ocata/neutron-server.conf.Debian
+index e320ca4..d6de235 100644
+--- a/neutron/files/ocata/neutron-server.conf.Debian
++++ b/neutron/files/ocata/neutron-server.conf.Debian
+@@ -39,7 +39,7 @@
+ core_plugin = neutron_plugin_contrail.plugins.opencontrail.contrail_plugin.NeutronPluginContrailCoreV2
+
+ service_plugins = neutron_plugin_contrail.plugins.opencontrail.loadbalancer.v2.plugin.LoadBalancerPluginV2
+-{% elif server.backend.engine == "ml2" %}
++{% elif server.backend.engine in ["ml2", "opendaylight"] %}
+
+ core_plugin = neutron.plugins.ml2.plugin.Ml2Plugin
+
+@@ -831,7 +831,7 @@
+ # Deprecated group/name - [DEFAULT]/sql_connection
+ # Deprecated group/name - [DATABASE]/sql_connection
+ # Deprecated group/name - [sql]/connection
+-{% if server.backend.engine == "ml2" %}
++{% if server.backend.engine in ["ml2", "opendaylight"] %}
+ connection = {{ server.database.engine }}+pymysql://{{ server.database.user }}:{{ server.database.password }}@{{ server.database.host }}/{{ server.database.name }}?charset=utf8
+ {% else %}
+ connection = sqlite:////var/lib/neutron/neutron.sqlite
+@@ -2194,3 +2194,8 @@
+ {% include "neutron/files/"+server.version+"/ContrailPlugin.ini" %}
+
+ {% endif %}
++
++{%- if server.backend.engine == "opendaylight" %}
++[ovs]
++ovsdb_connection = {{ server.backend.ovsdb_connection }}
++{%- endif %}
+diff --git a/neutron/server.sls b/neutron/server.sls
+index 0b3a6be..7a6bd23 100644
+--- a/neutron/server.sls
++++ b/neutron/server.sls
+@@ -64,7 +64,7 @@
+
+ {%- endif %}
+
+-{% if server.backend.engine == "ml2" %}
++{% if server.backend.engine in ["ml2", "opendaylight"] %}
+
+ /etc/neutron/plugins/ml2/ml2_conf.ini:
+ file.managed:
--- /dev/null
+From 1f59df548f3e1461cc0ebf70c29a89205385eb20 Mon Sep 17 00:00:00 2001
+From: Michael Polenchuk <mpolenchuk@mirantis.com>
+Date: Thu, 29 Jun 2017 12:22:42 +0400
+Subject: [PATCH] Bring in opendaylight support
+
+Change-Id: I3efec9a8b586a6c75b1c1635ad2a7024d73d9ad2
+---
+
+diff --git a/neutron/control/opendaylight/cluster.yml b/neutron/control/opendaylight/cluster.yml
+new file mode 100644
+index 0000000..4133650
+--- /dev/null
++++ b/neutron/control/opendaylight/cluster.yml
+@@ -0,0 +1,19 @@
++classes:
++- service.keepalived.cluster.single
++- service.haproxy.proxy.single
++- service.neutron.control.cluster
++- system.haproxy.proxy.listen.openstack.neutron
++- system.neutron.control.openvswitch.cluster
++parameters:
++ neutron:
++ server:
++ backend:
++ engine: opendaylight
++ host: ${_param:opendaylight_service_host}
++ rest_api_port: 8282
++ user: admin
++ password: admin
++ ovsdb_connection: tcp:127.0.0.1:6639
++ mechanism:
++ ovs:
++ driver: opendaylight_v2
+diff --git a/neutron/control/opendaylight/single.yml b/neutron/control/opendaylight/single.yml
+new file mode 100644
+index 0000000..19af585
+--- /dev/null
++++ b/neutron/control/opendaylight/single.yml
+@@ -0,0 +1,16 @@
++classes:
++- service.neutron.control.single
++- system.neutron.control.openvswitch.single
++parameters:
++ neutron:
++ server:
++ backend:
++ engine: opendaylight
++ host: ${_param:opendaylight_service_host}
++ rest_api_port: 8282
++ user: admin
++ password: admin
++ ovsdb_connection: tcp:127.0.0.1:6639
++ mechanism:
++ ovs:
++ driver: opendaylight_v2
+diff --git a/neutron/gateway/opendaylight/single.yml b/neutron/gateway/opendaylight/single.yml
+new file mode 100644
+index 0000000..29c8d95
+--- /dev/null
++++ b/neutron/gateway/opendaylight/single.yml
+@@ -0,0 +1,8 @@
++classes:
++- service.neutron.gateway.single
++parameters:
++ neutron:
++ gateway:
++ backend:
++ engine: opendaylight
++ ovsdb_connection: tcp:127.0.0.1:6639
+diff --git a/opendaylight/server/single.yml b/opendaylight/server/single.yml
+new file mode 100644
+index 0000000..3d11872
+--- /dev/null
++++ b/opendaylight/server/single.yml
+@@ -0,0 +1,2 @@
++classes:
++- service.opendaylight.server.single
+diff --git a/reclass/storage/system/opendaylight_control_single.yml b/reclass/storage/system/opendaylight_control_single.yml
+new file mode 100644
+index 0000000..890ff59
+--- /dev/null
++++ b/reclass/storage/system/opendaylight_control_single.yml
+@@ -0,0 +1,15 @@
++parameters:
++ _param:
++ opendaylight_control_hostname: odl01
++ reclass:
++ storage:
++ node:
++ opendaylight_control_node01:
++ name: ${_param:opendaylight_control_hostname}
++ domain: ${_param:cluster_domain}
++ classes:
++ - cluster.${_param:cluster_name}.opendaylight.control
++ params:
++ salt_master_host: ${_param:reclass_config_master}
++ linux_system_codename: ${_param:linux_system_codename}
++ single_address: ${_param:opendaylight_service_host}