diff --git a/vimconn_openvim.py b/vimconn_openvim.py
old mode 100755
new mode 100644
index 6dfd474..e253b4e
--- a/vimconn_openvim.py
+++ b/vimconn_openvim.py
@@ -306,9 +306,40 @@
 }
 
 class vimconnector(vimconn.vimconnector):
-    def __init__(self, uuid, name, tenant, url, url_admin=None, user=None, passwd=None,debug=True,config={}):
-        vimconn.vimconnector.__init__(self, uuid, name, tenant, url, url_admin, user, passwd, debug, config)
-    
+    def __init__(self, uuid, name, tenant_id, tenant_name, url, url_admin=None, user=None, passwd=None,debug=True,config={}):
+        vimconn.vimconnector.__init__(self, uuid, name, tenant_id, tenant_name, url, url_admin, user, passwd, debug, config)
+        self.tenant = None
+        self.headers_req = {'content-type': 'application/json'}
+        if tenant_id:
+            self.tenant = tenant_id
+
+    def __setitem__(self,index, value):
+        '''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)    
+
+    def _get_my_tenant(self):
+        '''Obtain uuid of my tenant from name
+        '''
+        if self.tenant:
+            return self.tenant
+
+        vim_response = requests.get(self.url+'/tenants?name='+ self.tenant_name, headers = self.headers_req)
+        if vim_response.status_code != 200:
+            raise vimconn.vimconnectorException ("_get_my_tenant response " + str(vim_response.status_code))
+        tenant_list = vim_response.json()["tenants"]
+        if len(tenant_list) == 0:
+            raise vimconn.vimconnectorException ("No tenant found for name '%s'" % str(self.tenant_name))
+        elif len(tenant_list) > 1:
+            raise vimconn.vimconnectorException ("More that one tenant found for name '%s'" % str(self.tenant_name))
+        self.tenant = tenant_list[0]["id"]
+        return self.tenant 
+
     def _format_jsonerror(self,http_response):
         try:
             data = http_response.json()
@@ -348,10 +379,9 @@
         '''Adds a new host to VIM'''
         '''Returns status code of the VIM response'''
         print "VIMConnector: Adding a new host"
-        headers_req = {'content-type': 'application/json'}
         payload_req = host_data
         try:
-            vim_response = requests.post(self.url_admin+'/hosts', headers = headers_req, data=payload_req)
+            vim_response = requests.post(self.url_admin+'/hosts', headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_host Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -381,10 +411,9 @@
         '''Adds a external port to VIM'''
         '''Returns the port identifier'''
         print "VIMConnector: Adding a new external port"
-        headers_req = {'content-type': 'application/json'}
         payload_req = port_data
         try:
-            vim_response = requests.post(self.url_admin+'/ports', headers = headers_req, data=payload_req)
+            vim_response = requests.post(self.url_admin+'/ports', headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_external_port Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -415,10 +444,9 @@
         '''Returns the network identifier'''
         print "VIMConnector: Adding external shared network to VIM (type " + net_type + "): "+ net_name
         
-        headers_req = {'content-type': 'application/json'}
         payload_req = '{"network":{"name": "' + net_name + '","shared":true,"type": "' + net_type + '"}}'
         try:
-            vim_response = requests.post(self.url+'/networks', headers = headers_req, data=payload_req)
+            vim_response = requests.post(self.url+'/networks', headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_external_network Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -449,7 +477,6 @@
         '''Returns status code of the VIM response'''
         print "VIMConnector: Connecting external port to network"
         
-        headers_req = {'content-type': 'application/json'}
         payload_req = '{"port":{"network_id":"' + network_id + '"}}'
         if admin:
             if self.url_admin==None:
@@ -458,7 +485,7 @@
         else:
             url= self.url
         try:
-            vim_response = requests.put(url +'/ports/'+port_id, headers = headers_req, data=payload_req)
+            vim_response = requests.put(url +'/ports/'+port_id, headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "connect_port_network Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -488,13 +515,12 @@
         '''Adds a new tenant to VIM'''
         '''Returns the tenant identifier'''
         print "VIMConnector: Adding a new tenant to VIM"
-        headers_req = {'content-type': 'application/json'}
         payload_dict = {"tenant": {"name":tenant_name,"description": tenant_description, "enabled": True}}
         payload_req = json.dumps(payload_dict)
         #print payload_req
 
         try:
-            vim_response = requests.post(self.url+'/tenants', headers = headers_req, data=payload_req)
+            vim_response = requests.post(self.url+'/tenants', headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_tenant Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -523,9 +549,8 @@
         '''Delete a tenant from VIM'''
         '''Returns the tenant identifier'''
         print "VIMConnector: Deleting  a  tenant from VIM"
-        headers_req = {'content-type': 'application/json'}
         try:
-            vim_response = requests.delete(self.url+'/tenants/'+tenant_id, headers = headers_req)
+            vim_response = requests.delete(self.url+'/tenants/'+tenant_id, headers = self.headers_req)
         except requests.exceptions.RequestException, e:
             print "delete_tenant Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -542,16 +567,19 @@
     def new_tenant_network(self,net_name,net_type,public=False, **vim_specific):
         '''Adds a tenant network to VIM'''
         '''Returns the network identifier'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "vim_specific", vim_specific
         if net_type=="bridge":
             net_type="bridge_data"
