diff --git a/barbican_tempest_plugin/tests/api/base.py b/barbican_tempest_plugin/tests/api/base.py
index b1717ff..6b37bc5 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 = ['secret']
+RESOURCE_TYPES = ['secret', 'container']
 
 
 def _get_uuid(href):
@@ -39,6 +39,8 @@
             resp = f(cls, *args, **kwargs)
             if resource == 'secret':
                 uuid = _get_uuid(resp['secret_ref'])
+            if resource == 'container':
+                uuid = _get_uuid(resp['container_ref'])
             cls.created_objects[resource].add(uuid)
             return resp
         return wrapper
@@ -58,6 +60,9 @@
         super(BaseKeyManagerTest, cls).setup_clients()
         os = getattr(cls, 'os_%s' % cls.credentials[0])
         cls.secret_client = os.secret_v1.SecretClient(service='key-manager')
+        cls.container_client = os.secret_v1.ContainerClient(
+            service='key-manager'
+        )
 
     @classmethod
     def resource_setup(cls):
@@ -68,8 +73,10 @@
     @classmethod
     def resource_cleanup(cls):
         try:
-            for secret_uuid in cls.created_objects['secret']:
+            for secret_uuid in list(cls.created_objects['secret']):
                 cls.delete_secret(secret_uuid)
+            for container_uuid in list(cls.created_objects['container']):
+                cls.delete_container(container_uuid)
         finally:
             super(BaseKeyManagerTest, cls).resource_cleanup()
 
@@ -82,3 +89,13 @@
     def delete_secret(cls, uuid):
         cls.created_objects['secret'].remove(uuid)
         return cls.secret_client.delete_secret(uuid)
+
+    @classmethod
+    @creates('container')
+    def create_container(cls, **kwargs):
+        return cls.container_client.create_container(**kwargs)
+
+    @classmethod
+    def delete_container(cls, uuid):
+        cls.created_objects['container'].remove(uuid)
+        return cls.container_client.delete_container(uuid)
diff --git a/barbican_tempest_plugin/tests/api/test_containers.py b/barbican_tempest_plugin/tests/api/test_containers.py
new file mode 100644
index 0000000..7f19a57
--- /dev/null
+++ b/barbican_tempest_plugin/tests/api/test_containers.py
@@ -0,0 +1,126 @@
+# 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
+
+
+class ContainersTest(base.BaseKeyManagerTest):
+    """Containers API tests."""
+
+    def test_create_list_delete_empty_container(self):
+        # Create a container to test against.
+        body = self.create_container(type="generic", name="empty-container")
+        container_id = base._get_uuid(body.get('container_ref'))
+
+        # Verify that the container can be found via specific listing.
+        body = self.container_client.get_container(container_id)
+        self.assertEqual(
+            container_id,
+            base._get_uuid(body.get('container_ref')),
+            body
+        )
+        self.assertEqual("generic", body.get('type'), body)
+        self.assertEqual("empty-container", body.get('name'), body)
+        self.assertEqual("ACTIVE", body.get('status'), body)
+        self.assertEmpty(body.get('secret_refs'), body)
+        self.assertEmpty(body.get('consumers'), body)
+        self.assertIn('created', body, body)
+        self.assertIn('updated', body, body)
+        self.assertIn('creator_id', body, body)
+
+        # Verify that the container can be found via generic listing.
+        body = self.container_client.list_containers()
+        self.assertEqual(1, body.get('total'), body)
+        self.assertEqual(1, len(body.get('containers')), body)
+
+        container = body.get('containers')[0]
+        self.assertEqual(
+            container_id,
+            base._get_uuid(container.get('container_ref')),
+            container
+        )
+        self.assertEqual("generic", container.get('type'), container)
+        self.assertEqual("empty-container", container.get('name'), container)
+        self.assertEqual("ACTIVE", container.get('status'), container)
+        self.assertEmpty(container.get('secret_refs'), container)
+        self.assertEmpty(container.get('consumers'), container)
+        self.assertIn('created', container, container)
+        self.assertIn('updated', container, container)
+        self.assertIn('creator_id', container, container)
+
+        # Leave the container behind to get cleaned up by infra.
+
+    def test_add_to_delete_from_container(self):
+        # Create a container to test against.
+        body = self.create_container(type="generic", name="test-container")
+        container_id = base._get_uuid(body.get('container_ref'))
+
+        # Create some secrets to store in the container
+        body = self.create_secret()
+        secret1_id = base._get_uuid(body.get('secret_ref'))
+        body = self.create_secret()
+        secret2_id = base._get_uuid(body.get('secret_ref'))
+
+        # Confirm that the container is empty
+        body = self.container_client.get_container(container_id)
+        self.assertEqual(
+            container_id,
+            base._get_uuid(body.get('container_ref')),
+            body
+        )
+        self.assertEmpty(body.get('secret_refs'), body)
+
+        # Add the secrets to the container
+        self.container_client.add_secret_to_container(
+            container_id,
+            secret1_id
+        )
+        self.container_client.add_secret_to_container(
+            container_id,
+            secret2_id
+        )
+
+        # Confirm that the secrets are in the container
+        body = self.container_client.get_container(container_id)
+        self.assertEqual(
+            container_id,
+            base._get_uuid(body.get('container_ref')),
+            body
+        )
+        self.assertEqual(2, len(body.get('secret_refs')), body)
+        for secret_ref in body.get('secret_refs'):
+            secret_id = base._get_uuid(secret_ref.get('secret_ref'))
+            self.assertIn(secret_id, (secret1_id, secret2_id))
+
+        # Remove the secrets from the container
+        self.container_client.delete_secret_from_container(
+            container_id,
+            secret1_id
+        )
+        self.container_client.delete_secret_from_container(
+            container_id,
+            secret2_id
+        )
+
+        # Confirm that the container is empty
+        body = self.container_client.get_container(container_id)
+        self.assertEqual(
+            container_id,
+            base._get_uuid(body.get('container_ref')),
+            body
+        )
+        self.assertEmpty(body.get('secret_refs'), body)
+
+        # Clean up the containe
+        self.delete_container(container_id)
