diff --git a/defaults/main.yml b/defaults/main.yml
index 45bfb4ee..f9419bb0 100644
--- a/defaults/main.yml
+++ b/defaults/main.yml
@@ -69,6 +69,10 @@ openstack_ceilometer_git_repo: https://opendev.org/openstack/ceilometer
 openstack_ceilometer_git_install_branch: master
 networking_generic_switch_git_repo: https://opendev.org/openstack/networking-generic-switch
 networking_generic_switch_git_install_branch: master
+networking_nsx_git_repo: https://opendev.org/x/vmware-nsx
+networking_nsx_git_install_branch: master
+networking_nsxlib_git_repo: https://opendev.org/x/vmware-nsxlib
+networking_nsxlib_git_install_branch: master
 
 neutron_upper_constraints_url: "{{ requirements_git_url | default('https://releases.openstack.org/constraints/upper/' ~ requirements_git_install_branch | default('master')) }}"
 neutron_git_constraints:
@@ -81,6 +85,8 @@ neutron_git_constraints:
   - "git+{{ networking_bgpvpn_git_repo }}@{{ networking_bgpvpn_git_install_branch }}#egg=networking-bgpvpn"
   - "git+{{ openstack_ceilometer_git_repo }}@{{ openstack_ceilometer_git_install_branch }}#egg=ceilometer"
   - "git+{{ networking_generic_switch_git_repo }}@{{ networking_generic_switch_git_install_branch }}#egg=networking-generic-switch"
+  - "git+{{ networking_nsx_git_repo }}@{{ networking_nsx_git_install_branch }}#egg=vmware-nsx"
+  - "git+{{ networking_nsxlib_git_repo }}@{{ networking_nsxlib_git_install_branch }}#egg=vmware-nsxlib"
   - "--constraint {{ neutron_upper_constraints_url }}"
 
 neutron_pip_install_args: "{{ pip_install_options | default('') }}"
@@ -165,6 +171,7 @@ neutron_nuage_conf_ini_overrides: {}
 neutron_opendaylight_conf_ini_overrides: {}
 neutron_openvswitch_agent_ini_overrides: {}
 neutron_openvswitch_agent_init_overrides: {}
+neutron_nsx_conf_ini_overrides: {}
 # Provide a list of access controls to update the default policy.json with.
 # These changes will be merged
 # with the access controls in the default policy.json. E.g.
