diff --git a/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py b/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py
index 9a651b85dab..642a13d6b05 100644
--- a/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py
+++ b/cinder/tests/unit/volume/drivers/vmware/test_vmware_vmdk.py
@@ -153,8 +153,9 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
     @mock.patch.object(VMDK_DRIVER, '_get_disk_type')
     @mock.patch.object(VMDK_DRIVER, '_get_storage_profile')
     @mock.patch.object(VMDK_DRIVER, 'ds_sel')
-    def test_verify_volume_creation(self, ds_sel, get_storage_profile,
-                                    get_disk_type):
+    @mock.patch.object(VMDK_DRIVER, '_get_adapter_type')
+    def test_verify_volume_creation(self, get_adapter_type, ds_sel,
+                                    get_storage_profile, get_disk_type):
         profile_name = mock.sentinel.profile_name
         get_storage_profile.return_value = profile_name
 
@@ -164,6 +165,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
         get_disk_type.assert_called_once_with(volume)
         get_storage_profile.assert_called_once_with(volume)
         ds_sel.get_profile_id.assert_called_once_with(profile_name)
+        get_adapter_type.assert_called_once_with(volume)
 
     @mock.patch.object(VMDK_DRIVER, '_verify_volume_creation')
     def test_create_volume(self, verify_volume_creation):
@@ -219,6 +221,33 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
         get_extra_spec_disk_type.assert_called_once_with(
             volume['volume_type_id'])
 
+    @mock.patch('cinder.volume.drivers.vmware.vmdk.'
+                '_get_volume_type_extra_spec')
+    @mock.patch('cinder.volume.drivers.vmware.volumeops.'
+                'VirtualDiskAdapterType.validate')
+    def test_get_extra_spec_adapter_type(
+            self, validate, get_volume_type_extra_spec):
+        adapter_type = mock.sentinel.adapter_type
+        get_volume_type_extra_spec.return_value = adapter_type
+
+        type_id = mock.sentinel.type_id
+        self.assertEqual(adapter_type,
+                         self._driver._get_extra_spec_adapter_type(type_id))
+        get_volume_type_extra_spec.assert_called_once_with(
+            type_id, 'adapter_type',
+            default_value=self._driver.configuration.vmware_adapter_type)
+        validate.assert_called_once_with(adapter_type)
+
+    @mock.patch.object(VMDK_DRIVER, '_get_extra_spec_adapter_type')
+    def test_get_adapter_type(self, get_extra_spec_adapter_type):
+        adapter_type = mock.sentinel.adapter_type
+        get_extra_spec_adapter_type.return_value = adapter_type
+
+        volume = self._create_volume_dict()
+        self.assertEqual(adapter_type, self._driver._get_adapter_type(volume))
+        get_extra_spec_adapter_type.assert_called_once_with(
+            volume['volume_type_id'])
+
     def _create_snapshot_dict(self,
                               volume,
                               snap_id=SNAPSHOT_ID,
@@ -368,6 +397,8 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
 
     @mock.patch('cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver.'
                 '_validate_disk_format')
+    @mock.patch.object(VMDK_DRIVER, '_get_adapter_type',
+                       return_value=volumeops.VirtualDiskAdapterType.BUS_LOGIC)
     @mock.patch('cinder.volume.drivers.vmware.volumeops.'
                 'VirtualDiskAdapterType.validate')
     @mock.patch('cinder.volume.drivers.vmware.vmdk.ImageDiskType.'
@@ -385,6 +416,7 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
                                    create_volume_from_non_stream_opt_image,
                                    validate_image_disk_type,
                                    validate_image_adapter_type,
+                                   get_adapter_type,
                                    validate_disk_format,
                                    vmware_disk_type='streamOptimized',
                                    backing_disk_size=VOL_SIZE,
@@ -1980,9 +2012,10 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
     @mock.patch.object(VMDK_DRIVER, '_get_storage_profile_id')
     @mock.patch.object(VMDK_DRIVER, 'volumeops')
     @mock.patch.object(VMDK_DRIVER, '_get_disk_type')
+    @mock.patch.object(VMDK_DRIVER, '_get_adapter_type')
     def _test_create_backing(
-            self, get_disk_type, vops, get_storage_profile_id,
-            select_ds_for_volume, create_params=None):
+            self, get_adapter_type, get_disk_type, vops,
+            get_storage_profile_id, select_ds_for_volume, create_params=None):
         create_params = create_params or {}
 
         host = mock.sentinel.host
@@ -2002,6 +2035,9 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
         disk_type = mock.sentinel.disk_type
         get_disk_type.return_value = disk_type
 
+        adapter_type = mock.sentinel.adapter_type
+        get_adapter_type.return_value = adapter_type
+
         volume = self._create_volume_dict()
         ret = self._driver._create_backing(volume, host, create_params)
 
@@ -2023,12 +2059,13 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
             vops.update_backing_disk_uuid.assert_not_called()
         else:
             get_disk_type.assert_called_once_with(volume)
+            get_adapter_type.assert_called_once_with(volume)
             exp_backing_name = (
                 create_params.get(vmdk.CREATE_PARAM_BACKING_NAME) or
                 volume['name'])
             exp_adapter_type = (
                 create_params.get(vmdk.CREATE_PARAM_ADAPTER_TYPE) or
-                self._driver.configuration.vmware_adapter_type)
+                adapter_type)
             vops.create_backing.assert_called_once_with(
                 exp_backing_name,
                 volume['size'] * units.Mi,
@@ -2357,8 +2394,9 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
     @mock.patch.object(VMDK_DRIVER, '_get_storage_profile_id')
     @mock.patch('cinder.volume.drivers.vmware.vmdk.VMwareVcVmdkDriver.'
                 '_get_disk_type')
+    @mock.patch.object(VMDK_DRIVER, '_get_adapter_type')
     def test_manage_existing(
-            self, get_disk_type, get_storage_profile_id,
+            self, get_adapter_type, get_disk_type, get_storage_profile_id,
             get_ds_name_folder_path, vops, create_backing, get_existing):
 
         vm = mock.sentinel.vm
@@ -2385,6 +2423,9 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
         disk_type = mock.sentinel.disk_type
         get_disk_type.return_value = disk_type
 
+        adapter_type = mock.sentinel.adapter_type
+        get_adapter_type.return_value = adapter_type
+
         existing_ref = mock.sentinel.existing_ref
         self._driver.manage_existing(volume, existing_ref)
 
@@ -2396,10 +2437,10 @@ class VMwareVcVmdkDriverTestCase(test.TestCase):
         vops.move_vmdk_file.assert_called_once_with(
             src_dc, src_path, dest_path, dest_dc_ref=dest_dc)
         get_storage_profile_id.assert_called_once_with(volume)
+        get_adapter_type.assert_called_once_with(volume)
         vops.attach_disk_to_backing.assert_called_once_with(
             backing, disk_device.capacityInKB, disk_type,
-            self._driver.configuration.vmware_adapter_type,
-            profile_id, dest_path)
+            adapter_type, profile_id, dest_path)
         vops.update_backing_disk_uuid.assert_called_once_with(backing,
                                                               volume['id'])
 
