diff --git a/ansible/group_vars/all.yml b/ansible/group_vars/all.yml
index 24772f765c..66ddf8ff66 100644
--- a/ansible/group_vars/all.yml
+++ b/ansible/group_vars/all.yml
@@ -254,6 +254,7 @@ enable_ceph_rgw: "no"
 enable_cinder: "no"
 enable_cinder_backend_iscsi: "no"
 enable_cinder_backend_lvm: "no"
+enable_cinder_backend_nfs: "no"
 enable_cloudkitty: "no"
 enable_congress: "no"
 enable_etcd: "no"
diff --git a/ansible/roles/cinder/defaults/main.yml b/ansible/roles/cinder/defaults/main.yml
index ad948e6a4a..757022f02c 100644
--- a/ansible/roles/cinder/defaults/main.yml
+++ b/ansible/roles/cinder/defaults/main.yml
@@ -74,5 +74,8 @@ cinder_backends:
   - name: "lvm-1"
     driver: "lvm"
     enabled: "{{ enable_cinder_backend_lvm | bool }}"
+  - name: "nfs-1"
+    driver: "nfs"
+    enabled: "{{ enable_cinder_backend_nfs | bool }}"
 
 cinder_enabled_backends: "{{ cinder_backends|selectattr('enabled', 'equalto', true)|list }}"
diff --git a/ansible/roles/cinder/tasks/config.yml b/ansible/roles/cinder/tasks/config.yml
index 800401615b..ecdd67c40e 100644
--- a/ansible/roles/cinder/tasks/config.yml
+++ b/ansible/roles/cinder/tasks/config.yml
@@ -49,3 +49,14 @@
     dest: "{{ node_config_directory }}/cinder/policy.json"
   when:
     cinder_policy.stat.exists
+
+- name: Copying over nfs_shares files for cinder_volume
+  template:
+    src: "{{ item }}"
+    dest: "{{ node_config_directory }}/cinder-volume/nfs_shares"
+  with_first_found:
+    - "{{ node_custom_config }}/nfs_shares.j2"
+    - "{{ node_custom_config }}/cinder/nfs_shares.j2"
+    - "{{ node_custom_config }}/cinder/cinder-volume/nfs_shares.j2"
+    - "{{ node_custom_config }}/cinder/{{ inventory_hostname }}/nfs_shares.j2"
+  when: enable_cinder_backend_nfs | bool
diff --git a/ansible/roles/cinder/templates/cinder-volume.json.j2 b/ansible/roles/cinder/templates/cinder-volume.json.j2
index db38911195..5dc729b145 100644
--- a/ansible/roles/cinder/templates/cinder-volume.json.j2
+++ b/ansible/roles/cinder/templates/cinder-volume.json.j2
@@ -6,19 +6,28 @@
             "dest": "/etc/cinder/cinder.conf",
             "owner": "cinder",
             "perm": "0600"
