diff --git a/etc/STORM_README.txt b/etc/STORM_README.txt
new file mode 100644
index 0000000..d445896
--- /dev/null
+++ b/etc/STORM_README.txt
@@ -0,0 +1,14 @@
+To run:
+-rename the /etc/storm.conf.sample file to storm.conf
+-Set the fields in the file to values relevant to your system
+-Set the "authentication" value (basic or keystone_v2 currently supported)
+-from the root directory of the project, run "nosetests storm/tests" to
+ run all tests
+
+TODO:
+Use virtualenv to install all needed packages. Till then, the following
+packages must be installed:
+-httplib2
+-unittest2
+-paramiko
+-nose
\ No newline at end of file
diff --git a/storm/services/nova/json/images_client.py b/storm/services/nova/json/images_client.py
index 87b205a..70902c8 100644
--- a/storm/services/nova/json/images_client.py
+++ b/storm/services/nova/json/images_client.py
@@ -1,5 +1,6 @@
 from storm.common import rest_client
 import json
+import storm.config
 import time
 
 
@@ -8,6 +9,9 @@
     def __init__(self, username, key, auth_url, tenant_name=None):
         self.client = rest_client.RestClient(username, key,
                                              auth_url, tenant_name)
+        self.config = storm.config.StormConfig()
+        self.build_interval = self.config.nova.build_interval
+        self.build_timeout = self.config.nova.build_timeout
         self.headers = {'Content-Type': 'application/json',
                         'Accept': 'application/json'}
 
@@ -21,12 +25,11 @@
         }
 
         if meta != None:
-            post_body['metadata'] = meta
+            post_body['createImage']['metadata'] = meta
 
         post_body = json.dumps(post_body)
         resp, body = self.client.post('servers/%s/action' %
                                       str(server_id), post_body, self.headers)
-        body = json.loads(body)
         return resp, body
 
     def list_images(self, params=None):
@@ -41,7 +44,7 @@
 
         resp, body = self.client.get(url)
         body = json.loads(body)
-        return resp, body
+        return resp, body['images']
 
     def list_images_with_detail(self, params=None):
         """Returns a detailed list of images filtered by any parameters"""
@@ -55,7 +58,7 @@
 
         resp, body = self.client.get(url)
         body = json.loads(body)
-        return resp, body
+        return resp, body['images']
 
     def get_image(self, image_id):
         """Returns the details of a single image"""
@@ -67,19 +70,66 @@
         """Deletes the provided image"""
         return self.client.delete("images/%s" % str(image_id))
 
-    def wait_for_image_status(self, image_id, status):
-        """Waits for an image to reach a given status"""
-        resp, body = self.get_image(image_id)
-        image_status = body['image']['status']
+    def wait_for_image_exists(self, image_id):
+        resp, body = self.client.get("images/%s" % str(image_id))
         start = int(time.time())
 
-        while image_status != status:
+        while resp.status != 200:
             time.sleep(self.build_interval)
-            resp, body = self.get_image(image_id)
-            image_status = body['image']['status']
+            resp, body = self.client.get("images/%s" % str(image_id))
 
-            if image_status == 'ERROR':
+            if int(time.time()) - start >= self.build_timeout:
+                raise exceptions.BuildErrorException
+
+    def wait_for_image_status(self, image_id, status):
+        """Waits for an image to reach a given status."""
+        resp, image = self.get_image(image_id)
+        start = int(time.time())
+
+        while image['status'] != status:
+            time.sleep(self.build_interval)
+            resp, image = self.get_image(image_id)
+
+            if image['status'] == 'ERROR':
                 raise exceptions.TimeoutException
 
             if int(time.time()) - start >= self.build_timeout:
                 raise exceptions.BuildErrorException
+
+    def list_image_metadata(self, image_id):
+        resp, body = self.client.get("images/%s/metadata" % str(image_id))
+        body = json.loads(body)
+        return resp, body
+
+    def set_image_metadata(self, image_id, meta):
+        post_body = json.dumps({'metadata': meta})
+        resp, body = self.client.put('images/%s/metadata' %
+                                      str(image_id), post_body, self.headers)
+        body = json.loads(body)
+        return resp, body
+
+    def update_image_metadata(self, image_id, meta):
+        post_body = json.dumps({'metadata': meta})
+        resp, body = self.client.post('images/%s/metadata' %
+                                      str(image_id), post_body, self.headers)
+        body = json.loads(body)
+        return resp, body
+
+    def get_image_metadata_item(self, image_id, key):
+        resp, body = self.client.get("images/%s/metadata/%s" %
+                                     (str(image_id), key))
+        body = json.loads(body)
+        return resp, body
+
+    def set_image_metadata_item(self, image_id, key, meta):
+        post_body = json.dumps({'meta': meta})
+        resp, body = self.client.put('images/%s/metdata/%s' %
+                                     (str(image_id), key),
+                                     post_body, self.headers)
+        body = json.loads(body)
+        return resp, body
+
+    def delete_image_metadata_item(self, image_id, key):
+        resp, body = self.client.delete("images/%s/metadata/%s" %
+                                     (str(image_id), key))
+        return resp, body
diff --git a/storm/services/nova/json/servers_client.py b/storm/services/nova/json/servers_client.py
index 21cabfa..6bad76e 100644
--- a/storm/services/nova/json/servers_client.py
+++ b/storm/services/nova/json/servers_client.py
@@ -257,3 +257,41 @@
                                       str(server_id), post_body, self.headers)
         body = json.loads(body)
         return resp, body
