--- /dev/null
+# A Heat environment file which can be used to enable OpenContrail
+# extensions, configured via puppet
+resource_registry:
+  OS::TripleO::ControllerExtraConfigPre: ../puppet/extraconfig/pre_deploy/controller/neutron-opencontrail.yaml
+  OS::TripleO::ComputeExtraConfigPre: ../puppet/extraconfig/pre_deploy/compute/neutron-opencontrail.yaml
+
+parameter_defaults:
+  NeutronCorePlugin: neutron_plugin_contrail.plugins.opencontrail.contrail_plugin.NeutronPluginContrailCoreV2
+  NeutronServicePlugins: neutron_plugin_contrail.plugins.opencontrail.loadbalancer.plugin.LoadBalancerPlugin
+  NeutronEnableDHCPAgent: false
+  NeutronEnableL3Agent: false
+  NeutronEnableMetadataAgent: false
+  NeutronEnableOVSAgent: false
+  NeutronEnableTunnelling: false
+
+  # required params:
+  #ContrailApiServerIp:
+  #ContrailExtensions: ''
+
+  # optional params
+  # ContrailApiServerPort: 8082
+  # ContrailMultiTenancy: false
 
             - cisco_n1kv_data  # Optionally provided by ComputeExtraConfigPre
             - nova_nuage_data  # Optionally provided by ComputeExtraConfigPre
             - midonet_data # Optionally provided by AllNodesExtraConfig
+            - neutron_opencontrail_data  # Optionally provided by ComputeExtraConfigPre
           datafiles:
             compute_extraconfig:
               mapped_data: {get_param: NovaComputeExtraConfig}
 
             - cisco_n1kv_data # Optionally provided by ControllerExtraConfigPre
             - neutron_nuage_data # Optionally provided by ControllerExtraConfigPre
             - midonet_data #Optionally provided by AllNodesExtraConfig
+            - neutron_opencontrail_data # Optionally provided by ControllerExtraConfigPre
           datafiles:
             controller_extraconfig:
               mapped_data: {get_param: ControllerExtraConfig}
 
--- /dev/null
+heat_template_version: 2015-04-30
+
+description: Compute node hieradata for Neutron OpenContrail configuration
+
+parameters:
+  server:
+    description: ID of the compute node to apply this config to
+    type: string
+  ContrailApiServerIp:
+    description: IP address of the OpenContrail API server
+    type: string
+  ContrailApiServerPort:
+    description: Port of the OpenContrail API
+    type: string
+    default: 8082
+
+resources:
+  ComputeContrailConfig:
+    type: OS::Heat::StructuredConfig
+    properties:
+      group: os-apply-config
+      config:
+        hiera:
+          datafiles:
+            neutron_opencontrail_data:
+              mapped_data:
+                nova::network::neutron::network_api_class: nova.network.neutronv2.api.API
+
+                contrail::vrouter::provision_vrouter::api_address: {get_input: contrail_api_server_ip}
+                contrail::vrouter::provision_vrouter::api_port: {get_input: contrail_api_server_port}
+                contrail::vrouter::provision_vrouter::keystone_admin_user: admin
+                contrail::vrouter::provision_vrouter::keystone_admin_tenant_name: admin
+                contrail::vrouter::provision_vrouter::keystone_admin_password: '"%{::admin_password}"'
+
+  ComputeContrailDeployment:
+    type: OS::Heat::StructuredDeployment
+    properties:
+      config: {get_resource: ComputeContrailConfig}
+      server: {get_param: server}
+      input_values:
+        contrail_api_server_ip: {get_param: ContrailApiServerIp}
+        contrail_api_server_port: {get_param: ContrailApiServerPort}
+
+outputs:
+  deploy_stdout:
+    description: Output of the extra hiera data deployment
+    value: {get_attr: [ComputeContrailDeployment, deploy_stdout]}
 
