diff --git a/osmclient/sol005/nsd.py b/osmclient/sol005/nsd.py
index 9aca930..59c6d29 100644
--- a/osmclient/sol005/nsd.py
+++ b/osmclient/sol005/nsd.py
@@ -26,7 +26,6 @@
 from os.path import basename
 import logging
 import os.path
-#from os import stat
 
 
 class Nsd(object):
@@ -40,7 +39,6 @@
         self._apiResource = '/ns_descriptors'
         self._apiBase = '{}{}{}'.format(self._apiName,
                                         self._apiVersion, self._apiResource)
-        #self._apiBase='/nsds'
 
     def list(self, filter=None):
         self._logger.debug("")
@@ -49,7 +47,7 @@
         if filter:
             filter_string = '?{}'.format(filter)
         _, resp = self._http.get2_cmd('{}{}'.format(self._apiBase, filter_string))
-        #print(yaml.safe_dump(resp))
+
         if resp:
             return json.loads(resp)
         return list()
@@ -75,7 +73,6 @@
             # It is redundant, since the previous one already gets the whole nsdinfo
             # The only difference is that a different primitive is exercised
             _, resp = self._http.get2_cmd('{}/{}'.format(self._apiBase, nsd['_id']))
-            #print(yaml.safe_dump(resp))
             if resp:
                 return json.loads(resp)
         except NotFound:
@@ -89,19 +86,11 @@
         headers = self._client._headers
         headers['Accept'] = 'application/binary'
         http_code, resp = self._http.get2_cmd('{}/{}/{}'.format(self._apiBase, nsd['_id'], thing))
-        #print('HTTP CODE: {}'.format(http_code))
-        #print('RESP: {}'.format(resp))
-        #if http_code in (200, 201, 202, 204):
+
         if resp:
-            #store in a file
             return json.loads(resp)
         else:
             msg = resp or ""
-        #    if resp:
-        #        try:
-        #            msg = json.loads(resp)
-        #        except ValueError:
-        #            msg = resp
             raise ClientException("failed to get {} from {} - {}".format(thing, name, msg))
 
     def get_descriptor(self, name, filename):
@@ -123,55 +112,45 @@
         if force:
             querystring = '?FORCE=True'
         http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase,
-                                         nsd['_id'], querystring))
-        #print('HTTP CODE: {}'.format(http_code))
-        #print('RESP: {}'.format(resp))
+                                                                 nsd['_id'], querystring))
+
         if http_code == 202:
             print('Deletion in progress')
         elif http_code == 204:
             print('Deleted')
         else:
             msg = resp or ""
-            # if resp:
-            #     try:
-            #         msg = json.loads(resp)
-            #     except ValueError:
-            #         msg = resp
             raise ClientException("failed to delete nsd {} - {}".format(name, msg))
 
     def create(self, filename, overwrite=None, update_endpoint=None, skip_charm_build=False):
         self._logger.debug("")
         if os.path.isdir(filename):
             filename = filename.rstrip('/')
-            filename = self._client.package_tool.build(filename, skip_validation=False, skip_charm_build=skip_charm_build)
+            filename = self._client.package_tool.build(filename, skip_validation=False,
+                                                       skip_charm_build=skip_charm_build)
             self.create(filename, overwrite=overwrite, update_endpoint=update_endpoint)
         else:
             self._client.get_token()
             mime_type = magic.from_file(filename, mime=True)
             if mime_type is None:
                 raise ClientException(
-                        "Unexpected MIME type for file {}: MIME type {}".format(
-                             filename, mime_type)
-                        )
-            headers= self._client._headers
+                    "Unexpected MIME type for file {}: MIME type {}".format(
+                        filename, mime_type)
+                )
+            headers = self._client._headers
             headers['Content-Filename'] = basename(filename)
             if mime_type in ['application/yaml', 'text/plain', 'application/json']:
                 headers['Content-Type'] = 'text/plain'
             elif mime_type in ['application/gzip', 'application/x-gzip']:
                 headers['Content-Type'] = 'application/gzip'
-                #headers['Content-Type'] = 'application/binary'
-                # Next three lines are to be removed in next version
-                #headers['Content-Filename'] = basename(filename)
-                #file_size = stat(filename).st_size
-                #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
             else:
                 raise ClientException(
-                     "Unexpected MIME type for file {}: MIME type {}".format(
-                         filename, mime_type)
-                  )
+                    "Unexpected MIME type for file {}: MIME type {}".format(
+                        filename, mime_type)
+                )
             headers["Content-File-MD5"] = utils.md5(filename)
-            http_header = ['{}: {}'.format(key,val)
-                          for (key,val) in list(headers.items())]
+            http_header = ['{}: {}'.format(key, val)
+                           for (key, val) in list(headers.items())]
             self._http.set_http_header(http_header)
             if update_endpoint:
                 http_code, resp = self._http.put_cmd(endpoint=update_endpoint, filename=filename)
@@ -182,10 +161,9 @@
                 self._apiResource = '/ns_descriptors_content'
                 self._apiBase = '{}{}{}'.format(self._apiName,
                                                 self._apiVersion, self._apiResource)