-        print "VIMConnector: Adding a new tenant network to VIM (tenant: " + self.tenant + ", type: " + net_type + "): "+ net_name
+        print "VIMConnector: Adding a new tenant network to VIM (tenant: " + str(self.tenant) + ", type: " + net_type + "): "+ net_name
 
-        headers_req = {'content-type': 'application/json'}
         payload_req = {"name": net_name, "type": net_type, "tenant_id": self.tenant, "shared": public}
         payload_req.update(vim_specific)
         try:
-            vim_response = requests.post(self.url+'/networks', headers = headers_req, data=json.dumps({"network": payload_req}) )
+            vim_response = requests.post(self.url+'/networks', headers = self.headers_req, data=json.dumps({"network": payload_req}) )
         except requests.exceptions.RequestException, e:
             print "new_tenant_network Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -591,10 +619,9 @@
             filterquery.append(str(k)+'='+str(v))
         if len(filterquery)>0:
             filterquery_text='?'+ '&'.join(filterquery)
-        headers_req = {'content-type': 'application/json'}
         try:
             print self.url+'/tenants'+filterquery_text
-            vim_response = requests.get(self.url+'/tenants'+filterquery_text, headers = headers_req)
+            vim_response = requests.get(self.url+'/tenants'+filterquery_text, headers = self.headers_req)
         except requests.exceptions.RequestException, e:
             print "get_tenant_list Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -624,6 +651,8 @@
             status: 'ACTIVE'
         Returns the network list of dictionaries
         '''
+        
+        filter_dict["tenant_id"] = self._get_my_tenant()
         print "VIMConnector.get_network_list: Getting tenant network from VIM (filter: " + str(filter_dict) + "): "
         filterquery=[]
         filterquery_text=''
@@ -631,10 +660,9 @@
             filterquery.append(str(k)+'='+str(v))
         if len(filterquery)>0:
             filterquery_text='?'+ '&'.join(filterquery)
-        headers_req = {'content-type': 'application/json'}
         try:
             print self.url+'/networks'+filterquery_text
-            vim_response = requests.get(self.url+'/networks'+filterquery_text, headers = headers_req)
+            vim_response = requests.get(self.url+'/networks'+filterquery_text, headers = self.headers_req)
         except requests.exceptions.RequestException, e:
             print "get_network_list Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -673,11 +701,14 @@
     def delete_tenant_network(self, net_id):
         '''Deletes a tenant network from VIM'''
         '''Returns the network identifier'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Deleting a new tenant network from VIM tenant: " + self.tenant + ", id: " + net_id
 
-        headers_req = {'content-type': 'application/json'}
         try:
-            vim_response = requests.delete(self.url+'/networks/'+net_id, headers=headers_req)
+            vim_response = requests.delete(self.url+'/networks/'+net_id, headers=self.headers_req)
         except requests.exceptions.RequestException, e:
             print "delete_tenant_network Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -703,13 +734,16 @@
         '''Obtain flavor details from the  VIM
             Returns the flavor dict details
         '''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Getting flavor from VIM"
         #print "VIM URL:",self.url
         #print "Tenant id:",self.tenant
         #print "Flavor:",flavor_data