--- /dev/null
+heat_template_version: 2015-04-30
+
+description: Controller hieradata for Neutron OpenContrail configuration
+
+parameters:
+  server:
+    description: ID of the controller node to apply this config to
+    type: string
+  ContrailApiServerIp:
+    description: IP address of the OpenContrail API server
+    type: string
+  ContrailApiServerPort:
+    description: Port of the OpenContrail API
+    type: string
+    default: 8082
+  ContrailMultiTenancy:
+    description: Whether to enable multi tenancy
+    type: boolean
+    default: false
+  ContrailExtensions:
+    description: List of OpenContrail extensions to be enabled
+    type: comma_delimited_list
+    default: ''
+
+resources:
+  ControllerContrailConfig:
+    type: OS::Heat::StructuredConfig
+    properties:
+      group: os-apply-config
+      config:
+        hiera:
+          datafiles:
+            neutron_opencontrail_data:
+              mapped_data:
+                neutron::api_extensions_path: /usr/lib/python2.7/site-packages/neutron_plugin_contrail/extensions
+
+                neutron::plugins::opencontrail::api_server_ip: {get_input: contrail_api_server_ip}
+                neutron::plugins::opencontrail::api_server_port: {get_input: contrail_api_server_port}
+                neutron::plugins::opencontrail::multi_tenancy: {get_input: contrail_multi_tenancy}
+                neutron::plugins::opencontrail::contrail_extensions: {get_input: contrail_extensions}
+                neutron::plugins::opencontrail::keystone_auth_url: '"%{hiera(''keystone_auth_uri'')}"'
+                neutron::plugins::opencontrail::keystone_admin_user: admin
+                neutron::plugins::opencontrail::keystone_admin_tenant_name: admin
+                neutron::plugins::opencontrail::keystone_admin_password: '"%{hiera(''admin_password'')}"'
+                neutron::plugins::opencontrail::keystone_admin_token: '"%{hiera(''keystone::admin_token'')}"'
+
+  ControllerContrailDeployment:
+    type: OS::Heat::StructuredDeployment
+    properties:
+      config: {get_resource: ControllerContrailConfig}
+      server: {get_param: server}
+      input_values:
+        contrail_api_server_ip: {get_param: ContrailApiServerIp}
+        contrail_api_server_port: {get_param: ContrailApiServerPort}
+        contrail_multi_tenancy: {get_param: ContrailMultiTenancy}
+        contrail_extensions: {get_param: ContrailExtensions}
+
+
+outputs:
+  deploy_stdout:
+    description: Output of the extra hiera data deployment
+    value: {get_attr: [ControllerContrailDeployment, deploy_stdout]}
 
     cassandra_seeds   => $cassandra_node_ips
   }
 }
+elsif hiera('neutron::core_plugin') == 'neutron_plugin_contrail.plugins.opencontrail.contrail_plugin.NeutronPluginContrailCoreV2' {
+
+  include ::contrail::vrouter
+  # NOTE: it's not possible to use this class without a functional
+  # contrail controller up and running
+  #class {'::contrail::vrouter::provision_vrouter':
+  #  require => Class['contrail::vrouter'],
+  #}
+}
 else {
 
   include ::neutron::plugins::ml2
 
   include ::neutron::server
   include ::neutron::server::notifications
 
-  # If the value of core plugin is set to 'nuage',
-  # include nuage core plugin, and it does not
+  # If the value of core plugin is set to 'nuage' or 'opencontrail',
+  # include nuage or opencontrail core plugins, and it does not
   # need the l3, dhcp and metadata agents
   if hiera('neutron::core_plugin') == 'neutron.plugins.nuage.plugin.NuagePlugin' {
     include ::neutron::plugins::nuage
+  } elsif hiera('neutron::core_plugin') == 'neutron_plugin_contrail.plugins.opencontrail.contrail_plugin.NeutronPluginContrailCoreV2' {
+    include ::neutron::plugins::opencontrail
   } else {
     include ::neutron::agents::l3
     include ::neutron::agents::dhcp
 
   if  hiera('neutron::core_plugin') == 'neutron.plugins.nuage.plugin.NuagePlugin' {
     include ::neutron::plugins::nuage
   }
+  if  hiera('neutron::core_plugin') == 'neutron_plugin_contrail.plugins.opencontrail.contrail_plugin.NeutronPluginContrailCoreV2' {
+    include ::neutron::plugins::opencontrail
+  }
   if hiera('neutron::core_plugin') == 'midonet.neutron.plugin_v1.MidonetPluginV2' {
     class {'::neutron::plugins::midonet':
       midonet_api_ip    => $public_vip,