diff --git libcloud/compute/drivers/vcloud.py libcloud/compute/drivers/vcloud.py
index 86aaa1f..ff5c6ec 100644
--- libcloud/compute/drivers/vcloud.py
+++ libcloud/compute/drivers/vcloud.py
@@ -1188,6 +1188,59 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
                 'Content-Type': 'application/vnd.vmware.vcloud.controlAccess+xml'
             },
             method='POST')
+        
+    def ex_get_metadata(self, node):
+        """
+        @param  node: node
+        @type   node: L{Node}
+        
+        @return: dictionary mapping metadata keys to metadata values
+        @rtype: dictionary mapping C{str} to C{str}
+        """
+        res = self.connection.request('%s/metadata' % get_url_path(node.id))
+        metadata_entries = res.object.findall(fixxpath(res.object, 'MetadataEntry'))
+        res_dict = {}
+        
+        for entry in metadata_entries:
+            key = entry.findtext(fixxpath(res.object, 'Key'))
+            value = entry.findtext(fixxpath(res.object, 'Value'))
+            res_dict[key] = value
+            
+        return res_dict
+    
+    def ex_set_metadata_entry(self, key, value, node):
+        """
+        @param key: metadata key to be set
+        @type key: C{str}
+        
+        @param value: metadata value to be set
+        @type value: C{str}
+        
+        @param  node: node
+        @type   node: L{Node}
+         
+        @rtype: C{None}
+        """
+        metadata_elem = ET.Element(
+            'Metadata', 
+            {'xmlns': "http://www.vmware.com/vcloud/v1.5",
+             'xmlns:xsi': "http://www.w3.org/2001/XMLSchema-instance"}
+        )
+        entry = ET.SubElement(metadata_elem, 'MetadataEntry')
+        key_elem = ET.SubElement(entry, 'Key')
+        key_elem.text = key
+        value_elem = ET.SubElement(entry, 'Value')
+        value_elem.text = value
+        
+        # send it back to the server
+        res = self.connection.request(
+            '%s/metadata' % get_url_path(node.id),
+            data=ET.tostring(metadata_elem),
+            headers={
+                'Content-Type': 'application/vnd.vmware.vcloud.metadata+xml'
+            },
+            method='POST')
+        self._wait_for_task_completion(res.object.get('href'))
 
     def ex_query(self, type, filter=None, page=1, page_size=100, sort_asc=None,
                  sort_desc=None):