-        headers_req = {'content-type': 'application/json'}
         try:
-            vim_response = requests.get(self.url+'/'+self.tenant+'/flavors/'+flavor_id, headers = headers_req)
+            vim_response = requests.get(self.url+'/'+self.tenant+'/flavors/'+flavor_id, headers = self.headers_req)
         except requests.exceptions.RequestException, e:
             print "get_tenant_flavor Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -739,14 +773,17 @@
     def new_tenant_flavor(self, flavor_data):
         '''Adds a tenant flavor to VIM'''
         '''Returns the flavor identifier'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Adding a new flavor to VIM"
         #print "VIM URL:",self.url
         #print "Tenant id:",self.tenant
         #print "Flavor:",flavor_data
-        headers_req = {'content-type': 'application/json'}
         payload_req = json.dumps({'flavor': flavor_data})
         try:
-            vim_response = requests.post(self.url+'/'+self.tenant+'/flavors', headers = headers_req, data=payload_req)
+            vim_response = requests.post(self.url+'/'+self.tenant+'/flavors', headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_tenant_flavor Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -776,11 +813,14 @@
     def delete_tenant_flavor(self,flavor_id):
         '''Deletes a tenant flavor from VIM'''
         '''Returns the HTTP response code and a message indicating details of the success or fail'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Deleting a flavor from VIM"
         print "VIM URL:",self.url
         print "Tenant id:",self.tenant
         print "Flavor id:",flavor_id
-        #headers_req = {'content-type': 'application/json'}
         #payload_req = flavor_data
         try:
             vim_response = requests.delete(self.url+'/'+self.tenant+'/flavors/'+flavor_id)
@@ -806,8 +846,11 @@
             200, image-id        if the image is created
             <0, message          if there is an error
         '''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Adding a new image to VIM", image_dict['location']
-        headers_req = {'content-type': 'application/json'}
         new_image_dict={'name': image_dict['name']}
         if 'description' in image_dict and image_dict['description'] != None:
             new_image_dict['description'] = image_dict['description']
@@ -818,7 +861,7 @@
         payload_req = json.dumps({"image":new_image_dict})
         url=self.url + '/' + self.tenant + '/images'
         try:
-            vim_response = requests.post(url, headers = headers_req, data=payload_req)
+            vim_response = requests.post(url, headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_tenant_image Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -847,8 +890,11 @@
     def delete_tenant_image(self, image_id):
         '''Deletes a tenant image from VIM'''
         '''Returns the HTTP response code and a message indicating details of the success or fail'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Deleting an image from VIM"
-        #headers_req = {'content-type': 'application/json'}
         #payload_req = flavor_data
         url=self.url + '/'+ self.tenant +'/images/'+image_id
         try:
@@ -871,11 +917,14 @@
     def new_tenant_vminstancefromJSON(self, vm_data):
         '''Adds a VM instance to VIM'''
         '''Returns the instance identifier'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Adding a new VM instance from JSON to VIM"
-        headers_req = {'content-type': 'application/json'}
         payload_req = vm_data
         try:
-            vim_response = requests.post(self.url+'/'+self.tenant+'/servers', headers = headers_req, data=payload_req)
+            vim_response = requests.post(self.url+'/'+self.tenant+'/servers', headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_tenant_vminstancefromJSON Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -919,8 +968,11 @@
         Returns >=0, the instance identifier
                 <0, error_text
         '''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Adding a new VM instance to VIM"
-        headers_req = {'content-type': 'application/json'}
         
 #         net_list = []
 #         for k,v in net_dict.items():
@@ -949,7 +1001,7 @@
         payload_req = json.dumps({"server": payload_dict})
         print self.url+'/'+self.tenant+'/servers'+payload_req
         try:
-            vim_response = requests.post(self.url+'/'+self.tenant+'/servers', headers = headers_req, data=payload_req)
+            vim_response = requests.post(self.url+'/'+self.tenant+'/servers', headers = self.headers_req, data=payload_req)
         except requests.exceptions.RequestException, e:
             print "new_tenant_vminstance Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -1007,13 +1059,16 @@
         
     def get_tenant_vminstance(self,vm_id):
         '''Returns the VM instance information from VIM'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Getting tenant VM instance information from VIM"
-        headers_req = {'content-type': 'application/json'}
         
         url = self.url+'/'+self.tenant+'/servers/'+vm_id
         print url
         try:
-            vim_response = requests.get(url, headers = headers_req)
+            vim_response = requests.get(url, headers = self.headers_req)
         except requests.exceptions.RequestException, e:
             print "get_tenant_vminstance Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -1038,11 +1093,14 @@
     def delete_tenant_vminstance(self, vm_id):
         '''Removes a VM instance from VIM'''
         '''Returns the instance identifier'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Delete a VM instance from VIM " + vm_id
-        headers_req = {'content-type': 'application/json'}
         
         try:
-            vim_response = requests.delete(self.url+'/'+self.tenant+'/servers/'+vm_id, headers = headers_req)
+            vim_response = requests.delete(self.url+'/'+self.tenant+'/servers/'+vm_id, headers = self.headers_req)
         except requests.exceptions.RequestException, e:
             print "delete_tenant_vminstance Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -1066,6 +1124,10 @@
                       <0 if error (foreseen)
             - error_msg: text with reference to possible errors
         '''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         #vms_refreshed = []
         #nets_refreshed = []
         vms_unrefreshed = []
@@ -1073,12 +1135,11 @@
         for vm_id in vmDict:
             vmDict[vm_id]={'error_msg':None, 'vim_info':None}
             print "VIMConnector refresh_tenant_vms and nets: Getting tenant VM instance information from VIM"
-            headers_req = {'content-type': 'application/json'}
         
             url = self.url+'/'+self.tenant+'/servers/'+ vm_id
             print url
             try:
-                vim_response = requests.get(url, headers = headers_req)
+                vim_response = requests.get(url, headers = self.headers_req)
             except requests.exceptions.RequestException, e:
                 print "VIMConnector refresh_tenant_elements. Exception: ", e.args
                 vmDict[vm_id]['status'] = "VIM_ERROR"
@@ -1102,7 +1163,7 @@
                         #get interfaces info
                         url2 = self.url+'/ports?device_id='+ vm_id
                         try:
-                            vim_response2 = requests.get(url2, headers = headers_req)
+                            vim_response2 = requests.get(url2, headers = self.headers_req)
                             if vim_response.status_code == 200:
                                 client_data = vim_response2.json()
                                 for port in client_data.get("ports"):
@@ -1148,7 +1209,6 @@
         for net_id in netDict:
             netDict[net_id] = {'error_msg':None, 'vim_info':None}
             print "VIMConnector refresh_tenant_vms_and_nets: Getting tenant network from VIM (tenant: " + str(self.tenant) + "): "
-            headers_req = {'content-type': 'application/json'}
             r,c = self.get_tenant_network(net_id)
             if r<0:
                 print "VIMconnector refresh_tenant_network. Error getting net_id '%s' status: %s" % (net_id, c)
@@ -1185,14 +1245,17 @@
     def action_tenant_vminstance(self, vm_id, action_dict):
         '''Send and action over a VM instance from VIM'''
         '''Returns the status'''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         print "VIMConnector: Action over VM instance from VIM " + vm_id
-        headers_req = {'content-type': 'application/json'}
         
         try:
             if "console" in action_dict:
                 return -vimconn.HTTP_Service_Unavailable, "getting console is not available at openvim"
             
-            vim_response = requests.post(self.url+'/'+self.tenant+'/servers/'+vm_id+"/action", headers = headers_req, data=json.dumps(action_dict) )
+            vim_response = requests.post(self.url+'/'+self.tenant+'/servers/'+vm_id+"/action", headers = self.headers_req, data=json.dumps(action_dict) )
         except requests.exceptions.RequestException, e:
             print "action_tenant_vminstance Exception: ", e.args
             return -vimconn.HTTP_Not_Found, str(e.args[0])
@@ -1358,6 +1421,10 @@
              1,image-id            if there is one image with that path
              <0,message            if there was an error (Image not found, error contacting VIM, more than 1 image with that path, etc.) 
         '''
+        try:
+            self._get_my_tenant()
+        except Exception as e:
+            return -vimconn.HTTP_Not_Found, str(e)
         url=self.url + '/' + self.tenant + '/images?path='+path
         try:
             vim_response = requests.get(url)