-                endpoint = '{}{}'.format(self._apiBase,ow_string)
+                endpoint = '{}{}'.format(self._apiBase, ow_string)
                 http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
-            #print('HTTP CODE: {}'.format(http_code))
-            #print('RESP: {}'.format(resp))
+
             if http_code in (200, 201, 202):
                 if resp:
                     resp = json.loads(resp)
@@ -194,18 +172,9 @@
                 print(resp['id'])
             elif http_code == 204:
                 print('Updated')
-            # else:
-            #     msg = "Error {}".format(http_code)
-            #     if resp:
-            #         try:
-            #             msg = "{} - {}".format(msg, json.loads(resp))
-            #         except ValueError:
-            #             msg = "{} - {}".format(msg, resp)
-            #     raise ClientException("failed to create/update nsd - {}".format(msg))
 
     def update(self, name, filename):
         self._logger.debug("")
         nsd = self.get(name)
         endpoint = '{}/{}/nsd_content'.format(self._apiBase, nsd['_id'])
         self.create(filename=filename, update_endpoint=endpoint)
-
diff --git a/osmclient/sol005/vnfd.py b/osmclient/sol005/vnfd.py
index ac44495..159205a 100644
--- a/osmclient/sol005/vnfd.py
+++ b/osmclient/sol005/vnfd.py
@@ -43,7 +43,6 @@
         self._apiResource = '/vnf_packages'
         self._apiBase = '{}{}{}'.format(self._apiName,
                                         self._apiVersion, self._apiResource)
-        #self._apiBase='/vnfds'
 
     def list(self, filter=None):
         self._logger.debug("")
@@ -51,7 +50,7 @@
         filter_string = ''
         if filter:
             filter_string = '?{}'.format(filter)
-        _, resp = self._http.get2_cmd('{}{}'.format(self._apiBase,filter_string))
+        _, resp = self._http.get2_cmd('{}{}'.format(self._apiBase, filter_string))
         if resp:
             return json.loads(resp)
         return list()
@@ -76,7 +75,6 @@
         # The only difference is that a different primitive is exercised
         try:
             _, resp = self._http.get2_cmd('{}/{}'.format(self._apiBase, vnfd['_id']))
-            #print(yaml.safe_dump(resp))
             if resp:
                 return json.loads(resp)
         except NotFound:
@@ -89,20 +87,9 @@
         headers = self._client._headers
         headers['Accept'] = 'application/binary'
         http_code, resp = self._http.get2_cmd('{}/{}/{}'.format(self._apiBase, vnfd['_id'], thing))
-        #print('HTTP CODE: {}'.format(http_code))
-        #print('RESP: {}'.format(resp))
-        #if http_code in (200, 201, 202, 204):
+
         if resp:
-            #store in a file
             return json.loads(resp)
-        #else:
-        #    msg = ""
-        #    if resp:
-        #        try:
-        #            msg = json.loads(resp)
-        #        except ValueError:
-        #            msg = resp
-        #    raise ClientException("failed to get {} from {} - {}".format(thing, name, msg))
 
     def get_descriptor(self, name, filename):
         self._logger.debug("")
@@ -124,20 +111,14 @@
         if force:
             querystring = '?FORCE=True'
         http_code, resp = self._http.delete_cmd('{}/{}{}'.format(self._apiBase,
-                                         vnfd['_id'], querystring))
-        #print('HTTP CODE: {}'.format(http_code))
-        #print('RESP: {}'.format(resp))
+                                                                 vnfd['_id'], querystring))
+
         if http_code == 202:
             print('Deletion in progress')
         elif http_code == 204:
             print('Deleted')
         else:
             msg = resp or ""