+
+    def list_server_metadata(self, server_id):
+        resp, body = self.client.get("servers/%s/metadata" % str(server_id))
+        body = json.loads(body)
+        return resp, body['metadata']
+
+    def set_server_metadata(self, server_id, meta):
+        post_body = json.dumps({'metadata': meta})
+        resp, body = self.client.put('servers/%s/metadata' %
+                                     str(server_id), post_body, self.headers)
+        body = json.loads(body)
+        return resp, body['metadata']
+
+    def update_server_metadata(self, server_id, meta):
+        post_body = json.dumps({'metadata': meta})
+        resp, body = self.client.post('servers/%s/metadata' %
+                                     str(server_id), post_body, self.headers)
+        body = json.loads(body)
+        return resp, body['metadata']
+
+    def get_server_metadata_item(self, server_id, key):
+        resp, body = self.client.get("servers/%s/metadata/%s" %
+                                    (str(server_id), key))
+        body = json.loads(body)
+        return resp, body['meta']
+
+    def set_server_metadata_item(self, server_id, key, meta):
+        post_body = json.dumps({'meta': meta})
+        resp, body = self.client.put('servers/%s/metdata/%s' %
+                                    (str(server_id), key),
+                                    post_body, self.headers)
+        body = json.loads(body)
+        return resp, body['meta']
+
+    def delete_server_metadata_item(self, server_id, key):
+        resp, body = self.client.delete("servers/%s/metadata/%s" %
+                                    (str(server_id), key))
+        return resp, body
diff --git a/storm/tests/test_images.py b/storm/tests/test_images.py
new file mode 100644
index 0000000..e11dc47
--- /dev/null
+++ b/storm/tests/test_images.py
@@ -0,0 +1,67 @@
+from nose.plugins.attrib import attr
+from storm import openstack
+from storm.common.utils.data_utils import rand_name
+import unittest2 as unittest
+import storm.config
+
+
+class ImagesTest(unittest.TestCase):
+    create_image_enabled = storm.config.StormConfig().env.create_image_enabled
+
+    @classmethod
+    def setUpClass(cls):
+        cls.os = openstack.Manager()
+        cls.client = cls.os.images_client
+        cls.servers_client = cls.os.servers_client
+        cls.config = storm.config.StormConfig()
+        cls.image_ref = cls.config.env.image_ref
+        cls.flavor_ref = cls.config.env.flavor_ref
+
+    def _parse_image_id(self, image_ref):
+        temp = image_ref.rsplit('/')
+        return temp[6]
+
+    @unittest.skipIf(not create_image_enabled,
+                    'Environment unable to create images.')
+    def test_create_delete_image(self):
+        """An image for the provided server should be created"""
+        server_name = rand_name('server')
+        resp, server = self.servers_client.create_server(server_name,
+                                                         self.image_ref,
+                                                         self.flavor_ref)
+        self.servers_client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Create a new image
+        name = rand_name('image')
+        resp, body = self.client.create_image(server['id'], name)
+        image_id = self._parse_image_id(resp['location'])
+        self.client.wait_for_image_exists(image_id)
+        self.client.wait_for_image_status(image_id, 'ACTIVE')
+
+        #Verify the image was created correctly
+        resp, image = self.client.get_image(image_id)
+        self.assertEqual(name, image['name'])
+
+        #Teardown
+        self.client.delete_image(image['id'])
+        self.servers_client.delete_server(server['id'])
+
+    @attr(type='smoke')
+    def test_get_image(self):
+        """Returns the correct details for a single image"""
+        resp, image = self.client.get_image(self.image_ref)
+        self.assertEqual(self.image_ref, image['id'])
+
+    @attr(type='smoke')
+    def test_list_images(self):
+        """The list of all images should contain the image flavor"""
+        resp, images = self.client.list_images()
+        found = any([i for i in images if i['id'] == self.image_ref])
+        self.assertTrue(found)
+
+    @attr(type='smoke')
+    def test_list_images_with_detail(self):
+        """Detailed list of all images should contain the expected image"""
+        resp, images = self.client.list_images_with_detail()
+        found = any([i for i in images if i['id'] == self.image_ref])
+        self.assertTrue(found)
diff --git a/storm/tests/test_server_metadata.py b/storm/tests/test_server_metadata.py
new file mode 100644
index 0000000..3b569f6
--- /dev/null
+++ b/storm/tests/test_server_metadata.py
@@ -0,0 +1,132 @@
+from nose.plugins.attrib import attr
+from storm import openstack
+from storm.common.utils.data_utils import rand_name
+import unittest2 as unittest
+import storm.config
+
+
+class ServerMetadataTest(unittest.TestCase):
+
+    @classmethod
+    def setUpClass(cls):
+        cls.os = openstack.Manager()
+        cls.client = cls.os.servers_client
+        cls.config = storm.config.StormConfig()
+        cls.image_ref = cls.config.env.image_ref
+        cls.flavor_ref = cls.config.env.flavor_ref
+
+        #Create a server to be used for all read only tests
+        cls.meta = {'test1': 'value1', 'test2': 'value2'}
+        name = rand_name('server')
+        resp, cls.server = cls.client.create_server(name, cls.image_ref,
+                                                cls.flavor_ref, meta=cls.meta)
+
+        #Wait for the server to become active
+        cls.client.wait_for_server_status(cls.server['id'], 'ACTIVE')
+
+    @classmethod
+    def tearDownClass(cls):
+        cls.client.delete_server(cls.server['id'])
+
+    def test_list_server_metadata(self):
+        """All metadata key/value pairs for a server should be returned"""
+        resp, metadata = self.client.list_server_metadata(self.server['id'])
+
+        #Verify the expected metadata items are in the list
+        self.assertEqual(200, resp.status)
+        self.assertEqual('value1', metadata['test1'])
+        self.assertEqual('value2', metadata['test2'])
+
+    def test_set_server_metadata(self):
+        """The server's metadata should be replaced with the provided values"""
+        meta = {'meta1': 'data1'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Create a new set of metadata for the server
+        meta = {'meta2': 'data2', 'meta3': 'data3'}
+        resp, metadata = self.client.set_server_metadata(server['id'], meta)
+        self.assertEqual(200, resp.status)
+
+        #Verify the expected values are correct, and that the
+        #previous values have been removed
+        resp, body = self.client.list_server_metadata(server['id'])
+        self.assertEqual('data2', metadata['meta2'])
+        self.assertEqual('data3', metadata['meta3'])
+        self.assertTrue('meta1' not in metadata)
+
+        #Teardown
+        self.client.delete_server(server['id'])
+
+    def test_update_server_metadata(self):
+        """
+        The server's metadata values should be updated to the
+        provided values
+        """
+        meta = {'key1': 'value1', 'key2': 'value2'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Update all metadata items for the server
+        meta = {'key1': 'alt1', 'key2': 'alt2'}
+        resp, metadata = self.client.update_server_metadata(server['id'], meta)
+        self.assertEqual(200, resp.status)
+
+        #Verify the values have been updated to the proper values
+        resp, body = self.client.list_server_metadata(server['id'])
+        self.assertEqual('alt1', metadata['key1'])
+        self.assertEqual('alt2', metadata['key2'])
+
+        #Teardown
+        self.client.delete_server(server['id'])
+
+    def test_get_server_metadata_item(self):
+        """ The value for a specic metadata key should be returned """
+        resp, meta = self.client.get_server_metadata_item(self.server['id'],
+                                                          'test2')
+        self.assertTrue('value2', meta['test2'])
+
+    def test_set_server_metadata_item(self):
+        """The item's value should be updated to the provided value"""
+        meta = {'nova': 'server'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Update the metadata value
+        meta = {'nova': 'alt'}
+        resp, body = self.client.set_server_metadata_item(server['id'],
+                                                          'nova', meta)
+        self.assertEqual(200, resp.status)
+
+        #Verify the meta item's value has been updated
+        resp, body = self.client.list_server_metadata(server['id'])
+        self.assertEqual('alt', metadata['nova'])
+
+        #Teardown
+        self.client.delete_server(server.id)
+
+    def test_delete_server_metadata_item(self):
+        """The metadata value/key pair should be deleted from the server"""
+        meta = {'delkey': 'delvalue'}
+        name = rand_name('server')
+        resp, server = self.client.create_server(name, self.image_ref,
+                                                self.flavor_ref, meta=meta)
+        self.client.wait_for_server_status(server['id'], 'ACTIVE')
+
+        #Delete the metadata item
+        resp, metadata = self.client.delete_server_metadata_item(server['id'],
+                                                                 'delkey')
+        self.assertEqual(204, resp.status)
+
+        #Verify the metadata item has been removed
+        resp, metadata = self.client.list_server_metadata(server['id'])
+        self.assertTrue('delkey' not in metadata)
+
+        #Teardown
+        self.client.delete_server(server['id'])
