diff --git libcloud/compute/drivers/vcloud.py libcloud/compute/drivers/vcloud.py
index 45185e1..6ef166f 100644
--- libcloud/compute/drivers/vcloud.py
+++ libcloud/compute/drivers/vcloud.py
@@ -1339,6 +1339,9 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
         @keyword    ex_vm_fence: Fence mode for connecting the vApp VM network (ex_vm_network) to the parent
                                  organisation network (ex_network).
         @type       ex_vm_fence: C{str}
+        
+        @keyword    ex_vm_ipaddress: IP address for vApp VM (single VM in vAPP).
+        @type       ex_vm_ipaddress: C{str}
 
         @keyword    ex_vm_ipmode: IP address allocation mode for all vApp VM network connections.
         @type       ex_vm_ipmode: C{str}
@@ -1355,6 +1358,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
         ex_vm_fence = kwargs.get('ex_vm_fence', None)
         ex_network = kwargs.get('ex_network', None)
         ex_vm_network = kwargs.get('ex_vm_network', None)
+        ex_vm_ipaddress = kwargs.get('ex_vm_ipaddress', None)
         ex_vm_ipmode = kwargs.get('ex_vm_ipmode', None)
         ex_deploy = kwargs.get('ex_deploy', True)
         ex_vdc = kwargs.get('ex_vdc', None)
@@ -1363,6 +1367,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
         self._validate_vm_cpu(ex_vm_cpu)
         self._validate_vm_memory(ex_vm_memory)
         self._validate_vm_fence(ex_vm_fence)
+        
         self._validate_vm_ipmode(ex_vm_ipmode)
         ex_vm_script = self._validate_vm_script(ex_vm_script)
 
@@ -1388,7 +1393,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
         self._change_vm_cpu(vapp_href, ex_vm_cpu)
         self._change_vm_memory(vapp_href, ex_vm_memory)
         self._change_vm_script(vapp_href, ex_vm_script)
-        self._change_vm_ipmode(vapp_href, ex_vm_ipmode)
+        self._change_vm_ipmode(vapp_href, ex_vm_ipmode, ex_vm_ipaddress)
 
         # Power on the VM.
         if ex_deploy:
@@ -1620,8 +1625,6 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
     def _validate_vm_ipmode(vm_ipmode):
         if vm_ipmode is None:
             return
-        elif vm_ipmode == 'MANUAL':
-            raise NotImplementedError('MANUAL IP mode: The interface for supplying IPAddress does not exist yet')
         elif vm_ipmode not in IP_MODE_VALS_1_5:
             raise ValueError('%s is not a valid IP address allocation mode value' % vm_ipmode)
 
@@ -1790,7 +1793,7 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
             )
             self._wait_for_task_completion(res.object.get('href'))
 
-    def _change_vm_ipmode(self, vapp_or_vm_id, vm_ipmode):
+    def _change_vm_ipmode(self, vapp_or_vm_id, vm_ipmode, vm_ip_address):
         if vm_ipmode is None:
             return
 
@@ -1802,7 +1805,22 @@ class VCloud_1_5_NodeDriver(VCloudNodeDriver):
             net_conns = res.object.findall(
                 fixxpath(res.object, 'NetworkConnection'))
             for c in net_conns:
+                # Update IP mode
                 c.find(fixxpath(c, 'IpAddressAllocationMode')).text = vm_ipmode
+                if (vm_ip_address and vm_ipmode == 'MANUAL'):    
+                    # Check first for the IpAddress element
+                    ip_element_tag = fixxpath(res.object, 'IpAddress')
+                    ip_elem = c.find(ip_element_tag)
+                    # Delete IpAddress element if needed
+                    # Should be just one otherwise vCD complains
+                    if ip_elem != None:
+                        c.remove(ip_elem)
+                    # Create and insert a new IpAddress element
+                    ip_elem = ET.Element(ip_element_tag)
+                    c.insert(1, ip_elem)
+                    ip_elem.text = vm_ip_address
+                else:
+                    raise ValueError("IP address is required if IP Mode is set to %s" % vm_ipmode)
 
             res = self.connection.request(
                 '%s/networkConnectionSection' % get_url_path(vm.get('href')),
