diff --git a/manila_tempest_tests/config.py b/manila_tempest_tests/config.py
index e54dd48..062bf97 100644
--- a/manila_tempest_tests/config.py
+++ b/manila_tempest_tests/config.py
@@ -30,7 +30,7 @@
                help="The minimum api microversion is configured to be the "
                     "value of the minimum microversion supported by Manila."),
     cfg.StrOpt("max_api_microversion",
-               default="2.34",
+               default="2.35",
                help="The maximum api microversion is configured to be the "
                     "value of the latest microversion supported by Manila."),
     cfg.StrOpt("region",
diff --git a/manila_tempest_tests/services/share/v2/json/shares_client.py b/manila_tempest_tests/services/share/v2/json/shares_client.py
index 53c123e..353c8cc 100644
--- a/manila_tempest_tests/services/share/v2/json/shares_client.py
+++ b/manila_tempest_tests/services/share/v2/json/shares_client.py
@@ -294,8 +294,11 @@
         self.expected_success(200, resp.status)
         return self._parse_resp(body)
 
-    def list_share_instances(self, version=LATEST_MICROVERSION):
-        resp, body = self.get("share_instances", version=version)
+    def list_share_instances(self, version=LATEST_MICROVERSION,
+                             params=None):
+        uri = 'share_instances'
+        uri += '?%s' % urlparse.urlencode(params) if params else ''
+        resp, body = self.get(uri, version=version)
         self.expected_success(200, resp.status)
         return self._parse_resp(body)
 
diff --git a/manila_tempest_tests/tests/api/admin/test_share_instances.py b/manila_tempest_tests/tests/api/admin/test_share_instances.py
index 1a4b297..479850c 100644
--- a/manila_tempest_tests/tests/api/admin/test_share_instances.py
+++ b/manila_tempest_tests/tests/api/admin/test_share_instances.py
@@ -14,14 +14,11 @@
 #    under the License.
 
 import ddt
-from tempest import config
 from testtools import testcase as tc
 
 from manila_tempest_tests.tests.api import base
 from manila_tempest_tests import utils
 
-CONF = config.CONF
-
 
 @ddt.ddt
 class ShareInstancesTest(base.BaseSharesAdminTest):
@@ -92,3 +89,26 @@
                          'Share instance %s returned incorrect keys; '
                          'expected %s, got %s.' % (
                              si['id'], expected_keys, actual_keys))
+
+    @ddt.data('path', 'id')
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
+    @base.skip_if_microversion_lt("2.35")
+    def test_list_share_instances_with_export_location_path_and_id(
+            self, export_location_type):
+        share_instances_except = (
+            self.shares_v2_client.get_instances_of_share(
+                self.share['id']))
+        export_locations = (
+            self.shares_v2_client.list_share_instance_export_locations(
+                share_instances_except[0]['id']))
+
+        filters = {
+            'export_location_' + export_location_type:
+                export_locations[0][export_location_type],
+        }
+        share_instances = self.shares_v2_client.list_share_instances(
+            params=filters)
+
+        self.assertEqual(1, len(share_instances))
+        self.assertEqual(share_instances_except[0]['id'],
+                         share_instances[0]['id'])
diff --git a/manila_tempest_tests/tests/api/admin/test_share_instances_negative.py b/manila_tempest_tests/tests/api/admin/test_share_instances_negative.py
new file mode 100644
index 0000000..b52a8a1
--- /dev/null
+++ b/manila_tempest_tests/tests/api/admin/test_share_instances_negative.py
@@ -0,0 +1,54 @@
+#    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.
+
+import ddt
+from testtools import testcase as tc
+
+from manila_tempest_tests.tests.api import base
+
+
+@ddt.ddt
+class ShareInstancesNegativeTest(base.BaseSharesAdminTest):
+
+    @classmethod
+    def resource_setup(cls):
+        super(ShareInstancesNegativeTest, cls).resource_setup()
+        cls.share = cls.create_share()
+
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
+    @base.skip_if_microversion_not_supported("2.34")
+    @ddt.data('path', 'id')
+    def test_list_share_instances_with_export_location_and_invalid_version(
+            self, export_location_type):
+        # In API versions <v2.35, querying the share instance API by export
+        # location path or ID should have no effect. Those filters were
+        # supported from v2.35
+        filters = {
+            'export_location_' + export_location_type: 'fake',
+        }
+        share_instances = self.shares_v2_client.list_share_instances(
+            params=filters, version="2.34")
+
+        self.assertGreater(len(share_instances), 0)
+
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
+    @base.skip_if_microversion_lt("2.35")
+    @ddt.data('path', 'id')
+    def test_list_share_instances_with_export_location_not_exist(
+            self, export_location_type):
+        filters = {
+            'export_location_' + export_location_type: 'fake_not_exist',
+        }
+        share_instances = self.shares_v2_client.list_share_instances(
+            params=filters)
+
+        self.assertEqual(0, len(share_instances))
diff --git a/manila_tempest_tests/tests/api/admin/test_shares_actions.py b/manila_tempest_tests/tests/api/admin/test_shares_actions.py
index a9c62d2..3e8dda0 100644
--- a/manila_tempest_tests/tests/api/admin/test_shares_actions.py
+++ b/manila_tempest_tests/tests/api/admin/test_shares_actions.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import ddt
 from tempest import config
 from tempest.lib.common.utils import data_utils
 import testtools
