logger.info('NSD(%s) has been downloaded.' % nsd_info_id)
         return read(local_file_path, start, end)
 
-    def parse_nsd_and_save(self, nsd_info_id, local_file_name, isETSI=True):
+    def parse_nsd_and_save(self, nsd_info_id, local_file_name):
         logger.info('Start to process NSD(%s)...' % nsd_info_id)
         ns_pkgs = NSPackageModel.objects.filter(nsPackageId=nsd_info_id)
         ns_pkgs.update(onboardingState=PKG_STATUS.PROCESSING)
 
-        nsd_json = toscaparser.parse_nsd(local_file_name, isETSI)
+        nsd_json = toscaparser.parse_nsd(local_file_name)
         logger.debug("%s", nsd_json)
         nsd = json.JSONDecoder().decode(nsd_json)
 
 
 from catalog.pub.msapi import sdc
 from catalog.pub.utils import toscaparser
 from catalog.packages.biz.ns_descriptor import NsDescriptor
+from catalog.pub.utils import fileutil
 
 logger = logging.getLogger(__name__)
 
         local_path = os.path.join(CATALOG_ROOT_PATH, csar_id)
         csar_name = "%s.csar" % artifact.get("name", csar_id)
         local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name)
+        if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"):
+            artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/ns.csar")
+            if os.path.exists(artifact_vnf_file):
+                local_file_name = artifact_vnf_file
 
         data = {
             'userDefinedData': ""
         }
         nsd = NsDescriptor()
         nsd.create(data, csar_id)
-        nsd.parse_nsd_and_save(csar_id, local_file_name, False)
+        nsd.parse_nsd_and_save(csar_id, local_file_name)
         return [0, "CSAR(%s) distributed successfully." % csar_id]
 
     def delete_csar(self, csar_id):
 
         local_path = os.path.join(CATALOG_ROOT_PATH, self.csar_id)
         csar_name = "%s.csar" % artifact.get("name", self.csar_id)
         local_file_name = sdc.download_artifacts(artifact["toscaModelURL"], local_path, csar_name)
+        if local_file_name.endswith(".csar") or local_file_name.endswith(".zip"):
+            artifact_vnf_file = fileutil.unzip_file(local_file_name, local_path, "Artifacts/Deployment/OTHER/vnf.csar")
+            if os.path.exists(artifact_vnf_file):
+                local_file_name = artifact_vnf_file
 
         vnfd_json = toscaparser.parse_vnfd(local_file_name)
         vnfd = json.JSONDecoder().decode(vnfd_json)
 
-        nfd_id = vnfd["metadata"]["id"]
-        if VnfPackageModel.objects.filter(vnfdId=nfd_id):
-            raise CatalogException("NFD(%s) already exists." % nfd_id)
+        if not vnfd.get("vnf"):
+            raise CatalogException("VNF propeties and metadata in VNF Package(id=%s) are empty." % self.csar_id)
 
+        vnfd_id = vnfd["vnf"]["properties"].get("descriptor_id", "")
+        if VnfPackageModel.objects.filter(vnfdId=vnfd_id):
+            logger.error("VNF package(%s) already exists.", vnfd_id)
+            raise CatalogException("VNF package(%s) already exists." % vnfd_id)
         JobUtil.add_job_status(self.job_id, 30, "Save CSAR(%s) to database." % self.csar_id)
-
-        vnfd_ver = vnfd["metadata"].get("vnfd_version")
-        if not vnfd_ver:
-            vnfd_ver = vnfd["metadata"].get("vnfdVersion", "undefined")
+        vnfd_ver = vnfd["vnf"]["properties"].get("descriptor_verison", "")
+        vnf_provider = vnfd["vnf"]["properties"].get("provider", "")
+        vnf_software_version = vnfd["vnf"]["properties"].get("software_version", "")
         VnfPackageModel(
             vnfPackageId=self.csar_id,
-            vnfdId=nfd_id,
-            vnfVendor=vnfd["metadata"].get("vendor", "undefined"),
+            vnfdId=vnfd_id,
+            vnfVendor=vnf_provider,
             vnfdVersion=vnfd_ver,
-            vnfSoftwareVersion=vnfd["metadata"].get("version", "undefined"),
+            vnfSoftwareVersion=vnf_software_version,
             vnfdModel=vnfd_json,
             localFilePath=local_file_name,
             vnfPackageUri=csar_name
         ).save()
-
         JobUtil.add_job_status(self.job_id, 100, "CSAR(%s) distribute successfully." % self.csar_id)
 
     def rollback_distribute(self):
             pkg_info["csarName"] = nf_pkg[0].vnfPackageUri
             pkg_info["vnfdModel"] = nf_pkg[0].vnfdModel
             pkg_info["downloadUrl"] = "http://%s:%s/%s/%s/%s" % (
-                MSB_SERVICE_IP,
+                MSB_SERVICE_IP,  # REG_TO_MSB_REG_PARAM[0]["nodes"][0]["ip"],
                 REG_TO_MSB_REG_PARAM[0]["nodes"][0]["port"],
                 CATALOG_URL_PATH,
                 csar_id,
 
         if other_pkg and other_pkg[0].vnfPackageId != vnf_pkg_id:
             logger.error("VNF package(%s,%s) already exists.", other_pkg[0].vnfPackageId, vnfd_id)
             raise CatalogException("VNF package(%s) already exists." % vnfd_id)
-        vnf_provider = vnfd["vnf"].get("provider", "")
+        vnf_provider = vnfd["vnf"]["properties"].get("provider", "")
         vnfd_ver = vnfd["vnf"]["properties"].get("descriptor_verison", "")
         vnf_software_version = vnfd["vnf"]["properties"].get("software_version", "")
         vnfd_product_name = vnfd["vnf"]["properties"].get("product_name", "")
 
                 "vnfProductInfoDescription": "hss",
                 "vnfdVersion": "1.0.0",
                 "vnfProductInfoName": "hss"
+            },
+            "vnf": {
+                "properties": {
+                    "descriptor_id": "zte-hss-1.0",
+                    "descriptor_verison": "1.0.0",
+                    "software_version": "1.0.0",
+                    "provider": "zte"
+                },
+                "metadata": {
+                }
             }
         }
 
                            vim_ids=["1"],
                            lab_vim_id="",
                            job_id="2").run()
-        self.assert_job_result("2", 255, "NFD(zte-hss-1.0) already exists.")
+        self.assert_job_result("2", 255, "VNF package(zte-hss-1.0) already exists.")
 
     @mock.patch.object(restcall, 'call_req')
     @mock.patch.object(sdc, 'download_artifacts')
 
 import logging
 import traceback
 import urllib2
+import zipfile
+
 
 logger = logging.getLogger(__name__)
 
         logger.error(traceback.format_exc())
         logger.error("Failed to download %s to %s.", url, local_file_name)
     return is_download_ok, local_file_name
+
+
+def unzip_file(zip_src, dst_dir, csar_path):
+    if os.path.exists(zip_src):
+        fz = zipfile.ZipFile(zip_src, 'r')
+        for file in fz.namelist():
+            fz.extract(file, dst_dir)
+        return os.path.join(dst_dir, csar_path)
+    else:
+        return ""