diff -u --recursive libcloud.orig/compute/drivers/ec2.py libcloud/compute/drivers/ec2.py
--- libcloud.orig/compute/drivers/ec2.py	2016-03-31 19:15:16.178040000 +0000
+++ libcloud/compute/drivers/ec2.py	2016-03-31 05:29:52.023282996 +0000
@@ -5302,7 +5302,12 @@
 
     def _ex_connection_class_kwargs(self):
         kwargs = super(BaseEC2NodeDriver, self)._ex_connection_class_kwargs()
-        kwargs['signature_version'] = self.signature_version
+        if self.token is None:
+            kwargs['signature_version'] = self.signature_version
+        else:
+            kwargs['token'] = self.token
+            # Force signature_version 4 for tokens or auth breaks
+            kwargs['signature_version'] = '4'
         return kwargs
 
     def _to_nodes(self, object, xpath):
@@ -6236,15 +6241,17 @@
     }
 
     def __init__(self, key, secret=None, secure=True, host=None, port=None,
-                 region='us-east-1', **kwargs):
+                 token=None, region='us-east-1', **kwargs):
         if hasattr(self, '_region'):
             region = self._region
 
         if region not in VALID_EC2_REGIONS:
             raise ValueError('Invalid region: %s' % (region))
 
+
         details = REGION_DETAILS[region]
         self.region_name = region
+        self.token = token
         self.api_name = details['api_name']
         self.country = details['country']
         self.signature_version = details.get('signature_version',
diff -u --recursive libcloud.orig/dns/drivers/route53.py libcloud/dns/drivers/route53.py
--- libcloud.orig/dns/drivers/route53.py	2016-03-31 19:15:16.156040000 +0000
+++ libcloud/dns/drivers/route53.py	2016-03-31 19:40:21.538172930 +0000
@@ -38,7 +38,7 @@
 from libcloud.dns.types import ZoneDoesNotExistError, RecordDoesNotExistError
 from libcloud.dns.base import DNSDriver, Zone, Record
 from libcloud.common.types import LibcloudError
-from libcloud.common.aws import AWSGenericResponse
+from libcloud.common.aws import AWSGenericResponse, SignedAWSConnection
 from libcloud.common.base import ConnectionUserAndKey
 
 
@@ -67,8 +67,10 @@
     }
 
 
-class Route53Connection(ConnectionUserAndKey):
+#class Route53Connection(ConnectionUserAndKey):
+class Route53Connection(SignedAWSConnection):
     host = API_HOST
+    version = API_VERSION
     responseCls = Route53DNSResponse
 
     def pre_connect_hook(self, params, headers):
@@ -115,6 +117,19 @@
         RecordType.TXT: 'TXT',
     }
 
+    def __init__(self, key, secret=None, secure=True, host=None, port=None,
+                 token=None, **kwargs):
+        self.token = token
+        super(Route53DNSDriver, self).__init__(key, secret=secret, secure=secure,
+                                               host=host, port=port, **kwargs)
+
+    def _ex_connection_class_kwargs(self):
+        kwargs = super(Route53DNSDriver, self)._ex_connection_class_kwargs()
+        if self.token is not None:
+            kwargs['token'] = self.token
+            kwargs['signature_version'] = '4'
+        return kwargs
+
     def iterate_zones(self):
         return self._get_more('zones')
 
@@ -124,6 +139,7 @@
     def get_zone(self, zone_id):
         self.connection.set_context({'zone_id': zone_id})
         uri = API_ROOT + 'hostedzone/' + zone_id
+        #uri = '/hostedzone/' + zone_id
         data = self.connection.request(uri).object
         elem = findall(element=data, xpath='HostedZone',
                        namespace=NAMESPACE)[0]
@@ -167,6 +183,7 @@
             ET.SubElement(hzg, 'Comment').text = extra['Comment']
 
         uri = API_ROOT + 'hostedzone'
+        #uri = '/hostedzone'
         data = ET.tostring(zone)
         rsp = self.connection.request(uri, method='POST', data=data).object
 
@@ -180,6 +197,7 @@
             self.ex_delete_all_records(zone=zone)
 
         uri = API_ROOT + 'hostedzone/%s' % (zone.id)
+        #uri = '/hostedzone/%s' % (zone.id)
         response = self.connection.request(uri, method='DELETE')
         return response.status in [httplib.OK]
 
@@ -261,6 +279,7 @@
             ET.SubElement(rrec, 'Value').text = value
 
         uri = API_ROOT + 'hostedzone/' + zone.id + '/rrset'
+        #uri = '/hostedzone/' + zone.id + '/rrset'
         data = ET.tostring(changeset)
         self.connection.set_context({'zone_id': zone.id})
         self.connection.request(uri, method='POST', data=data)
@@ -359,6 +378,7 @@
             rrec = ET.SubElement(rrecs, 'ResourceRecord')
             ET.SubElement(rrec, 'Value').text = other_record['data']
         uri = API_ROOT + 'hostedzone/' + record.zone.id + '/rrset'
+        #uri = '/hostedzone/' + record.zone.id + '/rrset'
         data = ET.tostring(changeset)
         self.connection.set_context({'zone_id': record.zone.id})
         response = self.connection.request(uri, method='POST', data=data)
@@ -393,6 +413,7 @@
             ET.SubElement(rrec, 'Value').text = data
 
         uri = API_ROOT + 'hostedzone/' + zone.id + '/rrset'
+        #uri = '/hostedzone/' + zone.id + '/rrset'
         data = ET.tostring(changeset)
         self.connection.set_context({'zone_id': zone.id})
         response = self.connection.request(uri, method='POST', data=data)
@@ -523,6 +544,7 @@
         if last_key:
             params['name'] = last_key
         path = API_ROOT + 'hostedzone'
+        #path = '/hostedzone'
 
         if rtype == 'zones':
             response = self.connection.request(path, params=params)
