diff --git a/Makefile b/Makefile
index d312845..55864f2 100644
--- a/Makefile
+++ b/Makefile
@@ -43,11 +43,11 @@
 	# python-novaclient is required for that
 	rm -f build/osm_ro/openmanolinkervimconn.py
 	cd build/osm_ro; for i in `ls vimconn_*.py |sed "s/\.py//"` ; do echo "import $$i" >> openmanolinkervimconn.py; done
-	python build/osm_ro/openmanolinkervimconn.py
+	python3 build/osm_ro/openmanolinkervimconn.py 2>&1
 	rm -f build/osm_ro/openmanolinkervimconn.py
 
 build: connectors prepare
-	python -m py_compile build/osm_ro/*.py
+	python3 -m py_compile build/osm_ro/*.py
 #	cd build && tox -e flake8
 
 lib-openvim:
@@ -65,11 +65,11 @@
 
 package: prepare
 #	apt-get install -y python-stdeb
-	cd build && python setup.py --command-packages=stdeb.command sdist_dsc --with-python2=True
+	cd build && python3 setup.py --command-packages=stdeb.command sdist_dsc --with-python2=True
 	cd build && cp osm_ro/scripts/python-osm-ro.postinst deb_dist/osm-ro*/debian/
 	cd build/deb_dist/osm-ro* && dpkg-buildpackage -rfakeroot -uc -us
 	mkdir -p .build
-	cp build/deb_dist/python-*.deb .build/
+	cp build/deb_dist/python3-*.deb .build/
 
 snap:
 	echo "Nothing to be done yet"
@@ -103,5 +103,3 @@
 
 stop-docker:
 	docker-compose -f docker/openmano-compose.yml down
-
-
diff --git a/openmanod b/openmanod
index 145fd24..149e924 100755
--- a/openmanod
+++ b/openmanod
@@ -48,7 +48,7 @@
 
 __author__ = "Alfonso Tierno, Gerardo Garcia, Pablo Montes"
 __date__ = "$26-aug-2014 11:09:29$"
-__version__ = "0.5.36-r546"
+__version__ = "0.5.37-r547"
 version_date = "Oct 2017"
 database_version = 27      # expected database schema version
 
diff --git a/osm_ro/db_base.py b/osm_ro/db_base.py
index 42e072b..c8e5eb1 100644
--- a/osm_ro/db_base.py
+++ b/osm_ro/db_base.py
@@ -29,7 +29,7 @@
 
 import MySQLdb as mdb
 import uuid as myUuid
-from . import  utils as af
+import  utils as af
 import json
 #import yaml
 import time
@@ -65,7 +65,7 @@
     It enters recursively in the dict var finding this kind of variables
     '''
     if type(var) is dict:
-        for k,v in list(var.items()):
+        for k,v in var.items():
             if type(v) is datetime.datetime:
                 var[k]= v.strftime('%Y-%m-%dT%H:%M:%S')
             elif type(v) is dict or type(v) is list or type(v) is tuple: 
@@ -85,7 +85,7 @@
         None
     '''
     if type(data) is dict:
-        for k in list(data.keys()):
+        for k in data.keys():
             if type(data[k]) is dict or type(data[k]) is tuple or type(data[k]) is list:
                 _convert_bandwidth(data[k], reverse, logger)
         if "bandwidth" in data:
@@ -120,7 +120,7 @@
         None
     '''
     if type(data) is dict:
-        for k in list(data.keys()):
+        for k in data.keys():
             if type(data[k]) is dict or type(data[k]) is tuple or type(data[k]) is list:
                 _convert_str2boolean(data[k], items)
             if k in items:
@@ -320,7 +320,7 @@
     
     def __remove_quotes(self, data):
         '''remove single quotes ' of any string content of data dictionary'''
-        for k,v in list(data.items()):
+        for k,v in data.items():
             if type(v) == str:
                 if "'" in v: 
                     data[k] = data[k].replace("'","_")
@@ -334,11 +334,11 @@
         Return: the number of updated rows, exception if error
         '''
                 #gettting uuid 
-        values = ",".join(map(self.__tuple2db_format_set, iter(UPDATE.items()) ))
+        values = ",".join(map(self.__tuple2db_format_set, UPDATE.iteritems() ))
         if modified_time:
             values += ",modified_at={:f}".format(modified_time)
         cmd= "UPDATE " + table +" SET " + values +\
-            " WHERE " + " and ".join(map(self.__tuple2db_format_where, iter(WHERE.items()) ))
+            " WHERE " + " and ".join(map(self.__tuple2db_format_where, WHERE.iteritems() ))
         self.logger.debug(cmd)
         self.cur.execute(cmd) 
         return self.cur.rowcount
@@ -400,7 +400,7 @@
             self.cur.execute(cmd)
         #insertion
         cmd= "INSERT INTO " + table +" SET " + \
-            ",".join(map(self.__tuple2db_format_set, iter(INSERT.items()) )) 
+            ",".join(map(self.__tuple2db_format_set, INSERT.iteritems() )) 
         if created_time:
             cmd += ",created_at=%f" % created_time
         if confidential_data:
@@ -501,11 +501,11 @@
         #print 'from_', from_
         if 'WHERE' in sql_dict and len(sql_dict['WHERE']) > 0:
             w=sql_dict['WHERE']
-            where_ = "WHERE " + " AND ".join(map(self.__tuple2db_format_where, iter(w.items()))) 
+            where_ = "WHERE " + " AND ".join(map(self.__tuple2db_format_where, w.iteritems())) 
         else: where_ = ""
         if 'WHERE_NOT' in sql_dict and len(sql_dict['WHERE_NOT']) > 0: 
             w=sql_dict['WHERE_NOT']
-            where_2 = " AND ".join(map(self.__tuple2db_format_where_not, iter(w.items())))
+            where_2 = " AND ".join(map(self.__tuple2db_format_where_not, w.iteritems()))
             if len(where_)==0:   where_ = "WHERE " + where_2
             else:                where_ = where_ + " AND " + where_2
         #print 'where_', where_
@@ -563,14 +563,14 @@
         where_or = ""
         w=sql_dict.get('WHERE')
         if w:
-            where_and = " AND ".join(map(self.__tuple2db_format_where, iter(w.items()) ))
+            where_and = " AND ".join(map(self.__tuple2db_format_where, w.iteritems() ))
         w=sql_dict.get('WHERE_NOT')
         if w: 
             if where_and: where_and += " AND "
-            where_and += " AND ".join(map(self.__tuple2db_format_where_not, iter(w.items()) ) )
+            where_and += " AND ".join(map(self.__tuple2db_format_where_not, w.iteritems() ) )
         w=sql_dict.get('WHERE_OR')
         if w:
-            where_or =  " OR ".join(map(self.__tuple2db_format_where, iter(w.items()) ))
+            where_or =  " OR ".join(map(self.__tuple2db_format_where, w.iteritems() ))
         if where_and and where_or:
             if sql_dict.get("WHERE_AND_OR") == "AND":
                 where_ = "WHERE " + where_and + " AND (" + where_or + ")"
@@ -619,7 +619,7 @@
         what = 'uuid' if af.check_valid_uuid(uuid_name) else 'name'
         cmd =  " SELECT * FROM {} WHERE {}='{}'".format(table, what, uuid_name)
         if WHERE_OR:
-            where_or =  " OR ".join(map(self.__tuple2db_format_where, iter(WHERE_OR.items()) ))
+            where_or =  " OR ".join(map(self.__tuple2db_format_where, WHERE_OR.iteritems() ))
             if WHERE_AND_OR == "AND":
                 cmd += " AND (" + where_or + ")"
             else:
@@ -657,7 +657,7 @@
                     rows = self.cur.fetchall()
                     return self.cur.rowcount, rows
             except (mdb.Error, AttributeError) as e:
-                print("nfvo_db.get_uuid DB Exception %d: %s" % (e.args[0], e.args[1]))
+                print "nfvo_db.get_uuid DB Exception %d: %s" % (e.args[0], e.args[1])
                 r,c = self._format_error(e)
                 if r!=-HTTP_Request_Timeout or retry_==1: return r,c
 
diff --git a/osm_ro/httpserver.py b/osm_ro/httpserver.py
index 1f08c46..b043267 100644
--- a/osm_ro/httpserver.py
+++ b/osm_ro/httpserver.py
@@ -37,7 +37,7 @@
 import logging
 
 from jsonschema import validate as js_v, exceptions as js_e
-from .openmano_schemas import vnfd_schema_v01, vnfd_schema_v02, \
+from openmano_schemas import vnfd_schema_v01, vnfd_schema_v02, \
                             nsd_schema_v01, nsd_schema_v02, nsd_schema_v03, scenario_edit_schema, \
                             scenario_action_schema, instance_scenario_action_schema, instance_scenario_create_schema_v01, \
                             tenant_schema, tenant_edit_schema,\
@@ -45,9 +45,9 @@
                             object_schema, netmap_new_schema, netmap_edit_schema, sdn_controller_schema, sdn_controller_edit_schema, \
                             sdn_port_mapping_schema, sdn_external_port_schema
 
-from . import nfvo
-from . import utils
-from .db_base import db_base_Exception
+import nfvo
+import utils
+from db_base import db_base_Exception
 from functools import wraps
 
 global mydb
@@ -67,7 +67,7 @@
 
 def delete_nulls(var):
     if type(var) is dict:
-        for k in list(var.keys()):
+        for k in var.keys():
             if var[k] is None: del var[k]
             elif type(var[k]) is dict or type(var[k]) is list or type(var[k]) is tuple: 
                 if delete_nulls(var[k]): del var[k]
@@ -83,7 +83,7 @@
     It enters recursively in the dict var finding this kind of variables
     '''
     if type(var) is dict:
-        for k,v in list(var.items()):
+        for k,v in var.items():
             if type(v) is float and k in ("created_at", "modified_at"):
                 var[k] = time.strftime("%Y-%m-%dT%H:%M:%S", time.localtime(v) )
             elif type(v) is dict or type(v) is list or type(v) is tuple: 
@@ -166,10 +166,10 @@
             change_keys_http2db(d, http_db, reverse)
     elif type(data) is dict or type(data) is bottle.FormsDict:
         if reverse:
-            for k,v in list(http_db.items()):
+            for k,v in http_db.items():
                 if v in data: data[k]=data.pop(v)
         else:
-            for k,v in list(http_db.items()):
+            for k,v in http_db.items():
                 if k in data: data[v]=data.pop(k)
 
 def format_out(data):
@@ -767,7 +767,7 @@
         if netmap_id and len(netmaps)==1:
             data={'netmap' : netmaps[0]}
         elif netmap_id and len(netmaps)==0:
-            bottle.abort(HTTP_Not_Found, "No netmap found with " + " and ".join([str(x[0])+": "+str(x[1]) for x in iter(where_.items())]) )
+            bottle.abort(HTTP_Not_Found, "No netmap found with " + " and ".join(map(lambda x: str(x[0])+": "+str(x[1]), where_.iteritems())) )
             return 
         else:
             data={'netmaps' : netmaps}
@@ -799,7 +799,7 @@
         #change_keys_http2db(content, http2db_tenant, reverse=True)
         deleted = mydb.delete_row(FROM='datacenter_nets', WHERE= where_) 
         if deleted == 0 and netmap_id:
-            bottle.abort(HTTP_Not_Found, "No netmap found with " + " and ".join([str(x[0])+": "+str(x[1]) for x in iter(where_.items())]) )
+            bottle.abort(HTTP_Not_Found, "No netmap found with " + " and ".join(map(lambda x: str(x[0])+": "+str(x[1]), where_.iteritems())) )
         if netmap_id:
             return format_out({"result": "netmap %s deleted" % netmap_id})
         else:
diff --git a/osm_ro/nfvo.py b/osm_ro/nfvo.py
index 8a1d949..bd5b5d6 100644
--- a/osm_ro/nfvo.py
+++ b/osm_ro/nfvo.py
@@ -30,18 +30,18 @@
 # import imp
 # import json
 import yaml
-from . import utils
-from . import vim_thread
-from .db_base import HTTP_Unauthorized, HTTP_Bad_Request, HTTP_Internal_Server_Error, HTTP_Not_Found,\
+import utils
+import vim_thread
+from db_base import HTTP_Unauthorized, HTTP_Bad_Request, HTTP_Internal_Server_Error, HTTP_Not_Found,\
     HTTP_Conflict, HTTP_Method_Not_Allowed
-from . import console_proxy_thread as cli
-from . import vimconn
+import console_proxy_thread as cli
+import vimconn
 import logging
 import collections
 from uuid import uuid4
-from .db_base import db_base_Exception
+from db_base import db_base_Exception
 
-from . import nfvo_db
+import nfvo_db
 from threading import Lock
 import time as t
 from lib_osm_openvim import ovim as ovim_module
@@ -212,7 +212,7 @@
     global ovim, global_config
     if ovim:
         ovim.stop_service()
-    for thread_id,thread in list(vim_threads["running"].items()):
+    for thread_id,thread in vim_threads["running"].items():
         thread.insert_task("exit")
         vim_threads["deleting"][thread_id] = thread
     vim_threads["running"] = {}
@@ -518,7 +518,7 @@
             image_mano_id = mydb.new_row('images', temp_image_dict, add_uuid=True)
             rollback_list.append({"where":"mano", "what":"image","uuid":image_mano_id})
     #create image at every vim
-    for vim_id,vim in vims.items():
+    for vim_id,vim in vims.iteritems():
         datacenter_vim_id = vim["config"]["datacenter_tenant_id"]
         image_created="false"
         #look at database
@@ -636,7 +636,7 @@
     if 'uuid' in flavor_dict:
         del flavor_dict['uuid']
     flavor_vim_id=None
-    for vim_id,vim in list(vims.items()):
+    for vim_id,vim in vims.items():
         datacenter_vim_id = vim["config"]["datacenter_tenant_id"]
         flavor_created="false"
         #look at database
@@ -809,7 +809,7 @@
         vnfd_descriptor_list = vnfd_catalog_descriptor.get("vnfd")
         if not vnfd_descriptor_list:
             vnfd_descriptor_list = vnfd_catalog_descriptor.get("vnfd:vnfd")
-        for vnfd_yang in myvnfd.vnfd_catalog.vnfd.values():
+        for vnfd_yang in myvnfd.vnfd_catalog.vnfd.itervalues():
             vnfd = vnfd_yang.get()
 
             # table vnf
@@ -833,7 +833,7 @@
 
             # table nets (internal-vld)
             net_id2uuid = {}  # for mapping interface with network
