diff --git a/cloudify_rest_client/aria/mapi/mapi.py b/cloudify_rest_client/aria/mapi/mapi.py
index 401c9de..5c4fa76 100644
--- a/cloudify_rest_client/aria/mapi/mapi.py
+++ b/cloudify_rest_client/aria/mapi/mapi.py
@@ -88,7 +88,7 @@ class RESTMAPI(api.ModelAPI):
             wrapper = wrappers.DictWrapper
             kw = dict(
                     (key, self._wrap(value, '/'.join([attribute_path, key])))
-                    for key, value in value.items()
+                    for key, value in list(value.items())
                 )
         elif isinstance(value, list):
             wrapper = wrappers.ListWrapper
diff --git a/cloudify_rest_client/aria/mapi/wrappers.py b/cloudify_rest_client/aria/mapi/wrappers.py
index bdee6de..13af062 100644
--- a/cloudify_rest_client/aria/mapi/wrappers.py
+++ b/cloudify_rest_client/aria/mapi/wrappers.py
@@ -71,7 +71,7 @@ class DictWrapper(dict, WrapperBase):
         )
 
     def itervalues(self):
-        return iter(self.values())
+        return iter(list(self.values()))
 
     def items(self):
         return [
@@ -81,7 +81,7 @@ class DictWrapper(dict, WrapperBase):
         ]
 
     def iteritems(self):
-        return iter(self.items())
+        return iter(list(self.items()))
 
     def keys(self):
         return [
@@ -91,10 +91,10 @@ class DictWrapper(dict, WrapperBase):
         ]
 
     def iterkeys(self):
-        return iter(self.keys())
+        return iter(list(self.keys()))
 
     def __iter__(self):
-        return self.iterkeys()
+        return iter(self.keys())
 
 
 class ListWrapper(list, WrapperBase):
diff --git a/cloudify_rest_client/aria/service_templates.py b/cloudify_rest_client/aria/service_templates.py
index 05b86df..d49a91f 100644
--- a/cloudify_rest_client/aria/service_templates.py
+++ b/cloudify_rest_client/aria/service_templates.py
@@ -14,8 +14,8 @@
 #    * limitations under the License.
 
 import os
-import urllib
-import urlparse
+import urllib.request, urllib.parse, urllib.error
+import urllib.parse
 from functools import partial
 
 from .. import bytes_stream_utils
@@ -41,14 +41,14 @@ class ServiceTemplateClient(BlueprintsClient):
 
         if application_file_name is not None:
             query_params['application_file_name'] = \
-                urllib.quote(application_file_name)
+                urllib.parse.quote(application_file_name)
 
         uri = '/{self._uri_prefix}/{id}'.format(self=self,
                                                 id=service_template_id)
 
         # For a Windows path (e.g. "C:\aaa\bbb.zip") scheme is the
         # drive letter and therefore the 2nd condition is present
-        if urlparse.urlparse(archive_location).scheme and \
+        if urllib.parse.urlparse(archive_location).scheme and \
                 not os.path.exists(archive_location):
             # archive location is URL
             query_params['service_template_csar_url'] = archive_location
diff --git a/cloudify_rest_client/blueprints.py b/cloudify_rest_client/blueprints.py
index 5d19325..5f533cc 100644
--- a/cloudify_rest_client/blueprints.py
+++ b/cloudify_rest_client/blueprints.py
@@ -16,8 +16,8 @@
 import os
 import tempfile
 import shutil
-import urllib
-import urlparse
+import urllib.request, urllib.parse, urllib.error
+import urllib.parse
 import contextlib
 
 from cloudify_rest_client import utils
@@ -95,13 +95,13 @@ class BlueprintsClient(object):
         query_params = {'visibility': visibility}
         if application_file_name is not None:
             query_params['application_file_name'] = \
-                urllib.quote(application_file_name)
+                urllib.parse.quote(application_file_name)
 
         uri = '/{self._uri_prefix}/{id}'.format(self=self, id=blueprint_id)
 
         # For a Windows path (e.g. "C:\aaa\bbb.zip") scheme is the
         # drive letter and therefore the 2nd condition is present
-        if urlparse.urlparse(archive_location).scheme and \
+        if urllib.parse.urlparse(archive_location).scheme and \
                 not os.path.exists(archive_location):
             # archive location is URL
             query_params['blueprint_archive_url'] = archive_location
diff --git a/cloudify_rest_client/client.py b/cloudify_rest_client/client.py
index 84641d2..0528e66 100644
--- a/cloudify_rest_client/client.py
+++ b/cloudify_rest_client/client.py
@@ -144,13 +144,13 @@ class HTTPClient(object):
                                    verify=verify,
                                    timeout=timeout or self.default_timeout_sec)
         if self.logger.isEnabledFor(logging.DEBUG):