-            # if resp:
-            #     try:
-            #         msg = json.loads(resp)
-            #     except ValueError:
-            #         msg = resp
             raise ClientException("failed to delete vnfd {} - {}".format(name, msg))
 
     def create(self, filename, overwrite=None, update_endpoint=None, skip_charm_build=False,
@@ -145,7 +126,8 @@
         self._logger.debug("")
         if os.path.isdir(filename):
             filename = filename.rstrip('/')
-            filename = self._client.package_tool.build(filename, skip_validation=False, skip_charm_build=skip_charm_build)
+            filename = self._client.package_tool.build(filename, skip_validation=False,
+                                                       skip_charm_build=skip_charm_build)
             print('Uploading package {}'.format(filename))
             self.create(filename, overwrite=overwrite, update_endpoint=update_endpoint,
                         override_epa=override_epa, override_nonepa=override_nonepa,
@@ -164,16 +146,11 @@
                 headers['Content-Type'] = 'text/plain'
             elif mime_type in ['application/gzip', 'application/x-gzip']:
                 headers['Content-Type'] = 'application/gzip'
-                #headers['Content-Type'] = 'application/binary'
-                # Next three lines are to be removed in next version
-                #headers['Content-Filename'] = basename(filename)
-                #file_size = stat(filename).st_size
-                #headers['Content-Range'] = 'bytes 0-{}/{}'.format(file_size - 1, file_size)
             else:
                 raise ClientException(
-                         "Unexpected MIME type for file {}: MIME type {}".format(
-                             filename, mime_type)
-                      )
+                    "Unexpected MIME type for file {}: MIME type {}".format(
+                        filename, mime_type)
+                )
             special_ow_string = ''
             if override_epa or override_nonepa or override_paravirt:
                 # If override for EPA, non-EPA or paravirt is required, get the descriptor data 
@@ -197,16 +174,16 @@
                     tar_object.close()
                 if not descriptor_data:
                     raise ClientException('Descriptor could not be read')
-                desc_type, vnfd = validation_im.yaml_validation(self, descriptor_data)
-                validation_im.pyangbind_validation(self, desc_type, vnfd)
+                desc_type, vnfd = validation_im().yaml_validation(descriptor_data)
+                validation_im().pyangbind_validation(desc_type, vnfd)
                 vnfd = yaml.safe_load(descriptor_data)
                 vdu_list = []
                 for k in vnfd:
                     # Get only the first descriptor in case there are many in the yaml file
                     # k can be vnfd:vnfd-catalog or vnfd-catalog. This check is skipped
                     first_vnfd = vnfd[k]['vnfd'][0]
-                    vdu_list = first_vnfd.get('vdu',[])
-                    break;
+                    vdu_list = first_vnfd.get('vdu', [])
+                    break
                 for vdu_number, vdu in enumerate(vdu_list):
                     if override_epa:
                         guest_epa = {}
@@ -216,21 +193,20 @@
                         guest_epa["numa-node-policy"] = {}
                         guest_epa["numa-node-policy"]["node-cnt"] = 1
                         guest_epa["numa-node-policy"]["mem-policy"] = "STRICT"
-                        #guest_epa["numa-node-policy"]["node"] = []
-                        #guest_epa["numa-node-policy"]["node"].append({"id": "0", "paired-threads": {"num-paired-threads": 1} })
-                        special_ow_string = "{}vdu.{}.guest-epa={};".format(special_ow_string,vdu_number,quote(yaml.safe_dump(guest_epa)))
+                        special_ow_string = "{}vdu.{}.guest-epa={};".format(special_ow_string, vdu_number,
+                                                                            quote(yaml.safe_dump(guest_epa)))
                         headers['Query-String-Format'] = 'yaml'
                     if override_nonepa:
-                        special_ow_string = "{}vdu.{}.guest-epa=;".format(special_ow_string,vdu_number)
+                        special_ow_string = "{}vdu.{}.guest-epa=;".format(special_ow_string, vdu_number)
                     if override_paravirt:
                         for iface_number in range(len(vdu['interface'])):
                             special_ow_string = "{}vdu.{}.interface.{}.virtual-interface.type=PARAVIRT;".format(
-                                                special_ow_string,vdu_number,iface_number)
+                                special_ow_string, vdu_number, iface_number)
                 special_ow_string = special_ow_string.rstrip(";")
 
             headers["Content-File-MD5"] = utils.md5(filename)
-            http_header = ['{}: {}'.format(key,val)
-                             for (key,val) in list(headers.items())]
+            http_header = ['{}: {}'.format(key, val)
+                           for (key, val) in list(headers.items())]
             self._http.set_http_header(http_header)
             if update_endpoint:
                 http_code, resp = self._http.put_cmd(endpoint=update_endpoint, filename=filename)
@@ -238,7 +214,7 @@
                 ow_string = ''
                 if special_ow_string:
                     if overwrite:
-                        overwrite = "{};{}".format(overwrite,special_ow_string)
+                        overwrite = "{};{}".format(overwrite, special_ow_string)
                     else:
                         overwrite = special_ow_string
                 if overwrite:
@@ -246,26 +222,17 @@
                 self._apiResource = '/vnf_packages_content'
                 self._apiBase = '{}{}{}'.format(self._apiName,
                                                 self._apiVersion, self._apiResource)
-                endpoint = '{}{}'.format(self._apiBase,ow_string)
+                endpoint = '{}{}'.format(self._apiBase, ow_string)
                 http_code, resp = self._http.post_cmd(endpoint=endpoint, filename=filename)
-            #print('HTTP CODE: {}'.format(http_code))
-            #print('RESP: {}'.format(resp))
+
             if http_code in (200, 201, 202):
                 if resp:
                     resp = json.loads(resp)
                 if not resp or 'id' not in resp:
-                     raise ClientException('unexpected response from server: {}'.format(resp))
+                    raise ClientException('unexpected response from server: {}'.format(resp))
                 print(resp['id'])
             elif http_code == 204:
                 print('Updated')
-            # else:
-            #     msg = "Error {}".format(http_code)
-            #     if resp:
-            #         try:
-            #             msg = "{} - {}".format(msg, json.loads(resp))
-            #         except ValueError:
-            #             msg = "{} - {}".format(msg, resp)
-            #     raise ClientException("failed to create/update vnfd - {}".format(msg))
 
     def update(self, name, filename):
         self._logger.debug("")
@@ -273,4 +240,3 @@
         vnfd = self.get(name)
         endpoint = '{}/{}/package_content'.format(self._apiBase, vnfd['_id'])
         self.create(filename=filename, update_endpoint=endpoint)
-