-            for vld in vnfd.get("internal-vld").values():
+            for vld in vnfd.get("internal-vld").itervalues():
                 net_uuid = str(uuid4())
                 uuid_list.append(net_uuid)
                 db_net = {
@@ -849,7 +849,7 @@
             # table vms (vdus)
             vdu_id2uuid = {}
             vdu_id2db_table_index = {}
-            for vdu in vnfd.get("vdu").values():
+            for vdu in vnfd.get("vdu").itervalues():
                 vm_uuid = str(uuid4())
                 uuid_list.append(vm_uuid)
                 db_vm = {
@@ -928,7 +928,7 @@
                                     epa_vcpu_set = True
                                 if len(numa_node["paired-threads"].get("paired-thread-ids")):
                                     numa["paired-threads-id"] = []
-                                    for pair in numa_node["paired-threads"]["paired-thread-ids"].values():
+                                    for pair in numa_node["paired-threads"]["paired-thread-ids"].itervalues():
                                         numa["paired-threads-id"].append(
                                             (str(pair["thread-a"]), str(pair["thread-b"]))
                                         )
@@ -983,7 +983,7 @@
                             boot_data['boot-data-drive'] = True
                     if vdu["supplemental-boot-data"].get('config-file'):
                         om_cfgfile_list = list()
-                        for custom_config_file in vdu["supplemental-boot-data"]['config-file'].values():
+                        for custom_config_file in vdu["supplemental-boot-data"]['config-file'].itervalues():
                             # TODO Where this file content is present???
                             cfg_source = str(custom_config_file["source"])
                             om_cfgfile_list.append({"dest": custom_config_file["dest"],
@@ -999,7 +999,7 @@
                 cp_name2iface_uuid = {}
                 cp_name2vm_uuid = {}
                 # for iface in chain(vdu.get("internal-interface").itervalues(), vdu.get("external-interface").itervalues()):
-                for iface in vdu.get("interface").values():
+                for iface in vdu.get("interface").itervalues():
                     iface_uuid = str(uuid4())
                     uuid_list.append(iface_uuid)
                     db_interface = {
@@ -1051,8 +1051,8 @@
                                                 HTTP_Bad_Request)
                     elif iface.get("internal-connection-point-ref"):
                         try:
-                            for vld in vnfd.get("internal-vld").values():
-                                for cp in vld.get("internal-connection-point").values():
+                            for vld in vnfd.get("internal-vld").itervalues():
+                                for cp in vld.get("internal-connection-point").itervalues():
                                     if cp.get("id-ref") == iface.get("internal-connection-point-ref"):
                                         db_interface["net_id"] = net_id2uuid[vld.get("id")]
                                         for cp_descriptor in vnfd_descriptor["connection-point"]:
@@ -1075,9 +1075,9 @@
                     db_interfaces.append(db_interface)
 
             # VNF affinity and antiaffinity
-            for pg in vnfd.get("placement-groups").values():
+            for pg in vnfd.get("placement-groups").itervalues():
                 pg_name = get_str(pg, "name", 255)
-                for vdu in pg.get("member-vdus").values():
+                for vdu in pg.get("member-vdus").itervalues():
                     vdu_id = get_str(vdu, "member-vdu-ref", 255)
                     if vdu_id not in vdu_id2db_table_index:
                         raise NfvoException("Error. Invalid VNF descriptor at 'vnfd[{vnf}]':'placement-groups[{pg}]':"
@@ -1427,7 +1427,7 @@
 
     vnf_id = vnf["uuid"]
     filter_keys = ('uuid', 'name', 'description', 'public', "tenant_id", "osm_id", "created_at")
-    filtered_content = dict( (k,v) for k,v in vnf.items() if k in filter_keys )
+    filtered_content = dict( (k,v) for k,v in vnf.iteritems() if k in filter_keys )
     #change_keys_http2db(filtered_content, http2db_vnf, reverse=True)
     data={'vnf' : filtered_content}
     #GET VM
@@ -1580,7 +1580,7 @@
         return result, vims
     elif result == 0:
         return -HTTP_Not_Found, "datacenter '%s' not found" % datacenter_name
-    myvim = list(vims.values())[0]
+    myvim = vims.values()[0]
     result,servers =  myvim.get_hosts_info()
     if result < 0:
         return result, servers
@@ -1595,7 +1595,7 @@
     elif len(vims)>1:
         #print "nfvo.datacenter_action() error. Several datacenters found"
         raise NfvoException("More than one datacenters found, try to identify with uuid", HTTP_Conflict)
-    myvim = list(vims.values())[0]
+    myvim = vims.values()[0]
     try:
         hosts =  myvim.get_hosts()
         logger.debug('VIM hosts response: '+ yaml.safe_dump(hosts, indent=4, default_flow_style=False))
@@ -1643,7 +1643,7 @@
     vnfs={}
     other_nets={}  #external_networks, bridge_networks and data_networkds
     nodes = topo['topology']['nodes']
-    for k in list(nodes.keys()):
+    for k in nodes.keys():
         if nodes[k]['type'] == 'VNF':
             vnfs[k] = nodes[k]
             vnfs[k]['ifaces'] = {}
@@ -1656,7 +1656,7 @@
 
 
 #1.2: Check that VNF are present at database table vnfs. Insert uuid, description and external interfaces
-    for name,vnf in list(vnfs.items()):
+    for name,vnf in vnfs.items():
         where={}
         where_or={"tenant_id": tenant_id, 'public': "true"}
         error_text = ""
@@ -1692,12 +1692,12 @@
     conections = topo['topology']['connections']
     conections_list = []
     conections_list_name = []
-    for k in list(conections.keys()):
+    for k in conections.keys():
         if type(conections[k]['nodes'])==dict: #dict with node:iface pairs
-            ifaces_list = list(conections[k]['nodes'].items())
+            ifaces_list = conections[k]['nodes'].items()
         elif type(conections[k]['nodes'])==list: #list with dictionary
             ifaces_list=[]
-            conection_pair_list = [list(x.items()) for x in conections[k]['nodes']]
+            conection_pair_list = map(lambda x: x.items(), conections[k]['nodes'] )
             for k2 in conection_pair_list:
                 ifaces_list += k2
 
@@ -1761,7 +1761,7 @@
 #                    del con[index]
 #            del other_nets[k]
 #1.7: Check external_ports are present at database table datacenter_nets
-    for k,net in list(other_nets.items()):
+    for k,net in other_nets.items():
         error_pos = "'topology':'nodes':'" + k + "'"
         if net['external']==False:
             if 'name' not in net:
@@ -1809,7 +1809,7 @@
         #print "con", con
         for index in range(0,len(con)):
             #check if this is connected to a external net
-            for net_key in list(other_nets.keys()):
+            for net_key in other_nets.keys():
                 if con[index][0]==net_key:
                     if other_net_index>=0:
                         error_text="There is some interface connected both to net '%s' and net '%s'" % (con[other_net_index][0], net_key)
@@ -1880,8 +1880,8 @@
     #1.8.2 check all interfaces from all vnfs
     if len(mgmt_net)>0:
         add_mgmt_net = False
-        for vnf in list(vnfs.values()):
-            for iface in list(vnf['ifaces'].values()):
+        for vnf in vnfs.values():
+            for iface in vnf['ifaces'].values():
                 if iface['type']=='mgmt' and 'net_key' not in iface:
                     #iface not connected
                     iface['net_key'] = 'mgmt'
@@ -1922,7 +1922,7 @@
         tenant_id=None
 
     # 1: Check that VNF are present at database table vnfs and update content into scenario dict
-    for name,vnf in scenario["vnfs"].items():
+    for name,vnf in scenario["vnfs"].iteritems():
         where={}
         where_or={"tenant_id": tenant_id, 'public': "true"}
         error_text = ""
@@ -1956,7 +1956,7 @@
         # TODO? get internal-connections from db.nets and their profiles, and update scenario[vnfs][internal-connections] accordingly
 
     # 2: Insert net_key and ip_address at every vnf interface
-    for net_name, net in list(scenario["networks"].items()):
+    for net_name, net in scenario["networks"].items():
         net_type_bridge = False
         net_type_data = False
         for iface_dict in net["interfaces"]:
@@ -1966,7 +1966,7 @@
             elif version == "0.3":
                 temp_dict = {iface_dict["vnf"] : iface_dict["vnf_interface"]}
                 ip_address = iface_dict.get('ip_address', None)
-            for vnf, iface in list(temp_dict.items()):
+            for vnf, iface in temp_dict.items():
                 if vnf not in scenario["vnfs"]:
                     error_text = "Error at 'networks':'{}':'interfaces' VNF '{}' not match any VNF at 'vnfs'".format(
                         net_name, vnf)
@@ -2054,7 +2054,7 @@
         db_ip_profiles_index = 0
         uuid_list = []
         nsd_uuid_list = []
-        for nsd_yang in mynsd.nsd_catalog.nsd.values():
+        for nsd_yang in mynsd.nsd_catalog.nsd.itervalues():
             nsd = nsd_yang.get()
 
             # table sceanrios
@@ -2076,7 +2076,7 @@
             # table sce_vnfs (constituent-vnfd)
             vnf_index2scevnf_uuid = {}
             vnf_index2vnf_uuid = {}
-            for vnf in nsd.get("constituent-vnfd").values():
+            for vnf in nsd.get("constituent-vnfd").itervalues():
                 existing_vnf = mydb.get_rows(FROM="vnfs", WHERE={'osm_id': str(vnf["vnfd-id-ref"])[:255],
                                                                       'tenant_id': tenant_id})
                 if not existing_vnf:
@@ -2100,7 +2100,7 @@
 
             # table ip_profiles (ip-profiles)
             ip_profile_name2db_table_index = {}
-            for ip_profile in nsd.get("ip-profiles").values():
+            for ip_profile in nsd.get("ip-profiles").itervalues():
                 db_ip_profile = {
                     "ip_version": str(ip_profile["ip-profile-params"].get("ip-version", "ipv4")),
                     "subnet_address": str(ip_profile["ip-profile-params"].get("subnet-address")),
@@ -2110,7 +2110,7 @@
                     "dhcp_count": str(ip_profile["ip-profile-params"]["dhcp-params"].get("count")),
                 }
                 dns_list = []
-                for dns in ip_profile["ip-profile-params"]["dns-server"].values():
+                for dns in ip_profile["ip-profile-params"]["dns-server"].itervalues():
                     dns_list.append(str(dns.get("address")))
                 db_ip_profile["dns_address"] = ";".join(dns_list)
                 if ip_profile["ip-profile-params"].get('security-group'):
@@ -2120,7 +2120,7 @@
                 db_ip_profiles.append(db_ip_profile)
 
             # table sce_nets (internal-vld)
-            for vld in nsd.get("vld").values():
+            for vld in nsd.get("vld").itervalues():
                 sce_net_uuid = str(uuid4())
                 uuid_list.append(sce_net_uuid)
                 db_sce_net = {
@@ -2153,7 +2153,7 @@
                     db_ip_profiles[ip_profile_name2db_table_index[ip_profile_name]]["sce_net_id"] = sce_net_uuid
 
                 # table sce_interfaces (vld:vnfd-connection-point-ref)
-                for iface in vld.get("vnfd-connection-point-ref").values():
+                for iface in vld.get("vnfd-connection-point-ref").itervalues():
                     vnf_index = int(iface['member-vnf-index-ref'])
                     # check correct parameters
                     if vnf_index not in vnf_index2vnf_uuid:
@@ -2592,13 +2592,13 @@
     elif len(vims)>1:
         #print "nfvo.datacenter_action() error. Several datacenters found"
         raise NfvoException("More than one datacenters found, try to identify with uuid", HTTP_Conflict)
-    return list(vims.keys())[0], list(vims.values())[0]
+    return vims.keys()[0], vims.values()[0]
 
 
 def update(d, u):
     '''Takes dict d and updates it with the values in dict u.'''
     '''It merges all depth levels'''
-    for k, v in u.items():
+    for k, v in u.iteritems():
         if isinstance(v, collections.Mapping):
             r = update(d.get(k, {}), v)
             d[k] = r
@@ -2670,7 +2670,7 @@
     #               yaml.safe_dump(scenarioDict, indent=4, default_flow_style=False))
     try:
         # 0 check correct parameters
-        for net_name, net_instance_desc in instance_dict.get("networks", {}).items():
+        for net_name, net_instance_desc in instance_dict.get("networks", {}).iteritems():
             found = False
             for scenario_net in scenarioDict['nets']:
                 if net_name == scenario_net["name"]:
@@ -2698,7 +2698,7 @@
                     site_without_datacenter_field = True
                     site["datacenter"] = default_datacenter_id   # change name to id
 
-        for vnf_name, vnf_instance_desc in instance_dict.get("vnfs",{}).items():
+        for vnf_name, vnf_instance_desc in instance_dict.get("vnfs",{}).iteritems():
             found = False
             for scenario_vnf in scenarioDict['vnfs']:
                 if vnf_name == scenario_vnf['name']:
@@ -2725,7 +2725,7 @@
         # 0.2 merge instance information into scenario
         # Ideally, the operation should be as simple as: update(scenarioDict,instance_dict)
         # However, this is not possible yet.
-        for net_name, net_instance_desc in instance_dict.get("networks",{}).items():
+        for net_name, net_instance_desc in instance_dict.get("networks",{}).iteritems():
             for scenario_net in scenarioDict['nets']:
                 if net_name == scenario_net["name"]:
                     if 'ip-profile' in net_instance_desc:
@@ -3185,7 +3185,7 @@
         logger.debug("create_instance done DB tables: %s",
                     yaml.safe_dump(db_tables, indent=4, default_flow_style=False) )
         mydb.new_rows(db_tables, uuid_list)
-        for myvim_thread_id in list(myvim_threads_id.values()):
+        for myvim_thread_id in myvim_threads_id.values():
             vim_threads["running"][myvim_thread_id].insert_task(db_vim_actions)
 
         returned_instance = mydb.get_instance_scenario(instance_uuid)
@@ -3250,7 +3250,7 @@
                                                                                         sce_vnf["datacenter_tenant_id"]))
                 myvims[datacenter_key] = None
             else:
-                myvims[datacenter_key] = list(vims.values())[0]
+                myvims[datacenter_key] = vims.values()[0]
         myvim = myvims[datacenter_key]
         myvim_thread = myvim_threads[datacenter_key]
         for vm in sce_vnf['vms']:
@@ -3302,7 +3302,7 @@
                 logger.error("datacenter '{}' with datacenter_tenant_id '{}' not found".format(net["datacenter_id"], net["datacenter_tenant_id"]))
                 myvims[datacenter_key] = None
             else:
-                myvims[datacenter_key] = list(vims.values())[0]
+                myvims[datacenter_key] = vims.values()[0]
         myvim = myvims[datacenter_key]
         myvim_thread = myvim_threads[datacenter_key]
 
@@ -3344,7 +3344,7 @@
     logger.debug("delete_instance done DB tables: %s",
                  yaml.safe_dump(db_tables, indent=4, default_flow_style=False))
     mydb.new_rows(db_tables, ())
-    for myvim_thread_id in list(vimthread_affected.keys()):
+    for myvim_thread_id in vimthread_affected.keys():
         vim_threads["running"][myvim_thread_id].insert_task(db_vim_actions)
 
     if len(error_msg) > 0:
@@ -3527,7 +3527,7 @@
     vims = get_vim(mydb, nfvo_tenant, instanceDict['datacenter_id'])
     if len(vims) == 0:
         raise NfvoException("datacenter '{}' not found".format(str(instanceDict['datacenter_id'])), HTTP_Not_Found)
-    myvim = list(vims.values())[0]
+    myvim = vims.values()[0]
 
     if action_dict.get("create-vdu"):
         for vdu in action_dict["create-vdu"]:
@@ -4199,12 +4199,12 @@
         if name and len(content)==1:
             return {item[:-1]: content[0]}
         elif name and len(content)==0:
-            raise NfvoException("No {} found with ".format(item[:-1]) + " and ".join([str(x[0])+": "+str(x[1]) for x in iter(filter_dict.items())]),
+            raise NfvoException("No {} found with ".format(item[:-1]) + " and ".join(map(lambda x: str(x[0])+": "+str(x[1]), filter_dict.iteritems())),
                  datacenter)
         else:
             return {item: content}
     except vimconn.vimconnException as e:
-        print("vim_action Not possible to get_%s_list from VIM: %s " % (item, str(e)))
+        print "vim_action Not possible to get_%s_list from VIM: %s " % (item, str(e))
         raise NfvoException("Not possible to get_{}_list from VIM: {}".format(item, str(e)), e.http_code)
 
 
@@ -4217,7 +4217,7 @@
     #get uuid name
     content = vim_action_get(mydb, tenant_id, datacenter, item, name)
     logger.debug("vim_action_delete vim response: " + str(content))
-    items = list(content.values())[0]
+    items = content.values()[0]
     if type(items)==list and len(items)==0:
         raise NfvoException("Not found " + item, HTTP_Not_Found)
     elif type(items)==list and len(items)>1:
diff --git a/osm_ro/nfvo_db.py b/osm_ro/nfvo_db.py
index 25196dd..f47ad16 100644
--- a/osm_ro/nfvo_db.py
+++ b/osm_ro/nfvo_db.py
@@ -27,7 +27,7 @@
 __author__="Alfonso Tierno, Gerardo Garcia, Pablo Montes"
 __date__ ="$28-aug-2014 10:05:01$"
 
-from . import db_base
+import db_base
 import MySQLdb as mdb
 import json
 import yaml
@@ -66,7 +66,7 @@
                     #print "Adding new vms to the NFVO database"
                     #For each vm, we must create the appropriate vm in the NFVO database.
                     vmDict = {}
-                    for _,vm in VNFCDict.items():
+                    for _,vm in VNFCDict.iteritems():
                         #This code could make the name of the vms grow and grow.
                         #If we agree to follow this convention, we should check with a regex that the vnfc name is not including yet the vnf name  
                         #vm['name'] = "%s-%s" % (vnf_name,vm['name'])
@@ -218,7 +218,7 @@
                     #print "Adding new vms to the NFVO database"
                     #For each vm, we must create the appropriate vm in the NFVO database.
                     vmDict = {}
-                    for _,vm in VNFCDict.items():
+                    for _,vm in VNFCDict.iteritems():
                         #This code could make the name of the vms grow and grow.
                         #If we agree to follow this convention, we should check with a regex that the vnfc name is not including yet the vnf name  
                         #vm['name'] = "%s-%s" % (vnf_name,vm['name'])
@@ -389,7 +389,7 @@
                     
                     scenario_uuid =  self._new_row_internal('scenarios', INSERT_, add_uuid=True, root_uuid=None, created_time=created_time)
                     #sce_nets
-                    for net in list(scenario_dict['nets'].values()):
+                    for net in scenario_dict['nets'].values():
                         net_dict={'scenario_id': scenario_uuid}
                         net_dict["name"] = net["name"]
                         net_dict["type"] = net["type"]
@@ -418,7 +418,7 @@
                             self._new_row_internal('ip_profiles', myIPProfileDict)
 
                     # sce_vnfs
-                    for k, vnf in list(scenario_dict['vnfs'].items()):
+                    for k, vnf in scenario_dict['vnfs'].items():
                         INSERT_ = {'scenario_id': scenario_uuid,
                                    'name': k,
                                    'vnf_id': vnf['uuid'],
@@ -433,7 +433,7 @@
                                                               root_uuid=scenario_uuid, created_time=created_time)
                         vnf['scn_vnf_uuid']=scn_vnf_uuid
                         # sce_interfaces
-                        for iface in list(vnf['ifaces'].values()):
+                        for iface in vnf['ifaces'].values():
                             # print 'iface', iface
                             if 'net_key' not in iface:
                                 continue
@@ -488,7 +488,7 @@
                         WHERE_={'tenant_id': tenant_id, 'uuid': scenario_uuid}
                         item_changed += self._update_rows('scenarios', UPDATE_, WHERE_, modified_time=modified_time)
                     #sce_nets
-                    for node_id, node in list(nodes.items()):
+                    for node_id, node in nodes.items():
                         if "graph" in node:
                             #node["graph"] = yaml.safe_dump(node["graph"],default_flow_style=True,width=256)
                             #TODO, must be json because of the GUI, change to yaml
@@ -759,7 +759,7 @@
                 with self.con:
                     self.cur = self.con.cursor()
                     for table in tables:
-                        for table_name, row_list in list(table.items()):
+                        for table_name, row_list in table.items():
                             index = 0
                             if isinstance(row_list, dict):
                                 row_list = (row_list, )  #create a list with the single value
@@ -810,7 +810,7 @@
                             net["vim_id_sites"]["datacenter_site_id"] = {datacenter_site_id: net['vim_id']}
                         sce_net_id = net.get("uuid")
                         
-                        for datacenter_site_id,vim_id in net["vim_id_sites"].items():
+                        for datacenter_site_id,vim_id in net["vim_id_sites"].iteritems():
                             INSERT_={'vim_net_id': vim_id, 'created': net.get('created', False), 'instance_scenario_id':instance_uuid } #,  'type': net['type']
                             INSERT_['datacenter_id'] = datacenter_site_id 
                             INSERT_['datacenter_tenant_id'] = scenarioDict["datacenter2tenant"][datacenter_site_id]
diff --git a/osm_ro/openmanoclient.py b/osm_ro/openmanoclient.py
index 07aead3..1566203 100644
--- a/osm_ro/openmanoclient.py
+++ b/osm_ro/openmanoclient.py
@@ -40,7 +40,7 @@
 if sys.version_info.major == 3:
     from urllib.parse import quote
 elif sys.version_info.major == 2:
-    from urllib.parse import quote
+    from urllib import quote
 
 class OpenmanoException(Exception):
     '''Common Exception for all openmano client exceptions'''
diff --git a/osm_ro/utils.py b/osm_ro/utils.py
index 20646a1..00f6f2d 100644
--- a/osm_ro/utils.py
+++ b/osm_ro/utils.py
@@ -62,7 +62,7 @@
         #print "Input data: ", str(client_data)
         return True, client_data
     except js_e.ValidationError as exc:
-        print("validate_in error, jsonschema exception ", exc.message, "at", exc.path)
+        print "validate_in error, jsonschema exception ", exc.message, "at", exc.path
         return False, ("validate_in error, jsonschema exception ", exc.message, "at", exc.path)
 
 def remove_extra_items(data, schema):
@@ -75,8 +75,8 @@
         #TODO deal with patternProperties
         if 'properties' not in schema:
             return None
-        for k in list(data.keys()):
-            if k not in list(schema['properties'].keys()):
+        for k in data.keys():
+            if k not in schema['properties'].keys():
                 del data[k]
                 deleted.append(k)
             else:
@@ -102,7 +102,7 @@
         None
     '''
     if type(data) is dict:
-        for k in list(data.keys()):
+        for k in data.keys():
             if type(data[k]) is dict or type(data[k]) is tuple or type(data[k]) is list:
                 convert_bandwidth(data[k], reverse)
         if "bandwidth" in data:
@@ -119,7 +119,7 @@
                     if value % 1000 == 0: data["bandwidth"]=str(value/1000) + " Gbps"
                     else: data["bandwidth"]=str(value) + " Mbps"
             except:
-                print("convert_bandwidth exception for type", type(data["bandwidth"]), " data", data["bandwidth"])
+                print "convert_bandwidth exception for type", type(data["bandwidth"]), " data", data["bandwidth"]
                 return
     if type(data) is tuple or type(data) is list:
         for k in data:
@@ -133,7 +133,7 @@
     It enters recursively in the dict var finding this kind of variables
     '''
     if type(var) is dict:
-        for k,v in list(var.items()):
+        for k,v in var.items():
             if type(v) is datetime.datetime:
                 var[k]= v.strftime('%Y-%m-%dT%H:%M:%S')
             elif type(v) is dict or type(v) is list or type(v) is tuple: 
@@ -153,7 +153,7 @@
         None
     '''
     if type(data) is dict:
-        for k in list(data.keys()):
+        for k in data.keys():
             if type(data[k]) is dict or type(data[k]) is tuple or type(data[k]) is list:
                 convert_str2boolean(data[k], items)
             if k in items:
diff --git a/osm_ro/vim_thread.py b/osm_ro/vim_thread.py
index 8ce029f..22a882e 100644
--- a/osm_ro/vim_thread.py
+++ b/osm_ro/vim_thread.py
@@ -57,11 +57,11 @@
 
 import threading
 import time
-import queue
+import Queue
 import logging
-from . import vimconn
+import vimconn
 import yaml
-from .db_base import db_base_Exception
+from db_base import db_base_Exception
 from lib_osm_openvim.ovim import ovimException
 
 __author__ = "Alfonso Tierno, Pablo Montes"
@@ -116,7 +116,7 @@
         self.db_lock = db_lock
 
         self.task_lock = task_lock
-        self.task_queue = queue.Queue(2000)
+        self.task_queue = Queue.Queue(2000)
 
         self.refresh_tasks = []
         """Contains time ordered task list for refreshing the status of VIM VMs and nets"""
@@ -206,7 +206,7 @@
             try:
                 now = time.time()
                 vim_dict = self.vim.refresh_vms_status(vm_to_refresh_list)
-                for vim_id, vim_info in list(vim_dict.items()):
+                for vim_id, vim_info in vim_dict.items():
                     # look for task
                     task_need_update = False
                     task = vm_to_refresh_dict[vim_id]
@@ -309,7 +309,7 @@
             try:
                 now = time.time()
                 vim_dict = self.vim.refresh_nets_status(net_to_refresh_list)
-                for vim_id, vim_info in list(vim_dict.items()):
+                for vim_id, vim_info in vim_dict.items():
                     # look for task
                     task = net_to_refresh_dict[vim_id]
                     self.logger.debug("get-net net_id=%s result=%s", task["vim_id"], str(vim_info))
@@ -557,7 +557,7 @@
         try:
             self.task_queue.put(task, False)
             return None
-        except queue.Full:
+        except Queue.Full:
             raise vimconn.vimconnException(self.name + ": timeout inserting a task")
 
     def del_task(self, task):
@@ -688,7 +688,7 @@
         vm_vim_id = task["vim_id"]
         interfaces = task["extra"].get("interfaces", ())
         try:
-            for iface in list(interfaces.values()):
+            for iface in interfaces.values():
                 if iface.get("sdn_port_id"):
                     try:
                         with self.db_lock:
diff --git a/osm_ro/vimconn.py b/osm_ro/vimconn.py
index ba3b1e2..d892166 100644
--- a/osm_ro/vimconn.py
+++ b/osm_ro/vimconn.py
@@ -28,25 +28,25 @@
 __author__="Alfonso Tierno, Igor D.C."
 __date__ ="$14-aug-2017 23:59:59$"
 
+import io
 import logging
 import paramiko
 import socket
-import io
 import yaml
 import sys
 from email.mime.multipart import MIMEMultipart
 from email.mime.text import MIMEText
 
-#Error variables 
+#Error variables
 HTTP_Bad_Request = 400
-HTTP_Unauthorized = 401 
-HTTP_Not_Found = 404 
-HTTP_Method_Not_Allowed = 405 
+HTTP_Unauthorized = 401
+HTTP_Not_Found = 404
+HTTP_Method_Not_Allowed = 405
 HTTP_Request_Timeout = 408
 HTTP_Conflict = 409
 HTTP_Not_Implemented = 501
-HTTP_Service_Unavailable = 503 
-HTTP_Internal_Server_Error = 500 
+HTTP_Service_Unavailable = 503
+HTTP_Internal_Server_Error = 500
 
 class vimconnException(Exception):
     """Common and base class Exception for all vimconnector exceptions"""
@@ -58,7 +58,7 @@
     """Connectivity error with the VIM"""
     def __init__(self, message, http_code=HTTP_Service_Unavailable):
         vimconnException.__init__(self, message, http_code)
-    
+
 class vimconnUnexpectedResponse(vimconnException):
     """Get an wrong response from VIM"""
     def __init__(self, message, http_code=HTTP_Service_Unavailable):
@@ -92,9 +92,9 @@
 
 class vimconnector():
     """Abstract base class for all the VIM connector plugins
-    These plugins must implement a vimconnector class derived from this 
+    These plugins must implement a vimconnector class derived from this
     and all these privated methods
-    """ 
+    """
     def __init__(self, uuid, name, tenant_id, tenant_name, url, url_admin=None, user=None, passwd=None, log_level=None,
                  config={}, persitent_info={}):
         """Constructor of VIM
@@ -127,9 +127,9 @@
         self.logger = logging.getLogger('openmano.vim')
         if log_level:
             self.logger.setLevel( getattr(logging, log_level) )
-        if not self.url_admin:  #try to use normal url 
+        if not self.url_admin:  #try to use normal url
             self.url_admin = self.url
-    
+
     def __getitem__(self,index):
         if index=='tenant_id':
             return self.tenant_id
@@ -151,7 +151,7 @@
             return self.config
         else:
             raise KeyError("Invalid key '%s'" %str(index))
-        
+
     def __setitem__(self,index, value):
         if index=='tenant_id':
             self.tenant_id = value
@@ -429,7 +429,7 @@
                           - name: interface name
                             dedicated: yes|no|yes:sriov;  for PT, SRIOV or only one SRIOV for the physical NIC
                             bandwidth: X Gbps; requested guarantee bandwidth
-                            vpci: requested virtual PCI address   
+                            vpci: requested virtual PCI address
                 disk: disk size
                 is_public:
                  #TODO to concrete
@@ -457,7 +457,7 @@
            Returns the image_id or raises a vimconnNotFoundException
         """
         raise vimconnNotImplemented( "Should have implemented this" )
-        
+
     def get_image_list(self, filter_dict={}):
         """Obtain tenant images from VIM
         Filter_dict can be:
@@ -522,11 +522,11 @@
         Returns the instance identifier or raises an exception on error
         """
         raise vimconnNotImplemented( "Should have implemented this" )
-        
+
     def get_vminstance(self,vm_id):
         """Returns the VM instance information from VIM"""
         raise vimconnNotImplemented( "Should have implemented this" )
-        
+
     def delete_vminstance(self, vm_id):
         """Removes a VM instance from VIM
         Returns the instance identifier"""
@@ -539,14 +539,14 @@
                 vm_id:          #VIM id of this Virtual Machine
                     status:     #Mandatory. Text with one of:
                                 #  DELETED (not found at vim)
-                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...) 
+                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...)
                                 #  OTHER (Vim reported other status not understood)
                                 #  ERROR (VIM indicates an ERROR status)
-                                #  ACTIVE, PAUSED, SUSPENDED, INACTIVE (not running), 
+                                #  ACTIVE, PAUSED, SUSPENDED, INACTIVE (not running),
                                 #  BUILD (on building process), ERROR
                                 #  ACTIVE:NoMgmtIP (Active but any of its interface has an IP address
                                 #
-                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR 
+                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR
                     vim_info:   #Text with plain information obtained from vim (yaml.safe_dump)
                     interfaces: list with interface info. Each item a dictionary with:
                         vim_info:         #Text with plain information obtained from vim (yaml.safe_dump)
@@ -559,25 +559,25 @@
                         vlan:             #physical VLAN used for VF
         """
         raise vimconnNotImplemented( "Should have implemented this" )
-    
+
     def action_vminstance(self, vm_id, action_dict):
         """Send and action over a VM instance from VIM
         Returns the vm_id if the action was successfully sent to the VIM"""
         raise vimconnNotImplemented( "Should have implemented this" )
-    
+
     def get_vminstance_console(self, vm_id, console_type="vnc"):
         """
         Get a console for the virtual machine
         Params:
             vm_id: uuid of the VM
             console_type, can be:
-                "novnc" (by default), "xvpvnc" for VNC types, 
+                "novnc" (by default), "xvpvnc" for VNC types,
                 "rdp-html5" for RDP types, "spice-html5" for SPICE types
         Returns dict with the console parameters:
                 protocol: ssh, ftp, http, https, ...
-                server:   usually ip address 
-                port:     the http, ssh, ... port 
-                suffix:   extra text, e.g. the http path and query string   
+                server:   usually ip address
+                port:     the http, ssh, ... port
+                suffix:   extra text, e.g. the http path and query string
         """
         raise vimconnNotImplemented( "Should have implemented this" )
 
@@ -840,17 +840,17 @@
     def get_processor_rankings(self):
         """Get the processor rankings in the VIM database"""
         raise vimconnNotImplemented( "Should have implemented this" )
-    
+
     def new_host(self, host_data):
         """Adds a new host to VIM"""
         """Returns status code of the VIM response"""
         raise vimconnNotImplemented( "Should have implemented this" )
-    
+
     def new_external_port(self, port_data):
         """Adds a external port to VIM"""
         """Returns the port identifier"""
         raise vimconnNotImplemented( "Should have implemented this" )
-        
+
     def new_external_network(self,net_name,net_type):
         """Adds a external network to VIM (shared)"""
         """Returns the network identifier"""
@@ -865,4 +865,3 @@
         """Adds a VM instance to VIM"""
         """Returns the instance identifier"""
         raise vimconnNotImplemented( "Should have implemented this" )
-
diff --git a/osm_ro/vimconn_aws.py b/osm_ro/vimconn_aws.py
index 9b13030..3ccef44 100644
--- a/osm_ro/vimconn_aws.py
+++ b/osm_ro/vimconn_aws.py
@@ -28,7 +28,7 @@
 __author__ = "Saboor Ahmad"
 __date__ = "10-Apr-2017"
 
-from . import vimconn
+import vimconn
 import yaml
 import logging
 import netaddr
@@ -275,7 +275,7 @@
             pub_subs = pub_split[:3]
             subnets = pub_subs + pri_subs
 
-        return list(map(str, subnets))
+        return map(str, subnets)
 
     def new_network(self, net_name, net_type, ip_profile=None, shared=False, vlan=None):
         """Adds a tenant network to VIM
@@ -470,7 +470,7 @@
         self.logger.debug("Getting flavor id from data")
         try:
             flavor = None
-            for key, values in self.flavor_info.items():
+            for key, values in self.flavor_info.iteritems():
                 if (values["ram"], values["cpus"], values["disk"]) == (
                 flavor_dict["ram"], flavor_dict["vcpus"], flavor_dict["disk"]):
                     flavor = (key, values)
diff --git a/osm_ro/vimconn_openstack.py b/osm_ro/vimconn_openstack.py
index 44178a8..5183858 100644
--- a/osm_ro/vimconn_openstack.py
+++ b/osm_ro/vimconn_openstack.py
@@ -35,7 +35,7 @@
 __author__ = "Alfonso Tierno, Gerardo Garcia, Pablo Montes, xFlow Research, Igor D.C."
 __date__  = "$22-sep-2017 23:59:59$"
 
-from . import vimconn
+import vimconn
 import json
 import logging
 import netaddr
@@ -55,6 +55,7 @@
 import glanceclient.client as gl1Client
 import glanceclient.exc as gl1Exceptions
 from  cinderclient import client as cClient
+#from httplib import HTTPException
 from http.client import HTTPException
 from neutronclient.neutron import client as neClient
 from neutronclient.common import exceptions as neExceptions
@@ -156,21 +157,31 @@
         '''Called before any operation, it check if credentials has changed
         Throw keystoneclient.apiclient.exceptions.AuthorizationFailure
         '''
-        #TODO control the timing and possible token timeout, but it seams that python client does this task for us :-) 
+        #TODO control the timing and possible token timeout, but it seams that python client does this task for us :-)
         if self.session['reload_client']:
             if self.config.get('APIversion'):
                 self.api_version3 = self.config['APIversion'] == 'v3.3' or self.config['APIversion'] == '3'
             else:  # get from ending auth_url that end with v3 or with v2.0
-                self.api_version3 =  self.url.split("/")[-1] == "v3"
+                self.api_version3 =  self.url.endswith("/v3") or self.url.endswith("/v3/")
             self.session['api_version3'] = self.api_version3
             if self.api_version3:
+                if self.config.get('project_domain_id') or self.config.get('project_domain_name'):
+                    project_domain_id_default = None
+                else:
+                    project_domain_id_default = 'default'
+                if self.config.get('user_domain_id') or self.config.get('user_domain_name'):
+                    user_domain_id_default = None
+                else:
+                    user_domain_id_default = 'default'
                 auth = v3.Password(auth_url=self.url,
                                    username=self.user,
                                    password=self.passwd,
                                    project_name=self.tenant_name,
                                    project_id=self.tenant_id,
-                                   project_domain_id=self.config.get('project_domain_id', 'default'),
-                                   user_domain_id=self.config.get('user_domain_id', 'default'))
+                                   project_domain_id=self.config.get('project_domain_id', project_domain_id_default),
+                                   user_domain_id=self.config.get('user_domain_id', user_domain_id_default),
+                                   project_domain_name=self.config.get('project_domain_name'),
+                                   user_domain_name=self.config.get('user_domain_name'))
             else:
                 auth = v2.Password(auth_url=self.url,
                                    username=self.user,
@@ -383,7 +394,7 @@
             else:
                 project = self.keystone.tenants.create(tenant_name, tenant_description)
             return project.id
-        except (ksExceptions.ConnectionError, ksExceptions.ClientException, ConnectionError) as e:
+        except (ksExceptions.ConnectionError, ksExceptions.ClientException, ConnectionError)  as e:
             self._format_exception(e)
 
     def delete_tenant(self, tenant_id):
@@ -396,7 +407,7 @@
             else:
                 self.keystone.tenants.delete(tenant_id)
             return tenant_id
-        except (ksExceptions.ConnectionError, ksExceptions.ClientException, ConnectionError) as e:
+        except (ksExceptions.ConnectionError, ksExceptions.ClientException, ConnectionError)  as e:
             self._format_exception(e)
 
     def new_network(self,net_name, net_type, ip_profile=None, shared=False, vlan=None):
@@ -541,13 +552,13 @@
                 net_id:         #VIM id of this network
                     status:     #Mandatory. Text with one of:
                                 #  DELETED (not found at vim)
-                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...) 
+                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...)
                                 #  OTHER (Vim reported other status not understood)
                                 #  ERROR (VIM indicates an ERROR status)
-                                #  ACTIVE, INACTIVE, DOWN (admin down), 
+                                #  ACTIVE, INACTIVE, DOWN (admin down),
                                 #  BUILD (on building process)
                                 #
-                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR 
+                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR
                     vim_info:   #Text with plain information obtained from vim (yaml.safe_dump)
 
         '''
@@ -698,7 +709,7 @@
                             #         raise vimconn.vimconnException("Passthrough interfaces are not supported for the openstack connector", http_code=vimconn.HTTP_Service_Unavailable)
                             #     #TODO, add the key 'pci_passthrough:alias"="<label at config>:<number ifaces>"' when a way to connect it is available
 
-                #create flavor                 
+                #create flavor
                 new_flavor=self.nova.flavors.create(name,
                                 ram,
                                 vcpus,
@@ -774,13 +785,13 @@
                     with open(image_dict['location']) as fimage:
                         new_image = self.glancev1.images.create(name=image_dict['name'], is_public=image_dict.get('public',"yes")=="yes",
                             container_format="bare", data=fimage, disk_format=disk_format)
-                #insert metadata. We cannot use 'new_image.properties.setdefault' 
+                #insert metadata. We cannot use 'new_image.properties.setdefault'
                 #because nova and glance are "INDEPENDENT" and we are using nova for reading metadata
                 new_image_nova=self.nova.images.find(id=new_image.id)
                 new_image_nova.metadata.setdefault('location',image_dict['location'])
                 metadata_to_load = image_dict.get('metadata')
                 if metadata_to_load:
-                    for k,v in yaml.load(metadata_to_load).items():
+                    for k,v in yaml.load(metadata_to_load).iteritems():
                         new_image_nova.metadata.setdefault(k,v)
                 return new_image.id
             except (nvExceptions.Conflict, ksExceptions.ClientException, nvExceptions.ClientException) as e:
@@ -831,15 +842,18 @@
             filter_dict_os=filter_dict.copy()
             #First we filter by the available filter fields: name, id. The others are removed.
             filter_dict_os.pop('checksum',None)
-            image_list=self.nova.images.findall(**filter_dict_os)
-            if len(image_list)==0:
+            image_list = self.nova.images.findall(**filter_dict_os)
+            if len(image_list) == 0:
                 return []
             #Then we filter by the rest of filter fields: checksum
             filtered_list = []
             for image in image_list:
-                image_class=self.glance.images.get(image.id)
-                if 'checksum' not in filter_dict or image_class['checksum']==filter_dict.get('checksum'):
-                    filtered_list.append(image_class.copy())
+                try:
+                    image_class = self.glance.images.get(image.id)
+                    if 'checksum' not in filter_dict or image_class['checksum']==filter_dict.get('checksum'):
+                        filtered_list.append(image_class.copy())
+                except gl1Exceptions.HTTPNotFound:
+                    pass
             return filtered_list
         except (ksExceptions.ClientException, nvExceptions.ClientException, gl1Exceptions.CommunicationError, ConnectionError) as e:
             self._format_exception(e)
@@ -1073,7 +1087,7 @@
                 elapsed_time = 0
                 while keep_waiting and elapsed_time < volume_timeout:
                     keep_waiting = False
-                    for volume_id in block_device_mapping.values():
+                    for volume_id in block_device_mapping.itervalues():
                         if self.cinder.volumes.get(volume_id).status != 'available':
                             keep_waiting = True
                     if keep_waiting:
@@ -1083,7 +1097,7 @@
                 #if we exceeded the timeout rollback
                 if elapsed_time >= volume_timeout:
                     #delete the volumes we just created
-                    for volume_id in block_device_mapping.values():
+                    for volume_id in block_device_mapping.itervalues():
                         self.cinder.volumes.delete(volume_id)
 
                     #delete ports we just created
@@ -1187,7 +1201,7 @@
         except Exception as e:
             # delete the volumes we just created
             if block_device_mapping:
-                for volume_id in block_device_mapping.values():
+                for volume_id in block_device_mapping.itervalues():
                     self.cinder.volumes.delete(volume_id)
 
             # Delete the VM
@@ -1218,13 +1232,13 @@
         Params:
             vm_id: uuid of the VM
             console_type, can be:
-                "novnc" (by default), "xvpvnc" for VNC types, 
+                "novnc" (by default), "xvpvnc" for VNC types,
                 "rdp-html5" for RDP types, "spice-html5" for SPICE types
         Returns dict with the console parameters:
                 protocol: ssh, ftp, http, https, ...
-                server:   usually ip address 
-                port:     the http, ssh, ... port 
-                suffix:   extra text, e.g. the http path and query string   
+                server:   usually ip address
+                port:     the http, ssh, ... port
+                suffix:   extra text, e.g. the http path and query string
         '''
         self.logger.debug("Getting VM CONSOLE from VIM")
         try:
@@ -1315,14 +1329,14 @@
                 vm_id:          #VIM id of this Virtual Machine
                     status:     #Mandatory. Text with one of:
                                 #  DELETED (not found at vim)
-                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...) 
+                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...)
                                 #  OTHER (Vim reported other status not understood)
                                 #  ERROR (VIM indicates an ERROR status)
-                                #  ACTIVE, PAUSED, SUSPENDED, INACTIVE (not running), 
+                                #  ACTIVE, PAUSED, SUSPENDED, INACTIVE (not running),
                                 #  CREATING (on building process), ERROR
                                 #  ACTIVE:NoMgmtIP (Active but any of its interface has an IP address
                                 #
-                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR 
+                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR
                     vim_info:   #Text with plain information obtained from vim (yaml.safe_dump)
                     interfaces:
                      -  vim_info:         #Text with plain information obtained from vim (yaml.safe_dump)
@@ -1365,13 +1379,13 @@
                         interface["mac_address"] = port.get("mac_address")
                         interface["vim_net_id"] = port["network_id"]
                         interface["vim_interface_id"] = port["id"]
-                        # check if OS-EXT-SRV-ATTR:host is there, 
+                        # check if OS-EXT-SRV-ATTR:host is there,
                         # in case of non-admin credentials, it will be missing
                         if vm_vim.get('OS-EXT-SRV-ATTR:host'):
                             interface["compute_node"] = vm_vim['OS-EXT-SRV-ATTR:host']
                         interface["pci"] = None
 
-                        # check if binding:profile is there, 
+                        # check if binding:profile is there,
                         # in case of non-admin credentials, it will be missing
                         if port.get('binding:profile'):
                             if port['binding:profile'].get('pci_slot'):
@@ -1504,8 +1518,8 @@
         #find unused VLAN ID
         for vlanID_range in self.config.get('dataplane_net_vlan_range'):
             try:
-                start_vlanid , end_vlanid = list(map(int, vlanID_range.replace(" ", "").split("-")))
-                for vlanID in range(start_vlanid, end_vlanid + 1):
+                start_vlanid , end_vlanid = map(int, vlanID_range.replace(" ", "").split("-"))
+                for vlanID in xrange(start_vlanid, end_vlanid + 1):
                     if vlanID not in used_vlanIDs:
                         return vlanID
             except Exception as exp:
@@ -1530,7 +1544,7 @@
                 raise vimconn.vimconnConflictException("Invalid dataplane_net_vlan_range {}.You must provide "\
                 "'dataplane_net_vlan_range' in format [start_ID - end_ID].".format(vlanID_range))
 
-            start_vlanid , end_vlanid = list(map(int,vlan_range.split("-")))
+            start_vlanid , end_vlanid = map(int,vlan_range.split("-"))
             if start_vlanid <= 0 :
                 raise vimconn.vimconnConflictException("Invalid dataplane_net_vlan_range {}."\
                 "Start ID can not be zero. For VLAN "\
@@ -1601,7 +1615,7 @@
         #TODO insert exception vimconn.HTTP_Unauthorized
         #if reaching here is because an exception
         if self.debug:
-            print(("delete_tenant " + error_text))
+            print("delete_tenant " + error_text)
         return error_value, error_text
 
     def get_hosts_info(self):
@@ -1625,7 +1639,7 @@
         #TODO insert exception vimconn.HTTP_Unauthorized
         #if reaching here is because an exception
         if self.debug:
-            print(("get_hosts_info " + error_text))
+            print("get_hosts_info " + error_text)
         return error_value, error_text
 
     def get_hosts(self, vim_tenant):
@@ -1654,7 +1668,7 @@
         #TODO insert exception vimconn.HTTP_Unauthorized
         #if reaching here is because an exception
         if self.debug:
-            print(("get_hosts " + error_text))
+            print("get_hosts " + error_text)
         return error_value, error_text
 
     def new_classification(self, name, ctype, definition):
diff --git a/osm_ro/vimconn_openvim.py b/osm_ro/vimconn_openvim.py
index 08d5d98..32a69c9 100644
--- a/osm_ro/vimconn_openvim.py
+++ b/osm_ro/vimconn_openvim.py
@@ -27,16 +27,19 @@
 __author__="Alfonso Tierno, Gerardo Garcia"
 __date__ ="$26-aug-2014 11:09:29$"
 
-from . import vimconn
+import vimconn
 import requests
 import json
 import yaml
 import logging
-from .openmano_schemas import id_schema, name_schema, nameshort_schema, description_schema, \
+from openmano_schemas import id_schema, name_schema, nameshort_schema, description_schema, \
                             vlan1000_schema, integer0_schema
 from jsonschema import validate as js_v, exceptions as js_e
-from urllib.parse import quote
-
+try:
+    from urllib import quote  # Python 2.X
+except ImportError:
+    from urllib.parse import quote  # Python 3+
+    
 '''contain the openvim virtual machine status to openmano status'''
 vmStatus2manoFormat={'ACTIVE':'ACTIVE',
                      'PAUSED':'PAUSED',
@@ -334,14 +337,14 @@
             self.tenant = tenant_id
 
     def __setitem__(self,index, value):
-        '''Set individuals parameters 
+        '''Set individuals parameters
         Throw TypeError, KeyError
         '''
         if index=='tenant_id':
             self.tenant = value
         elif index=='tenant_name':
             self.tenant = None
-        vimconn.vimconnector.__setitem__(self,index, value)    
+        vimconn.vimconnector.__setitem__(self,index, value)
 
     def _get_my_tenant(self):
         '''Obtain uuid of my tenant from name
@@ -377,12 +380,12 @@
         try:
             client_data = http_response.json()
             js_v(client_data, schema)
-            #print "Input data: ", str(client_data)
+            #print("Input data: ", str(client_data))
             return True, client_data
         except js_e.ValidationError as exc:
             print("validate_in error, jsonschema exception ", exc.message, "at", exc.path)
             return False, ("validate_in error, jsonschema exception ", exc.message, "at", exc.path)
-    
+
     def _remove_extra_items(self, data, schema):
         deleted=[]
         if type(data) is tuple or type(data) is list:
@@ -390,8 +393,8 @@
                 a= self._remove_extra_items(d, schema['items'])
                 if a is not None: deleted.append(a)
         elif type(data) is dict:
-            for k in list(data.keys()):
-                if 'properties' not in schema or k not in list(schema['properties'].keys()):
+            for k in data.keys():
+                if 'properties' not in schema or k not in schema['properties'].keys():
                     del data[k]
                     deleted.append(k)
                 else:
@@ -400,11 +403,11 @@
         if len(deleted) == 0: return None
         elif len(deleted) == 1: return deleted[0]
         else: return deleted
-        
+
     def _format_request_exception(self, request_exception):
         '''Transform a request exception into a vimconn exception'''
         if isinstance(request_exception, js_e.ValidationError):
-            raise vimconn.vimconnUnexpectedResponse("jsonschema exception '{}' at '{}'".format(request_exception.message, request_exception.path))            
+            raise vimconn.vimconnUnexpectedResponse("jsonschema exception '{}' at '{}'".format(request_exception.message, request_exception.path))
         elif isinstance(request_exception, requests.exceptions.HTTPError):
             raise vimconn.vimconnUnexpectedResponse(type(request_exception).__name__ + ": " + str(request_exception))
         else:
@@ -420,12 +423,12 @@
             raise vimconn.vimconnNotFoundException(request_response.text)
         elif request_response.status_code == vimconn.HTTP_Conflict:
             raise vimconn.vimconnConflictException(request_response.text)
-        else: 
+        else:
             raise vimconn.vimconnUnexpectedResponse("VIM HTTP_response {}, {}".format(request_response.status_code, str(request_response.text)))
 
     def new_tenant(self,tenant_name,tenant_description):
         '''Adds a new tenant to VIM with this name and description, returns the tenant identifier'''
-        #print "VIMConnector: Adding a new tenant to VIM"
+        #print("VIMConnector: Adding a new tenant to VIM")
         payload_dict = {"tenant": {"name":tenant_name,"description": tenant_description, "enabled": True}}
         payload_req = json.dumps(payload_dict)
         try:
@@ -434,11 +437,11 @@
             vim_response = requests.post(url, headers = self.headers_req, data=payload_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, new_tenant_response_schema)
             #r = self._remove_extra_items(response, new_tenant_response_schema)
-            #if r is not None: 
+            #if r is not None:
             #    self.logger.warn("Warning: remove extra items %s", str(r))
             tenant_id = response['tenant']['id']
             return tenant_id
@@ -453,7 +456,7 @@
             vim_response = requests.delete(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             return tenant_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
@@ -468,7 +471,7 @@
         '''
         filterquery=[]
         filterquery_text=''
-        for k,v in filter_dict.items():
+        for k,v in filter_dict.iteritems():
             filterquery.append(str(k)+'='+str(v))
         if len(filterquery)>0:
             filterquery_text='?'+ '&'.join(filterquery)
@@ -478,7 +481,7 @@
             vim_response = requests.get(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             return vim_response.json()["tenants"]
         except requests.exceptions.RequestException as e:
             self._format_request_exception(e)
@@ -499,17 +502,17 @@
             vim_response = requests.post(url, headers = self.headers_req, data=json.dumps({"network": payload_req}) )
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, new_network_response_schema)
             #r = self._remove_extra_items(response, new_network_response_schema)
-            #if r is not None: 
+            #if r is not None:
             #    self.logger.warn("Warning: remove extra items %s", str(r))
             network_id = response['network']['id']
             return network_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
-        
+
     def get_network_list(self, filter_dict={}):
         '''Obtain tenant networks of VIM
         Filter_dict can be:
@@ -528,7 +531,7 @@
                 del filter_dict["tenant_id"]
             filterquery=[]
             filterquery_text=''
-            for k,v in filter_dict.items():
+            for k,v in filter_dict.iteritems():
                 filterquery.append(str(k)+'='+str(v))
             if len(filterquery)>0:
                 filterquery_text='?'+ '&'.join(filterquery)
@@ -537,7 +540,7 @@
             vim_response = requests.get(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             return response['networks']
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
@@ -551,12 +554,12 @@
             vim_response = requests.get(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             return response['network']
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
-            
+
     def delete_network(self, net_id):
         '''Deletes a tenant network from VIM'''
         '''Returns the network identifier'''
@@ -567,7 +570,7 @@
             vim_response = requests.delete(url, headers=self.headers_req)
             self._check_http_request_response(vim_response)
             #self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             return net_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
@@ -581,16 +584,16 @@
             vim_response = requests.get(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, get_flavor_response_schema)
             r = self._remove_extra_items(response, get_flavor_response_schema)
-            if r is not None: 
+            if r is not None:
                 self.logger.warn("Warning: remove extra items %s", str(r))
             return response['flavor']
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
-        
+
     def new_flavor(self, flavor_data):
         '''Adds a tenant flavor to VIM'''
         '''Returns the flavor identifier'''
@@ -607,11 +610,11 @@
             vim_response = requests.post(url, headers = self.headers_req, data=payload_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, new_flavor_response_schema)
             r = self._remove_extra_items(response, new_flavor_response_schema)
-            if r is not None: 
+            if r is not None:
                 self.logger.warn("Warning: remove extra items %s", str(r))
             flavor_id = response['flavor']['id']
             return flavor_id
@@ -628,7 +631,7 @@
             vim_response = requests.delete(url, headers=self.headers_req)
             self._check_http_request_response(vim_response)
             #self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             return flavor_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
@@ -642,11 +645,11 @@
             vim_response = requests.get(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, get_image_response_schema)
             r = self._remove_extra_items(response, get_image_response_schema)
-            if r is not None: 
+            if r is not None:
                 self.logger.warn("Warning: remove extra items %s", str(r))
             return response['image']
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
@@ -669,17 +672,17 @@
             vim_response = requests.post(url, headers = self.headers_req, data=payload_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, new_image_response_schema)
             r = self._remove_extra_items(response, new_image_response_schema)
-            if r is not None: 
+            if r is not None:
                 self.logger.warn("Warning: remove extra items %s", str(r))
             image_id = response['image']['id']
             return image_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
-            
+
     def delete_image(self, image_id):
         '''Deletes a tenant image from VIM'''
         '''Returns the deleted image_id'''
@@ -690,7 +693,7 @@
             vim_response = requests.delete(url, headers=self.headers_req)
             self._check_http_request_response(vim_response)
             #self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             return image_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
@@ -704,11 +707,11 @@
             vim_response = requests.get(url)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, get_images_response_schema)
             #r = self._remove_extra_items(response, get_images_response_schema)
-            #if r is not None: 
+            #if r is not None:
             #    self.logger.warn("Warning: remove extra items %s", str(r))
             if len(response['images'])==0:
                 raise vimconn.vimconnNotFoundException("Image not found at VIM with path '%s'", path)
@@ -733,7 +736,7 @@
             self._get_my_tenant()
             filterquery=[]
             filterquery_text=''
-            for k,v in filter_dict.items():
+            for k,v in filter_dict.iteritems():
                 filterquery.append(str(k)+'='+str(v))
             if len(filterquery)>0:
                 filterquery_text='?'+ '&'.join(filterquery)
@@ -742,7 +745,7 @@
             vim_response = requests.get(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             return response['images']
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
@@ -763,25 +766,25 @@
             print("new_vminstancefromJSON Exception: ", e.args)
             return -vimconn.HTTP_Not_Found, str(e.args[0])
         print(vim_response)
-        #print vim_response.status_code
+        #print(vim_response.status_code)
         if vim_response.status_code == 200:
-            #print vim_response.json()
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(vim_response.json())
+            #print(json.dumps(vim_response.json(), indent=4))
             res,http_content = self._format_in(vim_response, new_image_response_schema)
-            #print http_content
+            #print(http_content)
             if res:
                 r = self._remove_extra_items(http_content, new_image_response_schema)
                 if r is not None: print("Warning: remove extra items ", r)
-                #print http_content
+                #print(http_content)
                 vminstance_id = http_content['server']['id']
                 print("Tenant image id: ",vminstance_id)
                 return vim_response.status_code,vminstance_id
             else: return -vimconn.HTTP_Bad_Request,http_content
         else:
-            #print vim_response.text
+            #print(vim_response.text)
             jsonerror = self._format_jsonerror(vim_response)
             text = 'Error in VIM "%s": not possible to add new vm instance. HTTP Response: %d. Error: %s' % (self.url, vim_response.status_code, jsonerror)
-            #print text
+            #print(text)
             return -vim_response.status_code,text
 
     def new_vminstance(self, name, description, start, image_id, flavor_id, net_list, cloud_config=None, disk_list=None,
@@ -795,7 +798,7 @@
                 net_id: network uuid to connect
                 vpci: virtual vcpi to assign
                 model: interface model, virtio, e2000, ...
-                mac_address: 
+                mac_address:
                 use: 'data', 'bridge',  'mgmt'
                 type: 'virtual', 'PF', 'VF', 'VFnotShared'
                 vim_id: filled/added by this function
@@ -807,9 +810,9 @@
             self._get_my_tenant()
 #            net_list = []
 #            for k,v in net_dict.items():
-#                print k,v
+#                print(k,v)
 #                net_list.append('{"name":"' + k + '", "uuid":"' + v + '"}')
-#            net_list_string = ', '.join(net_list) 
+#            net_list_string = ', '.join(net_list)
             virtio_net_list=[]
             for net in net_list:
                 if not net.get("net_id"):
@@ -835,11 +838,11 @@
             vim_response = requests.post(url, headers = self.headers_req, data=payload_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, new_vminstance_response_schema)
             #r = self._remove_extra_items(response, new_vminstance_response_schema)
-            #if r is not None: 
+            #if r is not None:
             #    self.logger.warn("Warning: remove extra items %s", str(r))
             vminstance_id = response['server']['id']
 
@@ -862,21 +865,21 @@
                         for iface in numa.get('interfaces',() ):
                             if net['name'] == iface['name']:
                                 net['vim_id'] = iface['iface_id']
-                                #Code bellow is not needed, current openvim connect dataplane interfaces 
+                                #Code bellow is not needed, current openvim connect dataplane interfaces
                                 #if net.get("net_id"):
                                 ##connect dataplane interface
                                 #    result, port_id = self.connect_port_network(iface['iface_id'], net["net_id"])
                                 #    if result < 0:
                                 #        error_text = "Error attaching port %s to network %s: %s." % (iface['iface_id'], net["net_id"], port_id)
-                                #        print "new_vminstance: " + error_text
+                                #        print("new_vminstance: " + error_text)
                                 #        self.delete_vminstance(vminstance_id)
                                 #        return result, error_text
                                 break
-        
+
             return vminstance_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
-        
+
     def get_vminstance(self, vm_id):
         '''Returns the VM instance information from VIM'''
         try:
@@ -887,16 +890,16 @@
             vim_response = requests.get(url, headers = self.headers_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, new_vminstance_response_schema)
             #r = self._remove_extra_items(response, new_vminstance_response_schema)
-            #if r is not None: 
+            #if r is not None:
             #    self.logger.warn("Warning: remove extra items %s", str(r))
             return response['server']
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
-        
+
     def delete_vminstance(self, vm_id):
         '''Removes a VM instance from VIM, returns the deleted vm_id'''
         try:
@@ -906,7 +909,7 @@
             vim_response = requests.delete(url, headers=self.headers_req)
             self._check_http_request_response(vim_response)
             #self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             return vm_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
@@ -920,7 +923,7 @@
         vm_dict={}
         for vm_id in vm_list:
             vm={}
-            #print "VIMConnector refresh_tenant_vms and nets: Getting tenant VM instance information from VIM"
+            #print("VIMConnector refresh_tenant_vms and nets: Getting tenant VM instance information from VIM")
             try:
                 url = self.url+'/'+self.tenant+'/servers/'+ vm_id
                 self.logger.info("Getting vm GET %s", url)
@@ -958,13 +961,13 @@
                         if interface["ip_address"] == "0.0.0.0":
                             interface["ip_address"] = None
                         vm["interfaces"].append(interface)
-                        
+
                 except Exception as e:
                     self.logger.error("refresh_vms_and_nets. Port get %s: %s", type(e).__name__, str(e))
 
                 if vm['status'] == "ACTIVE" and not management_ip:
                     vm['status'] = "ACTIVE:NoMgmtIP"
-                    
+
             except vimconn.vimconnNotFoundException as e:
                 self.logger.error("Exception getting vm status: %s", str(e))
                 vm['status'] = "DELETED"
@@ -983,13 +986,13 @@
                 net_id:         #VIM id of this network
                     status:     #Mandatory. Text with one of:
                                 #  DELETED (not found at vim)
-                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...) 
+                                #  VIM_ERROR (Cannot connect to VIM, VIM response error, ...)
                                 #  OTHER (Vim reported other status not understood)
                                 #  ERROR (VIM indicates an ERROR status)
-                                #  ACTIVE, INACTIVE, DOWN (admin down), 
+                                #  ACTIVE, INACTIVE, DOWN (admin down),
                                 #  BUILD (on building process)
                                 #
-                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR 
+                    error_msg:  #Text with VIM error message, if any. Or the VIM connection ERROR
                     vim_info:   #Text with plain information obtained from vim (yaml.safe_dump)
 
         '''
@@ -997,11 +1000,11 @@
             self._get_my_tenant()
         except requests.exceptions.RequestException as e:
             self._format_request_exception(e)
-        
+
         net_dict={}
         for net_id in net_list:
             net = {}
-            #print "VIMConnector refresh_tenant_vms_and_nets: Getting tenant network from VIM (tenant: " + str(self.tenant) + "): "
+            #print("VIMConnector refresh_tenant_vms_and_nets: Getting tenant network from VIM (tenant: " + str(self.tenant) + "): ")
             try:
                 net_vim = self.get_network(net_id)
                 if net_vim['status'] in netStatus2manoFormat:
@@ -1009,7 +1012,7 @@
                 else:
                     net["status"] = "OTHER"
                     net["error_msg"] = "VIM status reported " + net_vim['status']
-                    
+
                 if net["status"] == "ACTIVE" and not net_vim['admin_state_up']:
                     net["status"] = "DOWN"
                 if net_vim.get('last_error'):
@@ -1025,7 +1028,7 @@
                 net['error_msg'] = str(e)
             net_dict[net_id] = net
         return net_dict
-    
+
     def action_vminstance(self, vm_id, action_dict):
         '''Send and action over a VM instance from VIM'''
         '''Returns the status'''
@@ -1041,13 +1044,13 @@
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
 
-#NOT USED METHODS in current version        
-  
+#NOT USED METHODS in current version
+
     def host_vim2gui(self, host, server_dict):
         '''Transform host dictionary from VIM format to GUI format,
         and append to the server_dict
         '''
-        if type(server_dict) is not dict: 
+        if type(server_dict) is not dict:
             print('vimconnector.host_vim2gui() ERROR, param server_dict must be a dictionary')
             return
         RAD={}
@@ -1075,7 +1078,7 @@
             for iface in numa['interfaces']:
                 RAD_item['ports'][ iface['pci'] ] = 'speed:'+str(iface['Mbps'])+'M'
                 occupation_item['ports'][ iface['pci'] ] = { 'occupied': str(100*iface['Mbps_consumed'] / iface['Mbps']) + "%" }
-                
+
             RAD[ numa['numa_socket'] ] = RAD_item
             occupation[ numa['numa_socket'] ] = occupation_item
         server_dict[ host['host']['name'] ] = {'RAD':RAD, 'occupation':occupation}
@@ -1091,15 +1094,15 @@
             print("get_hosts_info Exception: ", e.args)
             return -vimconn.HTTP_Not_Found, str(e.args[0])
         print("vim get", url, "response:",  vim_response.status_code, vim_response.json())
-        #print vim_response.status_code
-        #print json.dumps(vim_response.json(), indent=4)
+        #print(vim_response.status_code)
+        #print(json.dumps(vim_response.json(), indent=4))
         if vim_response.status_code != 200:
             #TODO: get error
             print('vimconnector.get_hosts_info error getting host list %d %s' %(vim_response.status_code, vim_response.json()))
             return -vim_response.status_code, "Error getting host list"
-        
+
         res,hosts = self._format_in(vim_response, get_hosts_response_schema)
-            
+
         if res==False:
             print("vimconnector.get_hosts_info error parsing GET HOSTS vim response", hosts)
             return vimconn.HTTP_Internal_Server_Error, hosts
@@ -1120,7 +1123,7 @@
             if res==False:
                 print("vimconnector.get_hosts_info error parsing GET HOSTS/%s vim response" % host['id'], host_detail)
                 continue
-            #print 'host id '+host['id'], json.dumps(host_detail, indent=4)
+            #print('host id '+host['id'], json.dumps(host_detail, indent=4))
             self.host_vim2gui(host_detail, hosts_dict)
         return 200, hosts_dict
 
@@ -1135,15 +1138,15 @@
             print("get_hosts Exception: ", e.args)
             return -vimconn.HTTP_Not_Found, str(e.args[0])
         print("vim get", url, "response:",  vim_response.status_code, vim_response.json())
-        #print vim_response.status_code
-        #print json.dumps(vim_response.json(), indent=4)
+        #print(vim_response.status_code)
+        #print(json.dumps(vim_response.json(), indent=4))
         if vim_response.status_code != 200:
             #TODO: get error
             print('vimconnector.get_hosts error getting host list %d %s' %(vim_response.status_code, vim_response.json()))
             return -vim_response.status_code, "Error getting host list"
-        
+
         res,hosts = self._format_in(vim_response, get_hosts_response_schema)
-            
+
         if res==False:
             print("vimconnector.get_host error parsing GET HOSTS vim response", hosts)
             return vimconn.HTTP_Internal_Server_Error, hosts
@@ -1163,7 +1166,7 @@
             if res==False:
                 print("vimconnector.get_host error parsing GET SERVERS/%s vim response" % host['id'], servers)
                 continue
-            #print 'host id '+host['id'], json.dumps(host_detail, indent=4)
+            #print('host id '+host['id'], json.dumps(host_detail, indent=4))
             host['instances'] = servers['servers']
         return 200, hosts['hosts']
 
@@ -1176,16 +1179,16 @@
             print("get_processor_rankings Exception: ", e.args)
             return -vimconn.HTTP_Not_Found, str(e.args[0])
         print("vim get", url, "response:", vim_response.status_code, vim_response.json())
-        #print vim_response.status_code
-        #print json.dumps(vim_response.json(), indent=4)
+        #print(vim_response.status_code)
+        #print(json.dumps(vim_response.json(), indent=4))
         if vim_response.status_code != 200:
             #TODO: get error
             print('vimconnector.get_processor_rankings error getting processor rankings %d %s' %(vim_response.status_code, vim_response.json()))
             return -vim_response.status_code, "Error getting processor rankings"
-        
+
         res,rankings = self._format_in(vim_response, get_processor_rankings_response_schema)
         return res, rankings['rankings']
-    
+
     def new_host(self, host_data):
         '''Adds a new host to VIM'''
         '''Returns status code of the VIM response'''
@@ -1196,17 +1199,17 @@
             vim_response = requests.post(url, headers = self.headers_req, data=payload_req)
             self._check_http_request_response(vim_response)
             self.logger.debug(vim_response.text)
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(json.dumps(vim_response.json(), indent=4))
             response = vim_response.json()
             js_v(response, new_host_response_schema)
             r = self._remove_extra_items(response, new_host_response_schema)
-            if r is not None: 
+            if r is not None:
                 self.logger.warn("Warning: remove extra items %s", str(r))
             host_id = response['host']['id']
             return host_id
         except (requests.exceptions.RequestException, js_e.ValidationError) as e:
             self._format_request_exception(e)
-    
+
     def new_external_port(self, port_data):
         '''Adds a external port to VIM'''
         '''Returns the port identifier'''
@@ -1219,33 +1222,33 @@
             self.logger.error("new_external_port Exception: ", str(e))
             return -vimconn.HTTP_Not_Found, str(e.args[0])
         print(vim_response)
-        #print vim_response.status_code
+        #print(vim_response.status_code)
         if vim_response.status_code == 200:
-        #print vim_response.json()
-        #print json.dumps(vim_response.json(), indent=4)
+        #print(vim_response.json())
+        #print(json.dumps(vim_response.json(), indent=4))
             res, http_content = self._format_in(vim_response, new_port_response_schema)
-        #print http_content
+        #print(http_content)
             if res:
                 r = self._remove_extra_items(http_content, new_port_response_schema)
                 if r is not None: print("Warning: remove extra items ", r)
-                #print http_content
+                #print(http_content)
                 port_id = http_content['port']['id']
                 print("Port id: ",port_id)
                 return vim_response.status_code,port_id
             else: return -vimconn.HTTP_Bad_Request,http_content
         else:
-            #print vim_response.text
+            #print(vim_response.text)
             jsonerror = self._format_jsonerror(vim_response)
             text = 'Error in VIM "%s": not possible to add new external port. HTTP Response: %d. Error: %s' % (self.url_admin, vim_response.status_code, jsonerror)
-            #print text
+            #print(text)
             return -vim_response.status_code,text
-        
+
     def new_external_network(self,net_name,net_type):
         '''Adds a external network to VIM (shared)'''
         '''Returns the network identifier'''
         #TODO change to logging exception code policies
         print("VIMConnector: Adding external shared network to VIM (type " + net_type + "): "+ net_name)
-        
+
         payload_req = '{"network":{"name": "' + net_name + '","shared":true,"type": "' + net_type + '"}}'
         try:
             vim_response = requests.post(self.url+'/networks', headers = self.headers_req, data=payload_req)
@@ -1253,33 +1256,33 @@
             self.logger.error( "new_external_network Exception: ", e.args)
             return -vimconn.HTTP_Not_Found, str(e.args[0])
         print(vim_response)
-        #print vim_response.status_code
+        #print(vim_response.status_code)
         if vim_response.status_code == 200:
-            #print vim_response.json()
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(vim_response.json())
+            #print(json.dumps(vim_response.json(), indent=4))
             res,http_content = self._format_in(vim_response, new_network_response_schema)
-            #print http_content
+            #print(http_content)
             if res:
                 r = self._remove_extra_items(http_content, new_network_response_schema)
                 if r is not None: print("Warning: remove extra items ", r)
-                #print http_content
+                #print(http_content)
                 network_id = http_content['network']['id']
                 print("Network id: ",network_id)
                 return vim_response.status_code,network_id
             else: return -vimconn.HTTP_Bad_Request,http_content
         else:
-            #print vim_response.text
+            #print(vim_response.text)
             jsonerror = self._format_jsonerror(vim_response)
             text = 'Error in VIM "%s": not possible to add new external network. HTTP Response: %d. Error: %s' % (self.url, vim_response.status_code, jsonerror)
-            #print text
+            #print(text)
             return -vim_response.status_code,text
-        
+
     def connect_port_network(self, port_id, network_id, admin=False):
         '''Connects a external port to a network'''
         '''Returns status code of the VIM response'''
         #TODO change to logging exception code policies
         print("VIMConnector: Connecting external port to network")
-        
+
         payload_req = '{"port":{"network_id":"' + network_id + '"}}'
         if admin:
             if self.url_admin==None:
@@ -1293,16 +1296,16 @@
             print("connect_port_network Exception: ", e.args)
             return -vimconn.HTTP_Not_Found, str(e.args[0])
         print(vim_response)
-        #print vim_response.status_code
+        #print(vim_response.status_code)
         if vim_response.status_code == 200:
-            #print vim_response.json()
-            #print json.dumps(vim_response.json(), indent=4)
+            #print(vim_response.json())
+            #print(json.dumps(vim_response.json(), indent=4))
             res,http_content = self._format_in(vim_response, new_port_response_schema)
-            #print http_content
+            #print(http_content)
             if res:
                 r = self._remove_extra_items(http_content, new_port_response_schema)
                 if r is not None: print("Warning: remove extra items ", r)
-                #print http_content
+                #print(http_content)
                 port_id = http_content['port']['id']
                 print("Port id: ",port_id)
                 return vim_response.status_code,port_id
@@ -1313,5 +1316,3 @@
             text = 'Error in VIM "%s": not possible to connect external port to network. HTTP Response: %d. Error: %s' % (self.url_admin, vim_response.status_code, jsonerror)
             print(text)
             return -vim_response.status_code,text
-        
-
diff --git a/osm_ro/vimconn_vmware.py b/osm_ro/vimconn_vmware.py
index 12581d6..f69487d 100644
--- a/osm_ro/vimconn_vmware.py
+++ b/osm_ro/vimconn_vmware.py
@@ -27,7 +27,7 @@
 """
 from progressbar import Percentage, Bar, ETA, FileTransferSpeed, ProgressBar
 
-from . import vimconn
+import vimconn
 import os
 import traceback
 import itertools
@@ -42,7 +42,10 @@
 from lxml import etree as lxmlElementTree
 
 import yaml
-from pyvcloud import Http
+
+#from pyvcloud import Http
+import http.client as Http
+
 from pyvcloud.vcloudair import VCA
 from pyvcloud.schema.vcd.v1_5.schemas.vcloud import sessionType, organizationType, \
     vAppType, organizationListType, vdcType, catalogType, queryRecordViewType, \
@@ -58,7 +61,7 @@
 import json
 import time
 import uuid
-import http.client
+import httplib
 import hashlib
 import socket
 import struct
@@ -456,7 +459,7 @@
                     raise vimconn.vimconnNotFoundException("Fail to get tenant {}".format(tenant_id))
 
                 lxmlroot_respond = lxmlElementTree.fromstring(response.content)
-                namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.items() if prefix}
+                namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.iteritems() if prefix}
                 namespaces["xmlns"]= "http://www.vmware.com/vcloud/v1.5"
                 vdc_remove_href = lxmlroot_respond.find("xmlns:Link[@rel='remove']",namespaces).attrib['href']
                 vdc_remove_href = vdc_remove_href + '?recursive=true&force=true'
@@ -871,7 +874,7 @@
             raise vimconn.vimconnNotFoundException("Fail to get image {}".format(image_id))
 
         lxmlroot_respond = lxmlElementTree.fromstring(response.content)
-        namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.items() if prefix}
+        namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.iteritems() if prefix}
         namespaces["xmlns"]= "http://www.vmware.com/vcloud/v1.5"
 
         catalogItems_section = lxmlroot_respond.find("xmlns:CatalogItems",namespaces)
@@ -894,7 +897,7 @@
                                                                                     image_id))
 
             lxmlroot_respond = lxmlElementTree.fromstring(response.content)
-            namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.items() if prefix}
+            namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.iteritems() if prefix}
             namespaces["xmlns"]= "http://www.vmware.com/vcloud/v1.5"
             catalogitem_remove_href = lxmlroot_respond.find("xmlns:Link[@rel='remove']",namespaces).attrib['href']
 
@@ -982,8 +985,8 @@
             for catalog in vca.get_catalogs():
                 if catalog_name != catalog.name:
                     continue
-                link = [link for link in catalog.get_Link() if link.get_type() == "application/vnd.vmware.vcloud.media+xml" and
-                                           link.get_rel() == 'add']
+                link = filter(lambda link: link.get_type() == "application/vnd.vmware.vcloud.media+xml" and
+                                           link.get_rel() == 'add', catalog.get_Link())
                 assert len(link) == 1
                 data = """
                 <UploadVAppTemplateParams name="%s" xmlns="http://www.vmware.com/vcloud/v1.5" xmlns:ovf="http://schemas.dmtf.org/ovf/envelope/1"><Description>%s vApp Template</Description></UploadVAppTemplateParams>
@@ -1031,8 +1034,9 @@
                     if response.status_code == requests.codes.ok:
                         media = mediaType.parseString(response.content, True)
                         number_of_files = len(media.get_Files().get_File())
-                        for index in range(0, number_of_files):
-                            links_list = [link for link in media.get_Files().get_File()[index].get_Link() if link.get_rel() == 'upload:default']
+                        for index in xrange(0, number_of_files):
+                            links_list = filter(lambda link: link.get_rel() == 'upload:default',
+                                                media.get_Files().get_File()[index].get_Link())
                             for link in links_list:
                                 # we skip ovf since it already uploaded.
                                 if 'ovf' in link.get_href():
@@ -1048,7 +1052,7 @@
                                 hrefvmdk = link.get_href()
 
                                 if progress:
-                                    print(("Uploading file: {}".format(file_vmdk)))
+                                    print("Uploading file: {}".format(file_vmdk))
                                 if progress:
                                     widgets = ['Uploading file: ', Percentage(), ' ', Bar(), ' ', ETA(), ' ',
                                                FileTransferSpeed()]
@@ -1302,7 +1306,8 @@
             return None
         # UUID has following format https://host/api/vApp/vapp-30da58a3-e7c7-4d09-8f68-d4c8201169cf
         try:
-            refs = [ref for ref in vdc.ResourceEntities.ResourceEntity if ref.name == vapp_name and ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml']
+            refs = filter(lambda ref: ref.name == vapp_name and ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml',
+                          vdc.ResourceEntities.ResourceEntity)
             if len(refs) == 1:
                 return refs[0].href.split("vapp")[1][1:]
         except Exception as e:
@@ -1324,7 +1329,9 @@
                 :param vapp_uuid:
         """
         try:
-            refs = [ref for ref in vdc.ResourceEntities.ResourceEntity if ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml']
+            refs = filter(lambda ref:
+                          ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml',
+                          vdc.ResourceEntities.ResourceEntity)
             for ref in refs:
                 vappid = ref.href.split("vapp")[1][1:]
                 # find vapp with respected vapp uuid
@@ -1348,7 +1355,8 @@
         """
 
         try:
-            refs = [ref for ref in vdc.ResourceEntities.ResourceEntity if ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml']
+            refs = filter(lambda ref: ref.type_ == 'application/vnd.vmware.vcloud.vApp+xml',
+                          vdc.ResourceEntities.ResourceEntity)
             for ref in refs:
                 # we care only about UUID the rest doesn't matter
                 vappid = ref.href.split("vapp")[1][1:]
@@ -1484,7 +1492,7 @@
 
         # client must provide at least one entry in net_list if not we report error
         #If net type is mgmt, then configure it as primary net & use its NIC index as primary NIC
-        #If no mgmt, then the 1st NN in netlist is considered as primary net. 
+        #If no mgmt, then the 1st NN in netlist is considered as primary net.
         primary_net = None
         primary_netname = None
         network_mode = 'bridged'
@@ -1651,7 +1659,7 @@
                                   - NONE (No IP addressing mode specified.)"""
 
                 if primary_netname is not None:
-                    nets = [n for n in self.vca.get_networks(self.tenant_name) if n.name == interface_net_name]
+                    nets = filter(lambda n: n.name == interface_net_name, self.vca.get_networks(self.tenant_name))
                     if len(nets) == 1:
                         self.logger.info("new_vminstance(): Found requested network: {}".format(nets[0].name))
 
@@ -1901,7 +1909,7 @@
                         wait_time +=INTERVAL_TIME
 
                     if not undeployed:
-                        self.logger.debug("delete_vminstance(): Failed to undeploy vApp {} ".format(vm__vim_uuid)) 
+                        self.logger.debug("delete_vminstance(): Failed to undeploy vApp {} ".format(vm__vim_uuid))
 
                 # delete vapp
                 self.logger.info("Start deletion of vApp {} ".format(vapp_name))
@@ -2170,7 +2178,7 @@
                 result = self.vca.block_until_completed(power_task)
                 self.instance_actions_result("resume", result, vapp_name)
             elif "shutoff" in action_dict or "shutdown" in action_dict:
-                action_name , value = list(action_dict.items())[0]
+                action_name , value = action_dict.items()[0]
                 self.logger.info("action_vminstance: {} vApp: {}".format(action_name, vapp_name))
                 power_off_task = the_vapp.undeploy(action='powerOff')
                 result = self.vca.block_until_completed(power_off_task)
@@ -2304,7 +2312,7 @@
             org_dict = self.get_org(self.org_uuid)
             if org_dict and 'networks' in org_dict:
                 org_network_dict = org_dict['networks']
-                for net_uuid,net_name in org_network_dict.items():
+                for net_uuid,net_name in org_network_dict.iteritems():
                     if net_name == network_name:
                         return net_uuid
 
@@ -2458,7 +2466,8 @@
         vm_list_rest_call = ''.join(url_list)
 
         if not (not vca.vcloud_session or not vca.vcloud_session.organization):
-            refs = [ref for ref in vca.vcloud_session.organization.Link if ref.name == vdc_name and ref.type_ == 'application/vnd.vmware.vcloud.vdc+xml']
+            refs = filter(lambda ref: ref.name == vdc_name and ref.type_ == 'application/vnd.vmware.vcloud.vdc+xml',
+                          vca.vcloud_session.organization.Link)
             if len(refs) == 1:
                 response = Http.get(url=vm_list_rest_call,
                                     headers=vca.vcloud_session.get_vcloud_headers(),
@@ -3393,7 +3402,7 @@
             return None
         try:
             lxmlroot_respond = lxmlElementTree.fromstring(response.content)
-            namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.items() if prefix}
+            namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.iteritems() if prefix}
             namespaces["xmlns"]= "http://www.vmware.com/vcloud/v1.5"
 
             for item in lxmlroot_respond.iterfind('xmlns:Item',namespaces):
@@ -4222,7 +4231,7 @@
         try:
             #Find but type & max of instance IDs assigned to disks
             lxmlroot_respond = lxmlElementTree.fromstring(response.content)
-            namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.items() if prefix}
+            namespaces = {prefix:uri for prefix,uri in lxmlroot_respond.nsmap.iteritems() if prefix}
             namespaces["xmlns"]= "http://www.vmware.com/vcloud/v1.5"
             instance_id = 0
             for item in lxmlroot_respond.iterfind('xmlns:Item',namespaces):
@@ -4498,7 +4507,7 @@
             catalog = self.get_catalog_obj(image_id, catalogs)
             if catalog:
                 template_name = self.get_catalogbyid(image_id, catalogs)
-                catalog_items = [catalogItemRef for catalogItemRef in catalog.get_CatalogItems().get_CatalogItem() if catalogItemRef.get_name() == template_name]
+                catalog_items = filter(lambda catalogItemRef: catalogItemRef.get_name() == template_name, catalog.get_CatalogItems().get_CatalogItem())
                 if len(catalog_items) == 1:
                     response = Http.get(catalog_items[0].get_href(),
                                         headers=vca.vcloud_session.get_vcloud_headers(),
@@ -4956,7 +4965,7 @@
         if "used_vlanIDs" not in self.persistent_info:
                 self.persistent_info["used_vlanIDs"] = {}
         else:
-            used_ids = list(self.persistent_info["used_vlanIDs"].values())
+            used_ids = self.persistent_info["used_vlanIDs"].values()
 
         for vlanID_range in self.config.get('vlanID_range'):
             start_vlanid , end_vlanid = vlanID_range.split("-")
@@ -4964,7 +4973,7 @@
                 raise vimconn.vimconnConflictException("Invalid vlan ID range {}".format(
                                                                         vlanID_range))
 
-            for id in range(int(start_vlanid), int(end_vlanid) + 1):
+            for id in xrange(int(start_vlanid), int(end_vlanid) + 1):
                 if id not in used_ids:
                     vlan_id = id
                     self.persistent_info["used_vlanIDs"][network_name] = vlan_id
@@ -5192,5 +5201,3 @@
             vdc = self.vca.get_vdc(self.tenant_name)
 
         return vdc
-
-
diff --git a/osm_ro/vmware_utils/OVF_converter/format_converter/command_progress.py b/osm_ro/vmware_utils/OVF_converter/format_converter/command_progress.py
index 4e5898e..cbfb737 100644
--- a/osm_ro/vmware_utils/OVF_converter/format_converter/command_progress.py
+++ b/osm_ro/vmware_utils/OVF_converter/format_converter/command_progress.py
@@ -49,7 +49,7 @@
             Args  : None
             Return : None
         """
-        print('\b.', end=' ')
+        print '\b.',
         sys.stdout.flush()
 
     def start_progressbar(self):
diff --git a/osm_ro/vmware_utils/OVF_converter/format_converter/converter.py b/osm_ro/vmware_utils/OVF_converter/format_converter/converter.py
index 43981ac..3c647a9 100644
--- a/osm_ro/vmware_utils/OVF_converter/format_converter/converter.py
+++ b/osm_ro/vmware_utils/OVF_converter/format_converter/converter.py
@@ -27,7 +27,7 @@
 import subprocess
 import yaml
 from lxml import etree as ET
-from .command_progress import CommandProgressbar
+from command_progress import CommandProgressbar
 
 #file paths
 MODULE_DIR = os.path.dirname(__file__)
@@ -288,7 +288,7 @@
             root = OVF_tree.getroot()
 
             #Collect namespaces
-            nsmap = {k:v for k,v in root.nsmap.items() if k}
+            nsmap = {k:v for k,v in root.nsmap.iteritems() if k}
             nsmap["xmlns"]= "http://schemas.dmtf.org/ovf/envelope/1"
 
             #Edit OVF template
@@ -370,7 +370,7 @@
 
             if os.path.isfile(self.output_path):
                 logger.info("Successfully written output OVF at {}".format(self.output_path))
-                print(("Output OVF is at :  {}".format(self.output_path)))
+                print("Output OVF is at :  {}".format(self.output_path))
                 return self.output_path
             else:
                 error_msg = "ERROR: Error occurred while creating OVF file"
@@ -431,7 +431,7 @@
         os_info = self.__read_yaml_file(OS_INFO_FILE_PATH)
         try:
             if self.os_type and os_info:
-                for os_id , os_type in os_info.items():
+                for os_id , os_type in os_info.iteritems():
                     if self.os_type.lower() == os_type.lower():
                         osID = os_id
                         osType = os_type
@@ -461,7 +461,7 @@
         disk_controller_info = self.__read_yaml_file(DISK_CONTROLLER_INFO_FILE_PATH)
         try:
             if self.disk_controller and disk_controller_info:
-                for key , value in disk_controller_info.items():
+                for key , value in disk_controller_info.iteritems():
                     if self.disk_controller.lower() in key.lower():
                         disk_controller['controllerName'] = key
                         disk_controller['resourceType'] = str(value["ResourceType"])
diff --git a/osm_ro/vmware_utils/OVF_converter/format_converter/ovf_converter_cli.py b/osm_ro/vmware_utils/OVF_converter/format_converter/ovf_converter_cli.py
index 63e4a25..209c05d 100644
--- a/osm_ro/vmware_utils/OVF_converter/format_converter/ovf_converter_cli.py
+++ b/osm_ro/vmware_utils/OVF_converter/format_converter/ovf_converter_cli.py
@@ -23,7 +23,7 @@
 ##
 
 import argparse
-from .converter import OVFConverter , get_version
+from converter import OVFConverter , get_version
 
 def execute_cli():
 
diff --git a/osm_ro/vmwarecli.py b/osm_ro/vmwarecli.py
index 89f7807..4583a65 100755
--- a/osm_ro/vmwarecli.py
+++ b/osm_ro/vmwarecli.py
@@ -67,13 +67,13 @@
 from pyvcloud import Http
 
 import logging
-from . import vimconn
+import vimconn
 import time
 import uuid
 import urllib3
 import requests
 
-from .vimconn_vmware import vimconnector
+from vimconn_vmware import vimconnector
 from requests.packages.urllib3.exceptions import InsecureRequestWarning
 from prettytable import PrettyTable
 
@@ -108,7 +108,7 @@
                             verify=vca.verify,
                             logger=vca.logger)
         if response.status_code == requests.codes.ok:
-            print(response.content)
+            print response.content
             return response.content
 
     return None
@@ -161,7 +161,7 @@
 
         vm_table.add_row(entry)
 
-    print(vm_table)
+    print vm_table
 
 
 def print_org(org_dict=None):
@@ -182,7 +182,7 @@
         entry = [k, org_dict[k]]
         org_table.add_row(entry)
 
-    print(org_table)
+    print org_table
 
 
 def print_vm_list(vm_dict=None):
@@ -213,7 +213,7 @@
             entry.append(vm_dict[k]['memoryMB'])
             entry.append(vm_dict[k]['status'])
             vm_table.add_row(entry)
-        print(vm_table)
+        print vm_table
     except KeyError:
         logger.error("wrong key {}".format(KeyError.message))
         pass
@@ -232,14 +232,14 @@
         return
     try:
         vdcs_dict = {}
-        if 'vdcs' in org_dict:
+        if org_dict.has_key('vdcs'):
             vdcs_dict = org_dict['vdcs']
         vdc_table = PrettyTable(['vdc uuid', 'vdc name'])
         for k in vdcs_dict:
             entry = [k, vdcs_dict[k]]
             vdc_table.add_row(entry)
 
-        print(vdc_table)
+        print vdc_table
     except KeyError:
         logger.error("wrong key {}".format(KeyError.message))
         logger.logger.debug(traceback.format_exc())
@@ -259,14 +259,14 @@
         return
     try:
         network_dict = {}
-        if 'networks' in org_dict:
+        if org_dict.has_key('networks'):
             network_dict = org_dict['networks']
         network_table = PrettyTable(['network uuid', 'network name'])
         for k in network_dict:
             entry = [k, network_dict[k]]
             network_table.add_row(entry)
 
-        print(network_table)
+        print network_table
 
     except KeyError:
         logger.error("wrong key {}".format(KeyError.message))
@@ -290,7 +290,7 @@
         print_vdc_list(org_dict=org_dict)
         print_network_list(org_dict=org_dict)
 
-        if 'catalogs' in org_dict:
+        if org_dict.has_key('catalogs'):
             catalogs_dict = org_dict['catalogs']
 
         catalog_table = PrettyTable(['catalog uuid', 'catalog name'])
@@ -298,7 +298,7 @@
             entry = [k, catalogs_dict[k]]
             catalog_table.add_row(entry)
 
-        print(catalog_table)
+        print catalog_table
 
     except KeyError:
         logger.error("wrong key {}".format(KeyError.message))
@@ -368,10 +368,10 @@
 
 def print_network_details(network_dict=None):
     try:
-        network_table = PrettyTable(list(network_dict.keys()))
-        entry = [list(network_dict.values())]
+        network_table = PrettyTable(network_dict.keys())
+        entry = [network_dict.values()]
         network_table.add_row(entry[0])
-        print(network_table)
+        print network_table
     except KeyError:
         logger.error("wrong key {}".format(KeyError.message))
         logger.logger.debug(traceback.format_exc())
@@ -381,10 +381,10 @@
 
     try:
         for element in generic_dict:
-            table = PrettyTable(list(element.keys()))
-            entry = [list(element.values())]
+            table = PrettyTable(element.keys())
+            entry = [element.values()]
             table.add_row(entry[0])
-        print(table)
+        print table
     except KeyError:
         logger.error("wrong key {}".format(KeyError.message))
         logger.logger.debug(traceback.format_exc())
@@ -430,13 +430,13 @@
             if not namespace.uuid:
                 vapp_uuid = vim.get_vappid(vdc=namespace.vcdvdc, vapp_name=namespace.vapp_name)
                 if vapp_uuid is None:
-                    print(("Can't find vapp by given name {}".format(namespace.vapp_name)))
+                    print("Can't find vapp by given name {}".format(namespace.vapp_name))
                     return
 
-            print(" namespace {}".format(namespace))
+            print " namespace {}".format(namespace)
             if vapp_dict is not None and namespace.osm:
                 vm_info_dict = vim.get_vminstance(vim_vm_uuid=vapp_uuid)
-                print(vm_info_dict)
+                print vm_info_dict
             if vapp_dict is not None and namespace.osm != True:
                 vapp_dict = vim.get_vapp(vdc_name=namespace.vcdvdc, vapp_name=vapp_uuid, isuuid=True)
                 print_vapp(vapp_dict=vapp_dict)
@@ -448,10 +448,10 @@
         # if request name based we need find UUID
         # TODO optimize it or move to external function
         if not namespace.uuid:
-            if 'networks' not in myorg:
-                print(("Network {} is undefined in vcloud director for org {} vdc {}".format(namespace.network_name,
+            if not myorg.has_key('networks'):
+                print("Network {} is undefined in vcloud director for org {} vdc {}".format(namespace.network_name,
                                                                                             vim.name,
-                                                                                            vim.tenant_name)))
+                                                                                            vim.tenant_name))
                 return
 
             my_org_net = myorg['networks']
@@ -460,7 +460,7 @@
                     network_uuid = network
                     break
 
-        print(print_network_details(network_dict=vim.get_vcd_network(network_uuid=network_uuid)))
+        print print_network_details(network_dict=vim.get_vcd_network(network_uuid=network_uuid))
 
 
 def create_actions(vim=None, action=None, namespace=None):
@@ -477,16 +477,16 @@
         logger.debug("Creating a network in vcloud director".format(namespace.network_name))
         network_uuid = vim.create_network(namespace.network_name)
         if network_uuid is not None:
-            print(("Crated new network {} and uuid: {}".format(namespace.network_name, network_uuid)))
+            print ("Crated new network {} and uuid: {}".format(namespace.network_name, network_uuid))
         else:
-            print(("Failed create a new network {}".format(namespace.network_name)))
+            print ("Failed create a new network {}".format(namespace.network_name))
     elif action == 'vdc' or namespace.action == 'vdc':
         logger.debug("Creating a new vdc in vcloud director.".format(namespace.vdc_name))
         vdc_uuid = vim.create_vdc(namespace.vdc_name)
         if vdc_uuid is not None:
-            print(("Crated new vdc {} and uuid: {}".format(namespace.vdc_name, vdc_uuid)))
+            print ("Crated new vdc {} and uuid: {}".format(namespace.vdc_name, vdc_uuid))
         else:
-            print(("Failed create a new vdc {}".format(namespace.vdc_name)))
+            print ("Failed create a new vdc {}".format(namespace.vdc_name))
     else:
         return None
 
@@ -519,11 +519,11 @@
     try:
         catalog_uuid = vim.get_image_id_from_path(path=image_file, progress=True)
         if catalog_uuid is not None and validate_uuid4(catalog_uuid):
-            print(("Image uploaded and uuid {}".format(catalog_uuid)))
+            print("Image uploaded and uuid {}".format(catalog_uuid))
             return True
     except vimconn.vimconnException as upload_exception:
-        print(("Failed uploaded {} image".format(image_file)))
-        print(("Error Reason: {}".format(upload_exception.message)))
+        print("Failed uploaded {} image".format(image_file))
+        print("Error Reason: {}".format(upload_exception.message))
     return False
 
 
@@ -553,22 +553,22 @@
             if vim_catalog is None:
                 return None
 
-        print((" Booting {} image id {} ".format(vm_name, vim_catalog)))
+        print (" Booting {} image id {} ".format(vm_name, vim_catalog))
         vm_uuid = vim.new_vminstance(name=vm_name, image_id=vim_catalog)
         if vm_uuid is not None and validate_uuid4(vm_uuid):
-            print(("Image booted and vm uuid {}".format(vm_uuid)))
+            print("Image booted and vm uuid {}".format(vm_uuid))
             vapp_dict = vim.get_vapp(vdc_name=namespace.vcdvdc, vapp_name=vm_uuid, isuuid=True)
             if vapp_dict is not None:
                 print_vapp(vapp_dict=vapp_dict)
         return True
     except vimconn.vimconnNotFoundException as notFound:
-        print(("Failed boot {} image".format(image_name)))
-        print((notFound.message))
+        print("Failed boot {} image".format(image_name))
+        print(notFound.message)
     except vimconn.vimconnException as vimconError:
-        print(("Failed boot {} image".format(image_name)))
-        print((vimconError.message))
+        print("Failed boot {} image".format(image_name))
+        print(vimconError.message)
     except:
-        print(("Failed boot {} image".format(image_name)))
+        print("Failed boot {} image".format(image_name))
 
 
         return False
@@ -611,7 +611,7 @@
 
     if namespace.vcdvdc is None:
         while True:
-            vcduser = eval(input("Enter vcd username: "))
+            vcduser = input("Enter vcd username: ")
             if vcduser is not None and len(vcduser) > 0:
                 break
     else:
@@ -619,7 +619,7 @@
 
     if namespace.vcdpassword is None:
         while True:
-            vcdpasword = eval(input("Please enter vcd password: "))
+            vcdpasword = input("Please enter vcd password: ")
             if vcdpasword is not None and len(vcdpasword) > 0:
                 break
     else:
@@ -627,7 +627,7 @@
 
     if namespace.vcdhost is None:
         while True:
-            vcdhost = eval(input("Please enter vcd host name or ip: "))
+            vcdhost = input("Please enter vcd host name or ip: ")
             if vcdhost is not None and len(vcdhost) > 0:
                 break
     else:
@@ -635,7 +635,7 @@
 
     if namespace.vcdorg is None:
         while True:
-            vcdorg = eval(input("Please enter vcd organization name: "))
+            vcdorg = input("Please enter vcd organization name: ")
             if vcdorg is not None and len(vcdorg) > 0:
                 break
     else:
@@ -797,7 +797,7 @@
 
     namespace = parser.parse_args()
     # put command_line args to mapping
-    command_line_args = {k: v for k, v in list(vars(namespace).items()) if v}
+    command_line_args = {k: v for k, v in vars(namespace).items() if v}
 
     d = defaults.copy()
     d.update(os.environ)
diff --git a/osm_ro/vmwarerecli.py b/osm_ro/vmwarerecli.py
index bbb5e29..1667ec6 100755
--- a/osm_ro/vmwarerecli.py
+++ b/osm_ro/vmwarerecli.py
@@ -66,13 +66,13 @@
 from pyvcloud import Http
 
 import logging
-from . import vimconn
+import vimconn
 import time
 import uuid
 import urllib3
 import requests
 
-from .vimconn_vmware import vimconnector
+from vimconn_vmware import vimconnector
 from requests.packages.urllib3.exceptions import InsecureRequestWarning
 from prettytable import PrettyTable
 
@@ -231,7 +231,7 @@
         return
     try:
         vdcs_dict = {}
-        if 'vdcs' in org_dict:
+        if org_dict.has_key('vdcs'):
             vdcs_dict = org_dict['vdcs']
         vdc_table = PrettyTable(['vdc uuid', 'vdc name'])
         for k in vdcs_dict:
@@ -258,7 +258,7 @@
         return
     try:
         network_dict = {}
-        if 'networks' in org_dict:
+        if org_dict.has_key('networks'):
             network_dict = org_dict['networks']
         network_table = PrettyTable(['network uuid', 'network name'])
         for k in network_dict:
@@ -289,7 +289,7 @@
         print_vdc_list(org_dict=org_dict)
         print_network_list(org_dict=org_dict)
 
-        if 'catalogs' in org_dict:
+        if org_dict.has_key('catalogs'):
             catalogs_dict = org_dict['catalogs']
 
         catalog_table = PrettyTable(['catalog uuid', 'catalog name'])
@@ -367,8 +367,8 @@
 
 def print_network_details(network_dict=None):
     try:
-        network_table = PrettyTable(list(network_dict.keys()))
-        entry = [list(network_dict.values())]
+        network_table = PrettyTable(network_dict.keys())
+        entry = [network_dict.values()]
         network_table.add_row(entry[0])
         print(network_table)
     except KeyError:
@@ -380,8 +380,8 @@
 
     try:
         for element in generic_dict:
-            table = PrettyTable(list(element.keys()))
-            entry = [list(element.values())]
+            table = PrettyTable(element.keys())
+            entry = [element.values()]
             table.add_row(entry[0])
         print(table)
     except KeyError:
@@ -429,13 +429,13 @@
             if not namespace.uuid:
                 vapp_uuid = vim.get_vappid(vdc=namespace.vcdvdc, vapp_name=namespace.vapp_name)
                 if vapp_uuid is None:
-                    print(("Can't find vapp by given name {}".format(namespace.vapp_name)))
+                    print("Can't find vapp by given name {}".format(namespace.vapp_name))
                     return
 
-            print(" namespace {}".format(namespace))
+            print " namespace {}".format(namespace)
             if vapp_dict is not None and namespace.osm:
                 vm_info_dict = vim.get_vminstance(vim_vm_uuid=vapp_uuid)
-                print(vm_info_dict)
+                print vm_info_dict
             if vapp_dict is not None and namespace.osm != True:
                 vapp_dict = vim.get_vapp(vdc_name=namespace.vcdvdc, vapp_name=vapp_uuid, isuuid=True)
                 print_vapp(vapp_dict=vapp_dict)
@@ -447,10 +447,10 @@
         # if request name based we need find UUID
         # TODO optimize it or move to external function
         if not namespace.uuid:
-            if 'networks' not in myorg:
-                print(("Network {} is undefined in vcloud director for org {} vdc {}".format(namespace.network_name,
+            if not myorg.has_key('networks'):
+                print("Network {} is undefined in vcloud director for org {} vdc {}".format(namespace.network_name,
                                                                                             vim.name,
-                                                                                            vim.tenant_name)))
+                                                                                            vim.tenant_name))
                 return
 
             my_org_net = myorg['networks']
@@ -459,7 +459,7 @@
                     network_uuid = network
                     break
 
-        print(print_network_details(network_dict=vim.get_vcd_network(network_uuid=network_uuid)))
+        print print_network_details(network_dict=vim.get_vcd_network(network_uuid=network_uuid))
 
 
 def create_actions(vim=None, action=None, namespace=None):
@@ -476,16 +476,16 @@
         logger.debug("Creating a network in vcloud director".format(namespace.network_name))
         network_uuid = vim.create_network(namespace.network_name)
         if network_uuid is not None:
-            print(("Crated new network {} and uuid: {}".format(namespace.network_name, network_uuid)))
+            print ("Crated new network {} and uuid: {}".format(namespace.network_name, network_uuid))
         else:
-            print(("Failed create a new network {}".format(namespace.network_name)))
+            print ("Failed create a new network {}".format(namespace.network_name))
     elif action == 'vdc' or namespace.action == 'vdc':
         logger.debug("Creating a new vdc in vcloud director.".format(namespace.vdc_name))
         vdc_uuid = vim.create_vdc(namespace.vdc_name)
         if vdc_uuid is not None:
-            print(("Crated new vdc {} and uuid: {}".format(namespace.vdc_name, vdc_uuid)))
+            print ("Crated new vdc {} and uuid: {}".format(namespace.vdc_name, vdc_uuid))
         else:
-            print(("Failed create a new vdc {}".format(namespace.vdc_name)))
+            print ("Failed create a new vdc {}".format(namespace.vdc_name))
     else:
         return None
 
@@ -518,11 +518,11 @@
     try:
         catalog_uuid = vim.get_image_id_from_path(path=image_file, progress=True)
         if catalog_uuid is not None and validate_uuid4(catalog_uuid):
-            print(("Image uploaded and uuid {}".format(catalog_uuid)))
+            print("Image uploaded and uuid {}".format(catalog_uuid))
             return True
     except vimconn.vimconnException as upload_exception:
-        print(("Failed uploaded {} image".format(image_file)))
-        print(("Error Reason: {}".format(upload_exception.message)))
+        print("Failed uploaded {} image".format(image_file))
+        print("Error Reason: {}".format(upload_exception.message))
     return False
 
 
@@ -552,22 +552,22 @@
             if vim_catalog is None:
                 return None
 
-        print((" Booting {} image id {} ".format(vm_name, vim_catalog)))
+        print (" Booting {} image id {} ".format(vm_name, vim_catalog))
         vm_uuid = vim.new_vminstance(name=vm_name, image_id=vim_catalog)
         if vm_uuid is not None and validate_uuid4(vm_uuid):
-            print(("Image booted and vm uuid {}".format(vm_uuid)))
+            print("Image booted and vm uuid {}".format(vm_uuid))
             vapp_dict = vim.get_vapp(vdc_name=namespace.vcdvdc, vapp_name=vm_uuid, isuuid=True)
             if vapp_dict is not None:
                 print_vapp(vapp_dict=vapp_dict)
         return True
     except vimconn.vimconnNotFoundException as notFound:
-        print(("Failed boot {} image".format(image_name)))
-        print((notFound.message))
+        print("Failed boot {} image".format(image_name))
+        print(notFound.message)
     except vimconn.vimconnException as vimconError:
-        print(("Failed boot {} image".format(image_name)))
-        print((vimconError.message))
+        print("Failed boot {} image".format(image_name))
+        print(vimconError.message)
     except:
-        print(("Failed boot {} image".format(image_name)))
+        print("Failed boot {} image".format(image_name))
 
 
         return False
@@ -610,7 +610,7 @@
 
     if namespace.vcdvdc is None:
         while True:
-            vcduser = eval(input("Enter vcd username: "))
+            vcduser = input("Enter vcd username: ")
             if vcduser is not None and len(vcduser) > 0:
                 break
     else:
@@ -618,7 +618,7 @@
 
     if namespace.vcdpassword is None:
         while True:
-            vcdpasword = eval(input("Please enter vcd password: "))
+            vcdpasword = input("Please enter vcd password: ")
             if vcdpasword is not None and len(vcdpasword) > 0:
                 break
     else:
@@ -626,7 +626,7 @@
 
     if namespace.vcdhost is None:
         while True:
-            vcdhost = eval(input("Please enter vcd host name or ip: "))
+            vcdhost = input("Please enter vcd host name or ip: ")
             if vcdhost is not None and len(vcdhost) > 0:
                 break
     else:
@@ -634,7 +634,7 @@
 
     if namespace.vcdorg is None:
         while True:
-            vcdorg = eval(input("Please enter vcd organization name: "))
+            vcdorg = input("Please enter vcd organization name: ")
             if vcdorg is not None and len(vcdorg) > 0:
                 break
     else:
@@ -796,7 +796,7 @@
 
     namespace = parser.parse_args()
     # put command_line args to mapping
-    command_line_args = {k: v for k, v in list(vars(namespace).items()) if v}
+    command_line_args = {k: v for k, v in vars(namespace).items() if v}
 
     d = defaults.copy()
     d.update(os.environ)
diff --git a/requirements.txt b/requirements.txt
index 0d6c432..9c558e3 100644
--- a/requirements.txt
+++ b/requirements.txt
@@ -1,20 +1 @@
-PyYAML
-bottle
-MySQL-python
-jsonschema
-paramiko
-argcomplete
-requests
-logutils
-python-openstackclient
-python-novaclient
-python-keystoneclient
-python-glanceclient
-python-neutronclient
-python-cinderclient
-pyvcloud
-pyvmomi
-progressbar
-prettytable
-boto
-
+.
diff --git a/setup.py b/setup.py
index 4fa3273..030dd2d 100755
--- a/setup.py
+++ b/setup.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 
 #from distutils.core import setup
 #from distutils.command.install_data import install_data
@@ -19,6 +19,7 @@
     "bottle",
     #"mysqlclient",
     #"MySQLdb",
+    "mysqlclient",
     "jsonschema",
     "paramiko",
     "argcomplete",
@@ -38,6 +39,16 @@
     #"lib_osm_openvim",
     #"osm_im",
     "pycrypto",
+    "bcrypt",
+    "netaddr",
+    "pyparsing",
+    "iso8601",
+    "debtcollector",
+    "monotonic",
+    "stevedore",
+    "positional",
+    # vmware dependencies
+    "progressbar2",
 ]
 
 setup(name=_name,
@@ -66,4 +77,3 @@
       setup_requires=['setuptools-version-command'],
       #test_suite='nose.collector',
       )
-
diff --git a/tox.ini b/tox.ini
index 025f4a0..6fd781f 100644
--- a/tox.ini
+++ b/tox.ini
@@ -1,6 +1,6 @@
 [tox]
 #envlist = py27,py3
-envlist = py27
+envlist = py3
 toxworkdir={homedir}/.tox
 
 [testenv]
@@ -9,14 +9,14 @@
 commands=nosetests
 
 [testenv:flake8]
-basepython = python
+basepython = python3
 deps = flake8
 commands =
     flake8 setup.py
 
 [testenv:build]
-basepython = python
+basepython = python3
 deps = stdeb
        setuptools-version-command
-commands = python setup.py --command-packages=stdeb.command bdist_deb
+commands = python3 setup.py --command-packages=stdeb.command bdist_deb
     