diff --git a/cinder/volume/drivers/vmware/vmdk.py b/cinder/volume/drivers/vmware/vmdk.py
index f6dee8a3994..8bbac53c81a 100644
--- a/cinder/volume/drivers/vmware/vmdk.py
+++ b/cinder/volume/drivers/vmware/vmdk.py
@@ -320,8 +320,11 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
         if profile_name:
             self.ds_sel.get_profile_id(profile_name)
 
-        LOG.debug("Verified disk type and storage profile of volume: %s.",
-                  volume.name)
+        # validate adapter type
+        self._get_adapter_type(volume)
+
+        LOG.debug("Verified disk type, adapter type and storage profile "
+                  "of volume: %s.", volume.name)
 
     def create_volume(self, volume):
         """Creates a volume.
@@ -352,6 +355,17 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
         """
         self._delete_volume(volume)
 
+    def _get_extra_spec_adapter_type(self, type_id):
+        adapter_type = _get_volume_type_extra_spec(
+            type_id,
+            'adapter_type',
+            default_value=self.configuration.vmware_adapter_type)
+        volumeops.VirtualDiskAdapterType.validate(adapter_type)
+        return adapter_type
+
+    def _get_adapter_type(self, volume):
+        return self._get_extra_spec_adapter_type(volume['volume_type_id'])
+
     def _get_extra_spec_storage_profile(self, type_id):
         """Get storage profile name in the given volume type's extra spec.
 
@@ -447,8 +461,8 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
         # create a backing with single disk
         disk_type = VMwareVcVmdkDriver._get_disk_type(volume)
         size_kb = volume['size'] * units.Mi
-        adapter_type = create_params.get(
-            CREATE_PARAM_ADAPTER_TYPE, self.configuration.vmware_adapter_type)
+        adapter_type = create_params.get(CREATE_PARAM_ADAPTER_TYPE,
+                                         self._get_adapter_type(volume))
         backing = self.volumeops.create_backing(backing_name,
                                                 size_kb,
                                                 disk_type,
@@ -1179,7 +1193,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
 
         # Get the disk type, adapter type and size of vmdk image
         image_disk_type = ImageDiskType.PREALLOCATED
-        image_adapter_type = self.configuration.vmware_adapter_type
+        image_adapter_type = self._get_adapter_type(volume)
         image_size_in_bytes = metadata['size']
         properties = metadata['properties']
         if properties:
@@ -1588,7 +1602,7 @@ class VMwareVcVmdkDriver(driver.VolumeDriver):
             backing,
             disk.capacityInKB,
             VMwareVcVmdkDriver._get_disk_type(volume),
-            self.configuration.vmware_adapter_type,
+            self._get_adapter_type(volume),
             profile_id,
             dest_path.get_descriptor_ds_file_path())
         self.volumeops.update_backing_disk_uuid(backing, volume['id'])
diff --git a/releasenotes/notes/vmware_adapter_type-66164bc3857f244f.yaml b/releasenotes/notes/vmware_adapter_type-66164bc3857f244f.yaml
new file mode 100644
index 00000000000..d8d45dca5e1
--- /dev/null
+++ b/releasenotes/notes/vmware_adapter_type-66164bc3857f244f.yaml
@@ -0,0 +1,6 @@
+---
+features:
+  - |
+    VMware VMDK driver now supports volume type extra-spec
+    option ``vmware:adapter_type`` to specify the adapter
+    type of volumes in vCenter server.