diff --git a/doc/source/app-nsx.rst b/doc/source/app-nsx.rst
new file mode 100644
index 00000000..b6c15b49
--- /dev/null
+++ b/doc/source/app-nsx.rst
@@ -0,0 +1,108 @@
+========================================
+Scenario - VMware NSX Plugin
+========================================
+
+Introduction
+~~~~~~~~~~~~
+
+This document covers the steps to integrate the VMware NSX plugin with
+OpenStack Ansible.
+
+.. warning::
+
+  Currently, only NSX-T Policy API is supported.
+
+Please follow these steps:
+
+- Configure Neutron to use the NSX plugin
+
+Prerequisites
+~~~~~~~~~~~~~
+
+#. The deployment environment is configured according to OSA best
+   practices such as cloning OSA software and bootstrapping Ansible.
+   See `OpenStack-Ansible Install Guide
+   <https://docs.openstack.org/project-deploy-guide/openstack-ansible/latest/>`_.
+
+#. NSX-T has been deployed per its installation guide and compute nodes have
+   been properly configured as transport nodes. See
+   `NSX-T Data Center Installation Guide
+   <https://docs.vmware.com/en/VMware-NSX-T-Data-Center/3.0/installation/GUID-3E0C4CEC-D593-4395-84C4-150CD6285963.htm>` _.
+
+Configure Neutron to use the NSX plugin
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+Copy the neutron environment overrides to
+``/etc/openstack_deploy/env.d/neutron.yml`` and disable agent creation, since
+it is not needed.
+
+.. code-block:: yaml
+
+  neutron_agents_container:
+    belongs_to:
+      - network_containers
+    contains: { }
+
+Copy the nova environment overrides to
+``/etc/openstack_deploy/env.d/nova.yml`` and disable neutron agent creation,
+since it is not needed.
+
+.. code-block:: yaml
+
+  container_skel:
+    nova_api_container:
+      belongs_to:
+        - compute-infra_containers
+        - os-infra_containers
+      contains:
+        - nova_api_metadata
+        - nova_api_os_compute
+        - nova_conductor
+        - nova_scheduler
+        - nova_console
+    nova_compute_container:
+      belongs_to:
+        - compute_containers
+        - kvm-compute_containers
+        - qemu-compute_containers
+      contains:
+        - nova_compute
+      properties:
+        is_metal: true
+
+Set the following required variables in your
+``/etc/openstack_deploy/user_variables.yml``
+
+.. code-block:: yaml
+
+  neutron_plugin_type: vmware.nsx
+  nova_network_type: nsx
+  nsx_api_password: <password>
+  nsx_api_managers:
+    - nsx-manager-01
+    - nsx-manager-02
+    - nsx-manager-03
+
+Optionally specify additional parameters using overrides
+
+.. code-block:: yaml
+
+  neutron_nsx_conf_ini_overrides:
+    nsx_p:
+      default_tier0_router: my-tier0-router
+      default_overlay_tz: my-overlay-tz
+      default_vlan_tz: my-vlan-tz
+      metadata_proxy: my-metadata-proxy-profile
+      dhcp_profile: my-dhcp-profile
+
+.. warning::
+
+  If NSX has defined more than one tier 0, overlay/vlan tz, metadata proxy, or
+  dhcp profile, then you must explicitly define those using conf overrides.
+  Neutron will fail to start if these are not defined in those conditions.
+
+Installation
+~~~~~~~~~~~~
+
+After the environment has been configured as detailed above, start the
+OpenStack deployment as listed in the OpenStack-Ansible Install Guide.
diff --git a/doc/source/index.rst b/doc/source/index.rst
index f09db7db..3e94b3dc 100644
--- a/doc/source/index.rst
+++ b/doc/source/index.rst
@@ -13,6 +13,7 @@ Neutron role for OpenStack-Ansible
    app-openvswitch-sfc.rst
    app-ovn.rst
    app-nuage.rst
+   app-nsx.rst
    app-calico.rst
    app-opendaylight.rst
    app-genericswitch.rst
diff --git a/templates/neutron.conf.j2 b/templates/neutron.conf.j2
index eabcd8e4..e21310c4 100644
--- a/templates/neutron.conf.j2
+++ b/templates/neutron.conf.j2
@@ -85,9 +85,14 @@ rpc_workers = {{ neutron_rpc_workers }}
 
 {% set dhcp_agents_max = num_agent if num_agent > 2 else 2 %}
 # DHCP
+{% if neutron_plugin_type == 'vmware.nsx' %}
+dhcp_agent_notification = False
+{% else %}
 dhcp_agent_notification = True
 dhcp_agents_per_network = {{ dhcp_agents_max }}
 dhcp_lease_duration = 86400
+{% endif %}
+
 
 # Driver for external DNS integration. (string value)
 {% if neutron_designate_enabled %}