-        }{% if cinder_backend_ceph | bool %},
+        },
         {
             "source": "{{ container_config_directory }}/ceph.*",
             "dest": "/etc/ceph/",
             "owner": "cinder",
-            "perm": "0700"
+            "perm": "0700",
+            "optional": {{ (not cinder_backend_ceph | bool) | string | lower }}
         },
         {
             "source": "{{ container_config_directory }}/ceph.conf",
             "dest": "/etc/ceph/ceph.conf",
             "owner": "cinder",
-            "perm": "0600"
-        }{% endif %}
+            "perm": "0600",
+            "optional": {{ (not cinder_backend_ceph | bool) | string | lower }}
+        },
+        {
+            "source": "{{ container_config_directory }}/nfs_shares",
+            "dest": "/etc/cinder/nfs_shares",
+            "owner": "cinder",
+            "perm": "0600",
+            "optional": {{ (not enable_cinder_backend_nfs | bool) | string | lower }}
+        }
     ],
     "permissions": [
         {
diff --git a/ansible/roles/cinder/templates/cinder.conf.j2 b/ansible/roles/cinder/templates/cinder.conf.j2
index a34ee75fd7..16f07b976c 100644
--- a/ansible/roles/cinder/templates/cinder.conf.j2
+++ b/ansible/roles/cinder/templates/cinder.conf.j2
@@ -99,5 +99,12 @@ rbd_secret_uuid = {{ rbd_secret_uuid }}
 report_discard_supported = True
 {% endif %}
 
+{% if enable_cinder_backend_nfs | bool %}
+[nfs-1]
+volume_driver = cinder.volume.drivers.nfs.NfsDriver
+volume_backend_name = nfs-1
+nfs_shares_config = /etc/cinder/nfs_shares
+{% endif %}
+
 [privsep_entrypoint]
 helper_command=sudo cinder-rootwrap /etc/cinder/rootwrap.conf privsep-helper --config-file /etc/cinder/cinder.conf
diff --git a/ansible/roles/nova/tasks/start_compute.yml b/ansible/roles/nova/tasks/start_compute.yml
index 1ba3c47c80..d40e7a007c 100644
--- a/ansible/roles/nova/tasks/start_compute.yml
+++ b/ansible/roles/nova/tasks/start_compute.yml
@@ -17,6 +17,7 @@
       - "kolla_logs:/var/log/kolla/"
       - "libvirtd:/var/lib/libvirt"
       - "nova_compute:/var/lib/nova/"
+      - "/var/lib/nova/mnt:/var/lib/nova/mnt:shared"
       - "nova_libvirt_qemu:/etc/libvirt/qemu"
   register: start_nova_libvirt_container
   # NOTE(Jeffrey4l): retry 5 to remove nova_libvirt container because when
@@ -37,6 +38,7 @@
       - "{% if enable_iscsid | bool %}iscsi_info:/etc/iscsi{% endif %}"
       - "libvirtd:/var/lib/libvirt"
       - "nova_compute:/var/lib/nova/"
+      - "/var/lib/nova/mnt:/var/lib/nova/mnt:shared"
 
 - name: Starting nova-compute container
   kolla_docker:
@@ -94,6 +96,7 @@
       - "/etc/localtime:/etc/localtime:ro"
       - "kolla_logs:/var/log/kolla"
       - "nova_compute:/var/lib/nova"
+      - "/var/lib/nova/mnt:/var/lib/nova/mnt:shared"
       - "heka_socket:/var/lib/kolla/heka/"
   # TODO(jeffrey4l): how to handle the nova-compute-fake and
   # nova-compute-ironic
diff --git a/docker/cinder/cinder-rpcbind/Dockerfile.j2 b/docker/cinder/cinder-rpcbind/Dockerfile.j2
deleted file mode 100644
index 60eb8672be..0000000000
--- a/docker/cinder/cinder-rpcbind/Dockerfile.j2
+++ /dev/null
@@ -1,29 +0,0 @@
-FROM {{ namespace }}/{{ image_prefix }}cinder-base:{{ tag }}
-MAINTAINER {{ maintainer }}
-
-{% block cinder_rpcbind_header %}{% endblock %}
-
-{% import "macros.j2" as macros with context %}
-
-{% if base_distro in ['centos', 'oraclelinux', 'rhel'] %}
-
-        {% set cinder_rpcbind_packages = [
-                'nfs-utils',
-                'nfs-utils-lib'
-        ] %}
-
-{% elif base_distro in ['ubuntu', 'debian'] %}
-
-        {% set cinder_rpcbind_packages = [
-                'rpcbind'
-        ] %}
-
-{% endif %}
-
-{{ macros.install_packages(cinder_rpcbind_packages | customizable("packages")) }}
-
-{% block cinder_rpcbind_footer %}{% endblock %}
-{% block footer %}{% endblock %}
-{{ include_footer }}
-
-USER cinder
diff --git a/docker/cinder/cinder-volume/Dockerfile.j2 b/docker/cinder/cinder-volume/Dockerfile.j2
index 11cd55c7ba..ef90fcd91a 100644
--- a/docker/cinder/cinder-volume/Dockerfile.j2
+++ b/docker/cinder/cinder-volume/Dockerfile.j2
@@ -8,6 +8,7 @@ MAINTAINER {{ maintainer }}
 {% if base_distro in ['centos', 'oraclelinux', 'rhel'] %}
 
     {% set cinder_volume_packages = [
+            'nfs-utils',
             'scsi-target-utils'
     ] %}
 
@@ -35,11 +36,11 @@ RUN sed -i '1 i include /var/lib/cinder/volumes/*' /etc/tgt/targets.conf
     {% if base_distro in ['ubuntu', 'debian'] %}
 
         {% set cinder_volume_packages = [
-                'cinder-volume'
+                'cinder-volume',
+                'nfs-common'
         ] %}
 
 {{ macros.install_packages(cinder_volume_packages | customizable("packages")) }}
-
     {% endif %}
 {% endif %}
 
diff --git a/docker/nova/nova-compute/Dockerfile.j2 b/docker/nova/nova-compute/Dockerfile.j2
index 461f8b1559..46e280a5f2 100644
--- a/docker/nova/nova-compute/Dockerfile.j2
+++ b/docker/nova/nova-compute/Dockerfile.j2
@@ -15,6 +15,7 @@ MAINTAINER {{ maintainer }}
             'ceph-common',
             'genisoimage',
             'iscsi-initiator-utils',
+            'nfs-utils',
             'targetcli',
             'python-rtslib'
         ] %}
@@ -32,6 +33,7 @@ MAINTAINER {{ maintainer }}
             'ironic-common',
             'python-ironicclient',
             'genisoimage',
+            'nfs-common',
             'open-iscsi',
             'targetcli',
             'python-rtslib'
@@ -53,6 +55,7 @@ RUN rm -f /etc/nova/nova-compute.conf
             'ceph-common',
             'genisoimage',
             'iscsi-initiator-utils',
+            'nfs-utils',
             'targetcli',
             'python-rtslib'
         ] %}
@@ -64,6 +67,7 @@ RUN rm -f /etc/nova/nova-compute.conf
             'qemu-utils',
             'ceph-common',
             'genisoimage',
+            'nfs-common',
             'open-iscsi',
             'targetcli',
             'python-rtslib'