@@ -23,6 +24,7 @@
 CONF = config.CONF
 
 
+@ddt.ddt
 class SharesActionsAdminTest(base.BaseSharesAdminTest):
     """Covers share functionality, that doesn't related to share type."""
 
@@ -236,6 +238,32 @@
         for share in shares:
             self.assertEqual(filters['host'], share['host'])
 
+    @base.skip_if_microversion_lt("2.35")
+    @ddt.data(('path', True), ('id', True), ('path', False), ('id', False))
+    @ddt.unpack
+    @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
+    def test_list_shares_or_with_detail_filter_by_export_location(
+            self, export_location_type, enable_detail):
+        export_locations = self.shares_v2_client.list_share_export_locations(
+            self.shares[0]['id'])
+        if not isinstance(export_locations, (list, tuple, set)):
+            export_locations = (export_locations, )
+
+        filters = {
+            'export_location_' + export_location_type:
+                export_locations[0][export_location_type],
+        }
+        # list shares
+        if enable_detail:
+            shares = self.shares_v2_client.list_shares_with_detail(
+                params=filters)
+        else:
+            shares = self.shares_v2_client.list_shares(params=filters)
+
+        # verify response
+        self.assertEqual(1, len(shares))
+        self.assertEqual(self.shares[0]['id'], shares[0]['id'])
+
     @tc.attr(base.TAG_POSITIVE, base.TAG_API_WITH_BACKEND)
     @testtools.skipIf(
         not CONF.share.multitenancy_enabled, "Only for multitenancy.")
diff --git a/manila_tempest_tests/tests/api/test_shares_actions_negative.py b/manila_tempest_tests/tests/api/test_shares_actions_negative.py
index 18d16f0..1f3258d 100644
--- a/manila_tempest_tests/tests/api/test_shares_actions_negative.py
+++ b/manila_tempest_tests/tests/api/test_shares_actions_negative.py
@@ -13,6 +13,7 @@
 #    License for the specific language governing permissions and limitations
 #    under the License.
 
+import ddt
 from tempest import config
 from tempest.lib import exceptions as lib_exc
 import testtools
@@ -23,6 +24,7 @@
 CONF = config.CONF
 
 
+@ddt.ddt
 class SharesActionsNegativeTest(base.BaseSharesMixedTest):
     @classmethod
     def resource_setup(cls):
@@ -134,3 +136,32 @@
                           self.shares_client.shrink_share,
                           share['id'],
                           new_size)
+
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
+    @base.skip_if_microversion_not_supported("2.34")
+    @ddt.data('path', 'id')
+    def test_list_shares_with_export_location_and_invalid_version(
+            self, export_location_type):
+        # In API versions <v2.35, querying the share API by export
+        # location path or ID should have no effect. Those filters were
+        # supported from v2.35
+        filters = {
+            'export_location_' + export_location_type: 'fake',
+        }
+        shares = self.shares_v2_client.list_shares(
+            params=filters, version="2.34")
+
+        self.assertGreater(len(shares), 0)
+
+    @tc.attr(base.TAG_NEGATIVE, base.TAG_API_WITH_BACKEND)
+    @base.skip_if_microversion_lt("2.35")
+    @ddt.data('path', 'id')
+    def test_list_shares_with_export_location_not_exist(
+            self, export_location_type):
+        filters = {
+            'export_location_' + export_location_type: 'fake_not_exist',
+        }
+        shares = self.shares_v2_client.list_shares(
+            params=filters)
+
+        self.assertEqual(0, len(shares))