-            for hdr, hdr_content in response.request.headers.iteritems():
+            for hdr, hdr_content in response.request.headers.items():
                 self.logger.debug('request header:  %s: %s'
                                   % (hdr, hdr_content))
             self.logger.debug('reply:  "%s %s" %s'
                               % (response.status_code,
                                  response.reason, response.content))
-            for hdr, hdr_content in response.headers.iteritems():
+            for hdr, hdr_content in response.headers.items():
                 self.logger.debug('response header:  %s: %s'
                                   % (hdr, hdr_content))
 
@@ -209,7 +209,7 @@ class HTTPClient(object):
         body = json.dumps(data) if is_dict_data else data
         if self.logger.isEnabledFor(logging.DEBUG):
             log_message = 'Sending request: {0} {1}'.format(
-                requests_method.func_name.upper(),
+                requests_method.__name__.upper(),
                 request_url)
             if is_dict_data:
                 log_message += '; body: {0}'.format(body)
@@ -299,8 +299,8 @@ class HTTPClient(object):
         if not username or not password:
             return None
         credentials = '{0}:{1}'.format(username, password)
-        encoded_credentials = urlsafe_b64encode(credentials)
-        return BASIC_AUTH_PREFIX + ' ' + encoded_credentials
+        encoded_credentials = urlsafe_b64encode(credentials.encode("utf-8"))
+        return BASIC_AUTH_PREFIX + ' ' + str(encoded_credentials, "utf-8")
 
     def _set_header(self, key, value, log_value=True):
         if not value:
diff --git a/cloudify_rest_client/deployment_updates.py b/cloudify_rest_client/deployment_updates.py
index 5010d86..d7db897 100644
--- a/cloudify_rest_client/deployment_updates.py
+++ b/cloudify_rest_client/deployment_updates.py
@@ -14,9 +14,9 @@
 #    * limitations under the License.
 import os
 import json
-import urllib
+import urllib.request, urllib.parse, urllib.error
 import shutil
-import urlparse
+import urllib.parse
 import tempfile
 from mimetypes import MimeTypes
 
@@ -129,11 +129,11 @@ class DeploymentUpdatesClient(object):
 
         if application_file_name:
             params['application_file_name'] = \
-                urllib.quote(application_file_name)
+                urllib.parse.quote(application_file_name)
 
         # For a Windows path (e.g. "C:\aaa\bbb.zip") scheme is the
         # drive letter and therefore the 2nd condition is present
-        if all([urlparse.urlparse(archive_path).scheme,
+        if all([urllib.parse.urlparse(archive_path).scheme,
                 not os.path.exists(archive_path)]):
             # archive location is URL
             params['blueprint_archive_url'] = archive_path
@@ -142,7 +142,7 @@ class DeploymentUpdatesClient(object):
                 os.path.basename(archive_path),
                 open(archive_path, 'rb'),
                 # Guess the archive mime type
-                mime_types.guess_type(urllib.pathname2url(archive_path)))
+                mime_types.guess_type(urllib.request.pathname2url(archive_path)))
 
         return data_form, params
 
diff --git a/cloudify_rest_client/plugins.py b/cloudify_rest_client/plugins.py
index 76171b4..32e3e47 100644
--- a/cloudify_rest_client/plugins.py
+++ b/cloudify_rest_client/plugins.py
@@ -14,7 +14,7 @@
 #    * limitations under the License.
 
 import os
-import urlparse
+import urllib.parse
 import contextlib
 
 from cloudify_rest_client import bytes_stream_utils
@@ -222,7 +222,7 @@ class PluginsClient(object):
         assert plugin_path
         query_params = {'visibility': visibility}
         timeout = self.api.default_timeout_sec
-        if urlparse.urlparse(plugin_path).scheme and \
+        if urllib.parse.urlparse(plugin_path).scheme and \
                 not os.path.exists(plugin_path):
             query_params['plugin_archive_url'] = plugin_path
             data = None
diff --git a/cloudify_rest_client/snapshots.py b/cloudify_rest_client/snapshots.py
index 851c3a3..0c40ceb 100644
--- a/cloudify_rest_client/snapshots.py
+++ b/cloudify_rest_client/snapshots.py
@@ -14,7 +14,7 @@
 #    * limitations under the License.
 
 import os
-import urlparse
+import urllib.parse
 import contextlib
 
 from cloudify_rest_client import bytes_stream_utils
@@ -192,7 +192,7 @@ class SnapshotsClient(object):
         uri = '/snapshots/{0}/archive'.format(snapshot_id)
         query_params = {}
 
-        if urlparse.urlparse(snapshot_path).scheme and \
+        if urllib.parse.urlparse(snapshot_path).scheme and \
                 not os.path.exists(snapshot_path):
             query_params['snapshot_archive_url'] = snapshot_path
             data = None