diff --git a/barbican_tempest_plugin/tests/api/base.py b/barbican_tempest_plugin/tests/api/base.py
index abf1e83..7256a10 100644
--- a/barbican_tempest_plugin/tests/api/base.py
+++ b/barbican_tempest_plugin/tests/api/base.py
@@ -23,7 +23,7 @@
 CONF = config.CONF
 
 # NOTE(dane-fichter): We need to track resource types for cleanup.
-RESOURCE_TYPES = ['container', 'order', 'secret']
+RESOURCE_TYPES = ['container', 'order', 'quota', 'secret']
 
 
 def _get_uuid(href):
@@ -45,6 +45,9 @@
                 secret_ref = order_metadata.get('secret_ref')
                 if secret_ref:
                     cls.created_objects['secret'].add(_get_uuid(secret_ref))
+                uuid = _get_uuid(resp['order_ref'])
+            if resource == 'quota':
+                uuid = _get_uuid(args[0])
             if resource == 'secret':
                 uuid = _get_uuid(resp['secret_ref'])
             cls.created_objects[resource].add(uuid)
@@ -57,7 +60,7 @@
     """Base class for all api tests."""
 
     # Why do I have to be an admin to create secrets? No idea...
-    credentials = ('admin', )
+    credentials = ('admin', ['service_admin', 'key-manager:service-admin'])
     client_manager = clients.Clients
     created_objects = {}
 
@@ -77,6 +80,9 @@
             service='key-manager'
         )
 
+        os = getattr(cls, 'os_roles_%s' % cls.credentials[1][0])
+        cls.quota_client = os.secret_v1.QuotaClient(service='key-manager')
+
     @classmethod
     def resource_setup(cls):
         super(BaseKeyManagerTest, cls).resource_setup()
@@ -90,6 +96,8 @@
                 cls.delete_container(container_uuid)
             for order_uuid in list(cls.created_objects['order']):
                 cls.delete_order(order_uuid)
+            for project_quota_uuid in list(cls.created_objects['quota']):
+                cls.delete_project_quota(project_quota_uuid)
             for secret_uuid in list(cls.created_objects['secret']):
                 cls.delete_secret(secret_uuid)
         finally:
@@ -120,6 +128,16 @@
         return cls.order_client.delete_order(uuid)
 
     @classmethod
+    @creates('quota')
+    def create_project_quota(cls, project_id, **kwargs):
+        return cls.quota_client.create_project_quota(project_id, **kwargs)
+
+    @classmethod
+    def delete_project_quota(cls, project_id):
+        cls.created_objects['quota'].remove(project_id)
+        return cls.quota_client.delete_project_quota(project_id)
+
+    @classmethod
     @creates('secret')
     def create_secret(cls, **kwargs):
         return cls.secret_client.create_secret(**kwargs)
diff --git a/barbican_tempest_plugin/tests/api/test_quotas.py b/barbican_tempest_plugin/tests/api/test_quotas.py
new file mode 100644
index 0000000..882fbb1
--- /dev/null
+++ b/barbican_tempest_plugin/tests/api/test_quotas.py
@@ -0,0 +1,79 @@
+# Copyright (c) 2016 Johns Hopkins University Applied Physics Laboratory
+#
+# 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.
+
+from barbican_tempest_plugin.tests.api import base
+
+from tempest import config
+
+CONF = config.CONF
+
+
+class QuotasTest(base.BaseKeyManagerTest):
+    """Quotas API tests."""
+
+    def test_create_get_delete_quota(self):
+        # Verify the default quota settings
+        body = self.quota_client.get_default_project_quota()
+        quotas = body.get('quotas')
+        self.assertEqual(-1, quotas.get('secrets'))
+        self.assertEqual(-1, quotas.get('cas'))
+        self.assertEqual(-1, quotas.get('orders'))
+        self.assertEqual(-1, quotas.get('containers'))
+        self.assertEqual(-1, quotas.get('consumers'))
+
+        # Confirm that there are no quotas
+        body = self.quota_client.list_quotas()
+        self.assertEqual(0, body.get('total'), body)
+        self.assertEqual(0, len(body.get('project_quotas')), body)
+
+        # Create a quota set for the test project
+        self.create_project_quota(
+            self.quota_client.tenant_id,
+            project_quotas={
+                'secrets': 30,
+                'orders': 10,
+                'containers': 20
+            }
+        )
+
+        # Verify that the quotas can be found via generic listing.
+        body = self.quota_client.list_quotas()
+        self.assertEqual(1, body.get('total'), body)
+        self.assertEqual(1, len(body.get('project_quotas')), body)
+        project_quotas = body.get('project_quotas')[0]
+        self.assertEqual(
+            self.quota_client.tenant_id,
+            project_quotas.get('project_id'),
+            body
+        )
+        project_quotas = project_quotas.get('project_quotas')
+        self.assertEqual(30, project_quotas.get('secrets'), body)
+        self.assertEqual(10, project_quotas.get('orders'), body)
+        self.assertEqual(20, project_quotas.get('containers'), body)
+
+        # Verify that the quotas can be found via specific listing.
+        body = self.quota_client.get_project_quota(
+            self.quota_client.tenant_id
+        )
+        project_quotas = body.get('project_quotas')
+        self.assertEqual(30, project_quotas.get('secrets'), body)
+        self.assertEqual(10, project_quotas.get('orders'), body)
+        self.assertEqual(20, project_quotas.get('containers'), body)
+
+        # Delete the project quota and confirm that it got deleted
+        self.delete_project_quota(self.quota_client.tenant_id)
+
+        body = self.quota_client.list_quotas()
+        self.assertEqual(0, body.get('total'), body)
+        self.assertEqual(0, len(body.get('project_quotas')), body)
