diff --git a/tempest/cli/simple_read_only/test_cinder.py b/tempest/cli/simple_read_only/test_cinder.py
index 3ff997a..719ba3c 100644
--- a/tempest/cli/simple_read_only/test_cinder.py
+++ b/tempest/cli/simple_read_only/test_cinder.py
@@ -118,3 +118,139 @@
         if not region:
             region = self.config.identity.region
         self.cinder('list', flags='--os-region-name ' + region)
+
+
+class SimpleReadOnlyCinderClientV2Test(tempest.cli.ClientTestBase):
+    """Basic, read-only tests for Cinder v2 CLI client.
+
+    Checks return values and output of read-only commands.
+    These tests do not presume any content, nor do they create
+    their own. They only verify the structure of output if present.
+    """
+
+    version_flag = '--os-volume-api-version'
+    version_support = 2
+
+    def _get_resp_from_diff_versions(self, version_tuple, cmd, param=None):
+        # Get each result from different versions.
+        # Note(wingwj): If you want to get each cli response on v1&v2 version,
+        #   the value of version_tuple should be (1, 2).
+        #   The function will be also available for v3 in future
+
+        resp_set = []
+        for i in set(version_tuple):
+            if not isinstance(i, int) or \
+                    i not in range(1, self.version_support + 1):
+                LOG.error("version_num must be a positive integer, "
+                          "Cinder supports %s versions now"
+                          % self.version_support)
+                continue
+            else:
+                if not param:
+                    item = self.cinder(cmd,
+                                       flags=self.version_flag + ' ' + str(i))
+                else:
+                    item = self.cinder(cmd, params=param,
+                                       flags=self.version_flag + ' ' + str(i))
+                resp_set.append(item)
+
+        return resp_set
+
+    def _check_accordance_between_two_versions(self, input1, input2,
+                                               expected=True):
+        # Check input1 and input2 is not Empty first
+        self.assertNotEqual("", input1)
+        self.assertNotEqual("", input2)
+        # Compare input1 and input2 based on 'expected' parameter
+        if expected:
+            self.assertEqual(input1, input2)
+        else:
+            self.assertNotEqual(input1, input2)
+
+    def test_cinder_volumes_list_in_v2(self):
+        cmd = 'list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        # This CLI representation in v1/v2 is different.
+        self._check_accordance_between_two_versions(v1, v2, False)
+
+    def test_cinder_absolute_limit_list_in_v2(self):
+        cmd = 'absolute-limits'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_backup_list_in_v2(self):
+        cmd = 'backup-list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_extra_specs_list_in_v2(self):
+        cmd = 'extra-specs-list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_quota_class_show_in_v2(self):
+        cmd = 'quota-class-show'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd, 'abc')
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_quota_defaults_in_v2(self):
+        cmd = 'quota-defaults'
+        v1, v2 = self._get_resp_from_diff_versions(
+            (1, 2), cmd, self.identity.admin_tenant_name)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_quota_show_in_v2(self):
+        cmd = 'quota-show'
+        v1, v2 = self._get_resp_from_diff_versions(
+            (1, 2), cmd, self.identity.admin_tenant_name)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_rate_limits_in_v2(self):
+        cmd = 'rate-limits'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_snapshot_list_in_v2(self):
+        cmd = 'snapshot-list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        # This CLI representation in v1/v2 is different.
+        self._check_accordance_between_two_versions(v1, v2, False)
+
+    def test_cinder_type_list_in_v2(self):
+        cmd = 'type-list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_availability_zone_list_in_v2(self):
+        cmd = 'availability-zone-list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_service_list_in_v2(self):
+        cmd = 'service-list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self.assertNotEqual("", v1)
+        self.assertNotEqual("", v2)
+
+        # The 'Updated_at' and 'State' item may be changed
+        #   due to the periodical update-task. Need to omit.
+        v1 = self.parser.listing(v1)
+        v2 = self.parser.listing(v2)
+        for i in v1:
+            del i['Updated_at']
+            del i['State']
+        for j in v2:
+            del j['Updated_at']
+            del j['State']
+        self.assertEqual(v1, v2)
+
+    def test_cinder_transfer_list_in_v2(self):
+        cmd = 'transfer-list'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        self._check_accordance_between_two_versions(v1, v2, True)
+
+    def test_cinder_bash_completion_in_v2(self):
+        cmd = 'bash-completion'
+        v1, v2 = self._get_resp_from_diff_versions((1, 2), cmd)
+        # This CLI representation in v1/v2 is different.
+        self._check_accordance_between_two_versions(v1, v2, False)