diff --git libcloud/test/compute/fixtures/vcloud_1_5/api_vapp_get_metadata.xml libcloud/test/compute/fixtures/vcloud_1_5/api_vapp_get_metadata.xml
new file mode 100644
index 0000000..31d88a8
--- /dev/null
+++ libcloud/test/compute/fixtures/vcloud_1_5/api_vapp_get_metadata.xml
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Metadata xmlns="http://www.vmware.com/vcloud/v1.5" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vm-vcloud/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c/metadata" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://1.1.1.1/api/v1.5/schema/master.xsd">
+    <Link rel="up" type="application/vnd.vmware.vcloud.vApp+xml" href="https://vcd-director/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c"/>
+    <Link rel="add" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcd-director/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c/metadata"/>
+    <MetadataEntry type="application/vnd.vmware.vcloud.metadata.value+xml" href="https://vcd-director/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c/metadata/owners">
+        <Link rel="up" type="application/vnd.vmware.vcloud.metadata+xml" href="https://vcd-director/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c/metadata"/>
+        <Link rel="edit" type="application/vnd.vmware.vcloud.metadata.value+xml" href="https://vcd-director/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c/metadata/owners"/>
+        <Link rel="remove" href="https://vcd-director/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c/metadata/owners"/>
+        <Key>owners</Key>
+        <Value>msamia@netsuite.com</Value>
+    </MetadataEntry>
+</Metadata>
diff --git libcloud/test/compute/fixtures/vcloud_1_5/api_vapp_post_metadata.xml libcloud/test/compute/fixtures/vcloud_1_5/api_vapp_post_metadata.xml
new file mode 100644
index 0000000..04c7049
--- /dev/null
+++ libcloud/test/compute/fixtures/vcloud_1_5/api_vapp_post_metadata.xml
@@ -0,0 +1,6 @@
+<Task xmlns="http://www.vmware.com/vcloud/v1.5" status="running" startTime="2013-04-18T07:25:00.227-07:00" operationName="metadataUpdate" operation="Updating metadata for Virtual Application (2e0d3db0-1d5d-4d9f-a885-8f81e929db7c)" expiryTime="2013-07-17T07:25:00.227-07:00" name="task" id="urn:vcloud:task:7bcb14c1-0455-4169-ac0e-c951b941c4be" type="application/vnd.vmware.vcloud.task+xml" href="https://vm-vcloud/api/task/b034df55-fe81-4798-bc81-1f0fd0ead450" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.vmware.com/vcloud/v1.5 http://172.17.64.41/api/v1.5/schema/master.xsd">
+    <Link rel="task:cancel" href="https://vcd-director/api/task/7bcb14c1-0455-4169-ac0e-c951b941c4be/action/cancel"/>
+    <Owner type="application/vnd.vmware.vcloud.vApp+xml" name="" href="https://vcd-director/api/vApp/vapp-2e0d3db0-1d5d-4d9f-a885-8f81e929db7c"/>
+    <User type="application/vnd.vmware.admin.user+xml" name="msamia" href="https://vcd-director/api/admin/user/4106b68d-4d8b-4dce-9aa0-d61548910b83"/>
+    <Organization type="application/vnd.vmware.vcloud.org+xml" name="NetSuite" href="https://vcd-director/api/org/118a31f4-134c-490f-b4d9-0bedcd2c7ada"/>
+</Task>
diff --git libcloud/test/compute/test_vcloud.py libcloud/test/compute/test_vcloud.py
index 3f9744f..f5490ac 100644
--- libcloud/test/compute/test_vcloud.py
+++ libcloud/test/compute/test_vcloud.py
@@ -269,6 +269,15 @@ class VCloud_1_5_Tests(unittest.TestCase, TestCaseMixin):
             type = 'group',
             access_level = ControlAccess.AccessLevel.FULL_CONTROL)])
         self.driver.ex_set_control_access(node, control_access)
+        
+    def test_ex_get_metadata(self):
+        node = Node('https://vm-vcloud/api/vApp/vapp-8c57a5b6-e61b-48ca-8a78-3b70ee65ef6b', 'testNode', NodeState.RUNNING, [], [], self.driver)
+        metadata = self.driver.ex_get_metadata(node)
+        self.assertEqual(metadata, {'owners':'msamia@netsuite.com'})
+        
+    def test_ex_set_metadata_entry(self):
+        node = Node('https://vm-vcloud/api/vApp/vapp-8c57a5b6-e61b-48ca-8a78-3b70ee65ef6b', 'testNode', NodeState.RUNNING, [], [], self.driver)
+        self.driver.ex_set_metadata_entry('foo', 'bar', node)
 
 
 class TerremarkMockHttp(MockHttp):
@@ -504,6 +513,14 @@ class VCloud_1_5_MockHttp(MockHttp, unittest.TestCase):
             raise AssertionError('Unexpected query type')
         return httplib.OK, body, headers, httplib.responses[httplib.OK]
 
+    def _api_vApp_vapp_8c57a5b6_e61b_48ca_8a78_3b70ee65ef6b_metadata(self, method, url, body, headers):
+        if method == 'POST':
+            body = self.fixtures.load('api_vapp_post_metadata.xml')
+            return httplib.ACCEPTED, body, headers, httplib.responses[httplib.ACCEPTED]
+        else:
+            body = self.fixtures.load('api_vapp_get_metadata.xml')
+            return httplib.OK, body, headers, httplib.responses[httplib.OK]
+
     def _api_vApp_vapp_8c57a5b6_e61b_48ca_8a78_3b70ee65ef6b_controlAccess(self, method, url, body, headers):
         body = self.fixtures.load('api_vApp_vapp_8c57a5b6_e61b_48ca_8a78_3b70ee65ef6a_controlAccess.xml')
         return httplib.OK, body, headers, httplib.responses[httplib.OK]
