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/common/rest_client.py b/storm/common/rest_client.py
index e4ab450..88f1fb4 100644
--- a/storm/common/rest_client.py
+++ b/storm/common/rest_client.py
@@ -1,3 +1,4 @@
+from storm import exceptions
 import httplib2
 import json
 import storm.config
@@ -93,4 +94,8 @@
         req_url = "%s/%s" % (self.base_url, url)
         resp, body = self.http_obj.request(req_url, method,
                                            headers=headers, body=body)
+        if resp.status == 400:
+            body = json.loads(body)
+            raise exceptions.BadRequest(body['badRequest']['message'])
+
         return resp, body
diff --git a/storm/config.py b/storm/config.py
index 90dfed2..5ba7ef6 100644
--- a/storm/config.py
+++ b/storm/config.py
@@ -74,7 +74,7 @@
     @property
     def flavor_ref(self):
         """Valid flavorRef to use"""
-        return int(self.get("flavor_ref", 1))
+        return self.get("flavor_ref", 1)
 
     @property
     def flavor_ref_alt(self):
diff --git a/storm/exceptions.py b/storm/exceptions.py
index c75544c..93ffa91 100644
--- a/storm/exceptions.py
+++ b/storm/exceptions.py
@@ -8,3 +8,11 @@
     """Exception on server build"""
     def __repr__(self):
         return "Server failed into error status"
+
+
+class BadRequest(Exception):
+    def __init__(self, message):
+        self.message = message
+
+    def __str__(self):
+        return repr(self.message)
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_flavors.py b/storm/tests/test_flavors.py
index a4fa2f3..590bac3 100644
--- a/storm/tests/test_flavors.py
+++ b/storm/tests/test_flavors.py
@@ -36,4 +36,4 @@
     def test_get_flavor(self):
         """The expected flavor details should be returned"""
         resp, flavor = self.client.get_flavor_details(self.flavor_id)
-        self.assertEqual(self.flavor_id, flavor['id'])
+        self.assertEqual(self.flavor_id, str(flavor['id']))
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'])
diff --git a/storm/tests/test_servers_negative.py b/storm/tests/test_servers_negative.py
new file mode 100644
index 0000000..72de6c0
--- /dev/null
+++ b/storm/tests/test_servers_negative.py
@@ -0,0 +1,97 @@
+import unittest2 as unittest
+import storm.config
+import base64
+from nose.plugins.attrib import attr
+from storm import openstack
+from storm.common.utils.data_utils import rand_name
+from storm.common import ssh
+from storm import exceptions
+
+
+class ServersNegativeTest(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
+        cls.ssh_timeout = cls.config.nova.ssh_timeout
+
+    def test_server_name_blank(self):
+        """Create a server with name parameter empty"""
+        try:
+            resp, server = self.client.create_server('', self.image_ref,
+                                                     self.flavor_ref)
+        except exceptions.BadRequest:
+            pass
+        else:
+            self.fail('Server name cannot be blank')
+
+    def test_personality_file_contents_not_encoded(self):
+        """Use an unencoded file when creating a server with personality"""
+        file_contents = 'This is a test file.'
+        personality = [{'path': '/etc/testfile.txt',
+                        'contents': file_contents}]
+
+        try:
+            resp, server = self.client.create_server('test',
+                                                      self.image_ref,
+                                                      self.flavor_ref,
+                                                      personality=personality)
+        except exceptions.BadRequest:
+            pass
+        else:
+            self.fail('Unencoded file contents should not be accepted')
+
+    def test_create_with_invalid_image(self):
+        """Create a server with an unknown image"""
+        try:
+            resp, server = self.client.create_server('fail', -1,
+                                                     self.flavor_ref)
+        except exceptions.BadRequest:
+            pass
+        else:
+            self.fail('Cannot create a server with an invalid image')
+
+    def test_create_with_invalid_flavor(self):
+        """Create a server with an unknown flavor"""
+        try:
+            self.client.create_server('fail', self.image_ref, -1)
+        except exceptions.BadRequest:
+            pass
+        else:
+            self.fail('Cannot create a server with an invalid flavor')
+
+    @unittest.expectedFailure
+    def test_invalid_access_ip_v4_address(self):
+        """An access IPv4 address must match a valid address pattern"""
+        #Currently failing due to bug
+        accessIPv4 = '1.1.1.1.1.1'
+        name = rand_name('server')
+        try:
+            resp, server = self.client.create_server(name,
+                                                     self.image_ref,
+                                                     self.flavor_ref,
+                                                     accessIPv4=accessIPv4)
+        except exceptions.BadRequest:
+            pass
+        else:
+            self.fail('Access IPv4 address must match the correct format')
+
+    @unittest.expectedFailure
+    def test_invalid_ip_v6_address(self):
+        """An access IPv6 address must match a valid address pattern"""
+        #Currently failing due to bug
+        accessIPv6 = 'notvalid'
+        name = rand_name('server')
+        try:
+            resp, server = self.client.create_server(name,
+                                                     self.image_ref,
+                                                     self.flavor_ref,
+                                                     accessIPv6=accessIPv6)
+        except exceptions.BadRequest:
+            pass
+        else:
+            self.fail('Access IPv6 address must match the correct format')