diff --git a/templates/plugins/vmware/nsx.ini.j2 b/templates/plugins/vmware/nsx.ini.j2
new file mode 100644
index 00000000..98aa8949
--- /dev/null
+++ b/templates/plugins/vmware/nsx.ini.j2
@@ -0,0 +1,7 @@
+[DEFAULT]
+
+[nsx_p]
+
+nsx_api_user = {{ nsx_api_user | default('admin') }}
+nsx_api_password = {{ nsx_api_password }}
+nsx_api_managers = {{ nsx_api_managers | join(',') }}
diff --git a/tests/neutron-overrides-nsx.yml b/tests/neutron-overrides-nsx.yml
new file mode 100644
index 00000000..d816602d
--- /dev/null
+++ b/tests/neutron-overrides-nsx.yml
@@ -0,0 +1,32 @@
+---
+# Copyright 2020, VMware, Inc.
+#
+# 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.
+
+tempest_run: yes
+
+tempest_plugins:
+  - name: neutron-plugins
+    repo: https://opendev.org/openstack/neutron-tempest-plugin
+    branch: master
+
+tempest_test_whitelist:
+  - "neutron_tempest_plugin.api.test_networks*"
+
+neutron_plugin_type: vmware.nsx
+nsx_api_password: password
+nsx_api_managers:
+  - nsx-manager-01
+
+tempest_network_ping_gateway: False
+
diff --git a/tests/nsx_inventory b/tests/nsx_inventory
new file mode 100644
index 00000000..665e18a4
--- /dev/null
+++ b/tests/nsx_inventory
@@ -0,0 +1,61 @@
+[all]
+localhost
+infra1
+server1
+server2
+
+[physical_host]
+localhost
+
+[all_containers]
+infra1
+server1
+server2
+
+[oslomsg_rpc_all]
+infra1
+
+[oslomsg_notify_all]
+infra1
+
+[rabbitmq_all]
+infra1
+
+[galera_all]
+infra1
+
+[memcached_all]
+infra1
+
+[service_all:children]
+rabbitmq_all
+galera_all
+memcached_all
+
+[keystone_all]
+infra1
+
+[neutron_server]
+server1
+server2
+
+[neutron_agent]
+[neutron_dhcp_agent]
+[neutron_linuxbridge_agent]
+[neutron_openvswitch_agent]
+[neutron_metering_agent]
+[neutron_l3_agent]
+[neutron_metadata_agent]
+
+[neutron_all:children]
+neutron_agent
+neutron_dhcp_agent
+neutron_linuxbridge_agent
+neutron_openvswitch_agent
+neutron_metering_agent
+neutron_l3_agent
+neutron_metadata_agent
+neutron_server
+
+[utility_all]
+infra1
diff --git a/tox.ini b/tox.ini
index aa8b06e2..b820a7c3 100644
--- a/tox.ini
+++ b/tox.ini
@@ -183,3 +183,12 @@ commands =
     {[testenv:bashate]commands}
     {[testenv:ansible-lint]commands}
     {[testenv:ansible-syntax]commands}
+
+[testenv:nsx]
+basepython = python3
+setenv =
+    {[testenv]setenv}
+    ANSIBLE_INVENTORY={toxinidir}/tests/nsx_inventory
+    ANSIBLE_OVERRIDES={toxinidir}/tests/neutron-overrides-nsx.yml
+commands =
+    bash -c "{toxinidir}/tests/common/test-ansible-functional.sh"
diff --git a/vars/main.yml b/vars/main.yml
index 44ed246b..26b9ffcc 100644
--- a/vars/main.yml
+++ b/vars/main.yml
@@ -69,6 +69,10 @@ neutron_proprietary_nuage_pip_packages:
 neutron_optional_ngs_pip_packages:
   - networking-generic-switch
 
+neutron_optional_nsx_pip_packages:
+  - vmware-nsx
+  - vmware-nsxlib
+
 neutron_venv_packages: >-
   {%- set pkg_list = neutron_pip_packages | union(neutron_user_pip_packages) %}
   {%- if neutron_bgp | bool %}
@@ -103,6 +107,10 @@ neutron_venv_packages: >-
          (neutron_services['neutron-server']['group'] in group_names) %}
   {%-     set _ = pkg_list.extend(neutron_optional_ngs_pip_packages) %}
   {%- endif %}
+  {%- if (neutron_plugin_type.split('.')[-1] == "nsx") and
+         (neutron_services['neutron-server']['group'] in group_names) %}
+  {%-     set _ = pkg_list.extend(neutron_optional_nsx_pip_packages) %}
+  {%- endif %}
   {{- pkg_list | unique }}
 
 
@@ -207,6 +215,10 @@ neutron_plugins:
     plugin_conf_ini_overrides: "{{ neutron_ml2_conf_genericswitch_ini_overrides }}"
     plugin_core: ml2
     plugin_ini: plugins/ml2/ml2_conf_genericswitch.ini
+  vmware.nsx:
+    plugin_core: vmware_nsx.plugin.NsxPolicyPlugin
+    plugin_ini: plugins/vmware/nsx.ini
+    plugin_conf_ini_overrides: "{{ neutron_nsx_conf_ini_overrides }}"
 
 ###
 ### ML2 Plugin Configuration