diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/api/OnboardingClient.java b/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/api/OnboardingClient.java
new file mode 100644
index 0000000..34db17c
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/api/OnboardingClient.java
@@ -0,0 +1,53 @@
+/*
+ * -
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.client.onboarding.api;
+
+import fj.data.Either;
+import java.util.Map;
+import java.util.Optional;
+import org.openecomp.sdc.be.model.VendorSoftwareProduct;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+
+public interface OnboardingClient {
+
+    /**
+     * Finds the CSAR package of the latest version of a Vendor Software Product (VSP) from the onboarding repository.
+     *
+     * @param vspId  the VSP id
+     * @param userId the logged user id
+     * @return a Map containing the CSAR files <path, bytes> (left), or a StorageOperationStatus if an error occurs (right)
+     */
+    Either<Map<String, byte[]>, StorageOperationStatus> findLatestPackage(String vspId, String userId);
+
+    Either<Map<String, byte[]>, StorageOperationStatus> findPackage(String vspId, String versionId, String userId);
+
+    /**
+     * Finds the Vendor Software Product (VSP) from the onboarding repository.
+     *
+     * @param id        the VSP id
+     * @param versionId the VSP version
+     * @param userId    the logged user id
+     * @return a VSP representation if found, empty otherwise.
+     */
+    Optional<VendorSoftwareProduct> findVendorSoftwareProduct(String id, String versionId, String userId);
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/exception/OnboardingClientException.java b/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/exception/OnboardingClientException.java
new file mode 100644
index 0000000..4564fcc
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/exception/OnboardingClientException.java
@@ -0,0 +1,33 @@
+/*
+ * -
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.client.onboarding.exception;
+
+public class OnboardingClientException extends RuntimeException {
+
+    public OnboardingClientException(String message) {
+        super(message);
+    }
+
+    public OnboardingClientException(String message, Throwable cause) {
+        super(message, cause);
+    }
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/impl/OnboardingClientImpl.java b/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/impl/OnboardingClientImpl.java
new file mode 100644
index 0000000..1aa6cd8
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/client/onboarding/impl/OnboardingClientImpl.java
@@ -0,0 +1,187 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
+ * Modification Copyright (C) 2021 Nordix Foundation.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.client.onboarding.impl;
+
+import static javax.ws.rs.core.HttpHeaders.ACCEPT;
+import static javax.ws.rs.core.MediaType.APPLICATION_JSON;
+
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import fj.data.Either;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Properties;
+import javax.ws.rs.core.MediaType;
+import org.apache.http.HttpStatus;
+import org.openecomp.sdc.be.client.onboarding.api.OnboardingClient;
+import org.openecomp.sdc.be.client.onboarding.exception.OnboardingClientException;
+import org.openecomp.sdc.be.config.Configuration.OnboardingConfig;
+import org.openecomp.sdc.be.config.ConfigurationManager;
+import org.openecomp.sdc.be.model.VendorSoftwareProduct;
+import org.openecomp.sdc.be.model.dto.VendorSoftwareProductDto;
+import org.openecomp.sdc.be.model.mapper.VendorSoftwareProductMapper;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.common.api.Constants;
+import org.openecomp.sdc.common.http.client.api.HttpRequest;
+import org.openecomp.sdc.common.http.client.api.HttpResponse;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.common.zip.ZipUtils;
+
+@org.springframework.stereotype.Component("onboarding-client")
+public class OnboardingClientImpl implements OnboardingClient {
+
+    private static final Logger LOGGER = Logger.getLogger(OnboardingClientImpl.class);
+    private final Properties downloadCsarHeaders;
+
+    public OnboardingClientImpl() {
+        downloadCsarHeaders = new Properties();
+        downloadCsarHeaders.put(ACCEPT, MediaType.APPLICATION_OCTET_STREAM);
+    }
+
+    @Override
+    public Either<Map<String, byte[]>, StorageOperationStatus> findLatestPackage(final String vspId, final String userId) {
+        final String url = buildGetLatestPackageUrl(vspId);
+        return handleGetPackage(userId, url);
+    }
+
+    @Override
+    public Either<Map<String, byte[]>, StorageOperationStatus> findPackage(final String vspId, final String versionId, final String userId) {
+        final String url = buildGetCsarUrl(vspId, versionId);
+        return handleGetPackage(userId, url);
+    }
+
+    private Either<Map<String, byte[]>, StorageOperationStatus> handleGetPackage(final String userId, final String url) {
+        final Properties headers = buildDefaultHeader(userId);
+        downloadCsarHeaders.forEach(headers::put);
+        LOGGER.debug("Get VSP package URL is '{}'. Used headers '{}'", url, headers);
+        try {
+            final HttpResponse<byte[]> httpResponse = HttpRequest.getAsByteArray(url, headers);
+            LOGGER.debug("'{}' HTTP response status was '{}'", url, httpResponse.getStatusCode());
+            switch (httpResponse.getStatusCode()) {
+                case HttpStatus.SC_OK:
+                    byte[] data = httpResponse.getResponse();
+                    if (data != null && data.length > 0) {
+                        Map<String, byte[]> readZip = ZipUtils.readZip(data, false);
+                        return Either.left(readZip);
+                    }
+                    LOGGER.debug("Empty payload received from '{}'", url);
+                    return Either.right(StorageOperationStatus.NOT_FOUND);
+                case HttpStatus.SC_NOT_FOUND:
+                    return Either.right(StorageOperationStatus.CSAR_NOT_FOUND);
+                default:
+                    return Either.right(StorageOperationStatus.GENERAL_ERROR);
+            }
+        } catch (final Exception e) {
+            LOGGER.debug("Get VSP package request failed with exception", e);
+            return Either.right(StorageOperationStatus.GENERAL_ERROR);
+        }
+    }
+
+    @Override
+    public Optional<VendorSoftwareProduct> findVendorSoftwareProduct(final String id, final String versionId, final String userId) {
+        final Either<Map<String, byte[]>, StorageOperationStatus> csarEither = this.findPackage(id, versionId, userId);
+        if (csarEither.isRight()) {
+            final StorageOperationStatus operationStatus = csarEither.right().value();
+            if (operationStatus == StorageOperationStatus.CSAR_NOT_FOUND || operationStatus == StorageOperationStatus.NOT_FOUND) {
+                return Optional.empty();
+            }
+            var errorMsg = String.format("An error has occurred while retrieving the package with id '%s' and versionId '%s': '%s'",
+                id, versionId, operationStatus);
+            throw new OnboardingClientException(errorMsg);
+        }
+        final String url = buildGetVspUrl(id, versionId);
+        final Properties headers = buildDefaultHeader(userId);
+        headers.put(ACCEPT, APPLICATION_JSON);
+        LOGGER.debug("Find VSP built url '{}', with headers '{}'", url, headers);
+        final HttpResponse<String> httpResponse;
+        try {
+            httpResponse = HttpRequest.get(url, headers);
+        } catch (final Exception e) {
+            throw new OnboardingClientException("An error has occurred while retrieving the package", e);
+        }
+
+        if (httpResponse.getStatusCode() == HttpStatus.SC_NOT_FOUND) {
+            return Optional.empty();
+        }
+
+        if (httpResponse.getStatusCode() != HttpStatus.SC_OK) {
+            var errorMsg = String.format("An error has occurred while retrieving the package. Http status was %s", httpResponse.getStatusCode());
+            throw new OnboardingClientException(errorMsg);
+        }
+
+        final String responseData = httpResponse.getResponse();
+        LOGGER.debug("Find vsp response data: '{}'", responseData);
+
+        final VendorSoftwareProductDto vendorSoftwareProductDto;
+        try {
+            vendorSoftwareProductDto = new ObjectMapper().readValue(responseData, VendorSoftwareProductDto.class);
+        } catch (final JsonProcessingException e) {
+            throw new OnboardingClientException("Could not parse retrieve package response to VendorSoftwareProductDto.class.", e);
+        }
+        final Map<String, byte[]> csarFileMap = csarEither.left().value();
+        final var vendorSoftwareProduct = VendorSoftwareProductMapper.mapFrom(vendorSoftwareProductDto);
+        vendorSoftwareProduct.setFileMap(csarFileMap);
+        return Optional.of(vendorSoftwareProduct);
+    }
+
+    private Properties buildDefaultHeader(final String userId) {
+        final var headers = new Properties();
+        if (userId != null) {
+            headers.put(Constants.USER_ID_HEADER, userId);
+        }
+        return headers;
+    }
+
+    private String buildGetCsarUrl(final String vspId, final String versionId) {
+        final var onboardingConfig = getOnboardingConfig();
+        final var uri = String.format(onboardingConfig.getGetVspPackageUri(), vspId, versionId);
+        return buildBaseOnboardingUrl() + uri;
+    }
+
+    private String buildGetLatestPackageUrl(final String vspId) {
+        final var onboardingConfig = getOnboardingConfig();
+        final var uri = String.format(onboardingConfig.getGetLatestVspPackageUri(), vspId);
+        return buildBaseOnboardingUrl() + uri;
+    }
+
+    private String buildBaseOnboardingUrl() {
+        final var onboardingConfig = getOnboardingConfig();
+        final String protocol = onboardingConfig.getProtocol();
+        final String host = onboardingConfig.getHost();
+        final Integer port = onboardingConfig.getPort();
+        return String.format("%s://%s:%s", protocol, host, port);
+    }
+
+    private String buildGetVspUrl(final String id, final String versionId) {
+        final var onboardingConfig = getOnboardingConfig();
+        final String protocol = onboardingConfig.getProtocol();
+        final String host = onboardingConfig.getHost();
+        final Integer port = onboardingConfig.getPort();
+        final var uri = String.format(onboardingConfig.getGetVspUri(), id, versionId);
+        return String.format("%s://%s:%s%s", protocol, host, port, uri);
+    }
+
+    private OnboardingConfig getOnboardingConfig() {
+        return ConfigurationManager.getConfigurationManager().getConfiguration().getOnboarding();
+    }
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/config/CatalogModelSpringConfig.java b/catalog-model/src/main/java/org/openecomp/sdc/be/config/CatalogModelSpringConfig.java
index a4d049d..1991438 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/config/CatalogModelSpringConfig.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/config/CatalogModelSpringConfig.java
@@ -29,6 +29,7 @@
     // @formatter:off
     "org.openecomp.sdc.be.model.operations.impl",
     "org.openecomp.sdc.be.model.cache",
+    "org.openecomp.sdc.be.client",
     "org.openecomp.sdc.be.model.jsonjanusgraph.utils",
     "org.openecomp.sdc.be.model.jsonjanusgraph.operations",
     "org.openecomp.sdc.be.model.jsonjanusgraph.config",
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java
index 51623a5..0b54e0b 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java
@@ -66,70 +66,82 @@
     }
 
     public Boolean isAbstract() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).isAbstract();
+        return getResourceMetadataDataDefinition().isAbstract();
     }
 
     public void setAbstract(Boolean isAbstract) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setAbstract(isAbstract);
+        getResourceMetadataDataDefinition().setAbstract(isAbstract);
     }
 
     public String getCost() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).getCost();
+        return getResourceMetadataDataDefinition().getCost();
     }
 
     public void setCost(String cost) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setCost(cost);
+        getResourceMetadataDataDefinition().setCost(cost);
     }
 
     public String getLicenseType() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).getLicenseType();
+        return getResourceMetadataDataDefinition().getLicenseType();
     }
 
     public void setLicenseType(String licenseType) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setLicenseType(licenseType);
+        getResourceMetadataDataDefinition().setLicenseType(licenseType);
     }
 
     public String getToscaResourceName() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).getToscaResourceName();
+        return getResourceMetadataDataDefinition().getToscaResourceName();
     }
 
     public void setToscaResourceName(String toscaResourceName) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setToscaResourceName(toscaResourceName);
+        getResourceMetadataDataDefinition().setToscaResourceName(toscaResourceName);
     }
 
     public ResourceTypeEnum getResourceType() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).getResourceType();
+        return getResourceMetadataDataDefinition().getResourceType();
     }
 
     public void setResourceType(ResourceTypeEnum resourceType) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setResourceType(resourceType);
+        getResourceMetadataDataDefinition().setResourceType(resourceType);
     }
 
     public String getVendorName() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).getVendorName();
+        return getResourceMetadataDataDefinition().getVendorName();
     }
 
     public void setVendorName(String vendorName) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setVendorName(vendorName);
+        getResourceMetadataDataDefinition().setVendorName(vendorName);
     }
 
     public String getVendorRelease() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).getVendorRelease();
+        return getResourceMetadataDataDefinition().getVendorRelease();
     }
 
     public void setVendorRelease(String vendorRelease) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).setVendorRelease(vendorRelease);
+        getResourceMetadataDataDefinition().setVendorRelease(vendorRelease);
     }
 
     public String getResourceVendorModelNumber() {
-        return ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition()).getResourceVendorModelNumber();
+        return getResourceMetadataDataDefinition().getResourceVendorModelNumber();
     }
 
     public void setResourceVendorModelNumber(String resourceVendorModelNumber) {
-        ((ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition())
+        getResourceMetadataDataDefinition()
             .setResourceVendorModelNumber(resourceVendorModelNumber);
     }
 
+    private ResourceMetadataDataDefinition getResourceMetadataDataDefinition() {
+        return (ResourceMetadataDataDefinition) getComponentMetadataDefinition().getMetadataDataDefinition();
+    }
+
+    public String getCsarVersionId() {
+        return getResourceMetadataDataDefinition().getCsarVersionId();
+    }
+
+    public void setCsarVersionId(String csarVersionId) {
+        getResourceMetadataDataDefinition().setCsarVersionId(csarVersionId);
+    }
+
     @Override
     public String fetchGenericTypeToscaNameFromConfig() {
         return fetchToscaNameFromConfigBasedOnCategory().orElse(fetchToscaNameFromConfigBasedOnAssetType());
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/VendorSoftwareProduct.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/VendorSoftwareProduct.java
new file mode 100644
index 0000000..4dc4469
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/VendorSoftwareProduct.java
@@ -0,0 +1,47 @@
+/*
+ * -
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import java.util.List;
+import java.util.Map;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+@Data
+@NoArgsConstructor
+public class VendorSoftwareProduct {
+
+    private String name;
+    private String description;
+    private String category;
+    private String subCategory;
+    private String vendorName;
+    private String vendorId;
+    private List<String> modelList;
+    private String onboardingMethod;
+    private String id;
+    private String versionId;
+    private String onboardingOrigin;
+    private String networkPackageName;
+    private Map<String, byte[]> fileMap;
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/dto/VendorSoftwareProductDto.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/dto/VendorSoftwareProductDto.java
new file mode 100644
index 0000000..39e070c
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/dto/VendorSoftwareProductDto.java
@@ -0,0 +1,47 @@
+/*
+ * -
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model.dto;
+
+import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import java.util.List;
+import lombok.Data;
+
+@Data
+@JsonIgnoreProperties(ignoreUnknown = true)
+public class VendorSoftwareProductDto {
+
+    private String name;
+    private String description;
+    private String category;
+    private String subCategory;
+    private String vendorName;
+    private String vendorId;
+    private List<String> selectedModelList;
+    private String onboardingMethod;
+    private String id;
+    @JsonProperty("version")
+    private String versionId;
+    private String onboardingOrigin;
+    private String networkPackageName;
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/mapper/VendorSoftwareProductMapper.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/mapper/VendorSoftwareProductMapper.java
new file mode 100644
index 0000000..0cc4add
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/mapper/VendorSoftwareProductMapper.java
@@ -0,0 +1,54 @@
+/*
+ * -
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model.mapper;
+
+import java.util.ArrayList;
+import java.util.Objects;
+import org.openecomp.sdc.be.model.VendorSoftwareProduct;
+import org.openecomp.sdc.be.model.dto.VendorSoftwareProductDto;
+
+public class VendorSoftwareProductMapper {
+
+    private VendorSoftwareProductMapper() {
+    }
+
+    public static VendorSoftwareProduct mapFrom(final VendorSoftwareProductDto vendorSoftwareProductDto) {
+        Objects.requireNonNull(vendorSoftwareProductDto);
+        final var vendorSoftwareProduct = new VendorSoftwareProduct();
+        vendorSoftwareProduct.setName(vendorSoftwareProductDto.getName());
+        vendorSoftwareProduct.setDescription(vendorSoftwareProductDto.getDescription());
+        vendorSoftwareProduct.setCategory(vendorSoftwareProductDto.getCategory());
+        vendorSoftwareProduct.setSubCategory(vendorSoftwareProductDto.getSubCategory());
+        vendorSoftwareProduct.setVendorName(vendorSoftwareProductDto.getVendorName());
+        vendorSoftwareProduct.setVendorId(vendorSoftwareProductDto.getVendorId());
+        vendorSoftwareProduct.setModelList(
+            vendorSoftwareProductDto.getSelectedModelList() == null ? new ArrayList<>() : vendorSoftwareProductDto.getSelectedModelList());
+        vendorSoftwareProduct.setOnboardingMethod(vendorSoftwareProductDto.getOnboardingMethod());
+        vendorSoftwareProduct.setId(vendorSoftwareProductDto.getId());
+        vendorSoftwareProduct.setVersionId(vendorSoftwareProductDto.getVersionId());
+        vendorSoftwareProduct.setOnboardingOrigin(vendorSoftwareProductDto.getOnboardingOrigin());
+        vendorSoftwareProduct.setNetworkPackageName(vendorSoftwareProductDto.getNetworkPackageName());
+        return vendorSoftwareProduct;
+    }
+
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/CsarOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/CsarOperation.java
index 7b40aa0..bcdcb0e 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/CsarOperation.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/CsarOperation.java
@@ -19,80 +19,59 @@
  */
 package org.openecomp.sdc.be.model.operations.impl;
 
-import com.google.gson.Gson;
-import com.google.gson.JsonArray;
-import com.google.gson.JsonElement;
-import com.google.gson.JsonParser;
 import fj.data.Either;
 import java.util.Map;
-import javax.annotation.PostConstruct;
+import java.util.Optional;
+import org.apache.commons.collections4.MapUtils;
+import org.openecomp.sdc.be.client.onboarding.api.OnboardingClient;
 import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.VendorSoftwareProduct;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
 
 @org.springframework.stereotype.Component("csar-operation")
 public class CsarOperation {
 
-    private static final Logger log = Logger.getLogger(CsarOperation.class.getName());
-    @javax.annotation.Resource
-    private OnboardingClient onboardingClient;
+    private static final Logger LOGGER = Logger.getLogger(CsarOperation.class.getName());
 
-    @PostConstruct
-    public void init() {
+    private final OnboardingClient onboardingClient;
+
+    @Autowired
+    public CsarOperation(final OnboardingClient onboardingClient) {
+        this.onboardingClient = onboardingClient;
     }
 
     /**
-     * get csar from remote repository
+     * Finds the CSAR package of the latest version of a Vendor Software Product (VSP) from the onboarding repository.
      *
-     * @param csarUuid
-     * @return
+     * @param csarUuid the VSP id
+     * @param user     the logged user
+     * @return a Map containing the CSAR files <path, bytes> (left), or a StorageOperationStatus if an error occurs (right)
      */
-    public Either<Map<String, byte[]>, StorageOperationStatus> getCsar(String csarUuid, User user) {
-        Either<Map<String, byte[]>, StorageOperationStatus> result = onboardingClient.getCsar(csarUuid, user.getUserId());
+    public Either<Map<String, byte[]>, StorageOperationStatus> findVspLatestPackage(String csarUuid, User user) {
+        final Either<Map<String, byte[]>, StorageOperationStatus> result = onboardingClient.findLatestPackage(csarUuid, user.getUserId());
         if (result.isRight()) {
-            log.debug("Cannot find csar {}. Staus returned is {}", csarUuid, result.right().value());
-        } else {
-            Map<String, byte[]> values = result.left().value();
-            if (values != null) {
-                log.debug("The returned files are {}", values.keySet());
-            }
+            LOGGER.debug("Could not find VSP Package '{}'. Status '{}'", csarUuid, result.right().value());
+            return result;
+        }
+        if (MapUtils.isNotEmpty(result.left().value())) {
+            final Map<String, byte[]> values = result.left().value();
+            LOGGER.debug("The returned files are {}", values.keySet());
         }
         return result;
     }
 
-    @SuppressWarnings("unchecked")
-    public Either<String, StorageOperationStatus> getCsarLatestVersion(String csarUuid, User user) {
-        Either<String, StorageOperationStatus> result = onboardingClient.getPackages(user.getUserId());
-        if (result.isRight()) {
-            log.debug("Cannot find version for package with Id {}. Status returned is {}", csarUuid, result.right().value());
-        } else {
-            String latestVersion = null;
-            JsonElement root = new JsonParser().parse(result.left().value());
-            JsonArray csarsInfo = root.getAsJsonObject().get("results").getAsJsonArray();
-            for (JsonElement csarInfo : csarsInfo) {
-                Map<String, String> csarInfoMap = new Gson().fromJson(csarInfo, Map.class);
-                if (csarInfoMap.get("packageId").equals(csarUuid)) {
-                    String curVersion = csarInfoMap.get("version");
-                    if (latestVersion == null || isGreater(latestVersion, curVersion)) {
-                        latestVersion = curVersion;
-                    }
-                }
-            }
-            if (latestVersion != null) {
-                result = Either.left(latestVersion);
-            } else {
-                log.debug("The returned packages are {}. Failed to find latest version for package with Id {}. ", result.left().value(), csarUuid);
-                result = Either.right(StorageOperationStatus.NOT_FOUND);
-            }
-        }
-        return result;
+    /**
+     * Finds the Vendor Software Product (VSP) from the onboarding repository.
+     *
+     * @param id        the VSP id
+     * @param versionId the VSP version
+     * @param user      the logged user
+     * @return a VSP representation if found, empty otherwise.
+     */
+    public Optional<VendorSoftwareProduct> findVsp(final String id, final String versionId, final User user) {
+        return onboardingClient.findVendorSoftwareProduct(id, versionId, user.getUserId());
     }
 
-    private boolean isGreater(String latestVersion, String currentVersion) {
-        return Double.parseDouble(latestVersion) < Double.parseDouble(currentVersion);
-    }
-
-    public OnboardingClient getOnboardingClient() {
-        return onboardingClient;
-    }
 }
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/OnboardingClient.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/OnboardingClient.java
deleted file mode 100644
index 6032b4a..0000000
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/operations/impl/OnboardingClient.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * SDC
- * ================================================================================
- * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END=========================================================
- */
-package org.openecomp.sdc.be.model.operations.impl;
-
-import fj.data.Either;
-import java.util.Map;
-import java.util.Properties;
-import lombok.NoArgsConstructor;
-import org.apache.http.HttpStatus;
-import org.openecomp.sdc.be.config.Configuration.OnboardingConfig;
-import org.openecomp.sdc.be.config.ConfigurationManager;
-import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
-import org.openecomp.sdc.common.api.Constants;
-import org.openecomp.sdc.common.http.client.api.HttpRequest;
-import org.openecomp.sdc.common.http.client.api.HttpResponse;
-import org.openecomp.sdc.common.log.wrappers.Logger;
-import org.openecomp.sdc.common.zip.ZipUtils;
-
-@NoArgsConstructor
-@org.springframework.stereotype.Component("onboarding-client")
-public class OnboardingClient {
-
-    private static final Logger log = Logger.getLogger(OnboardingClient.class.getName());
-    private static Properties downloadCsarHeaders = new Properties();
-
-    static {
-        downloadCsarHeaders.put("Accept", "application/octet-stream");
-    }
-
-    public Either<Map<String, byte[]>, StorageOperationStatus> getCsar(String csarUuid, String userId) {
-        String url = buildDownloadCsarUrl() + "/" + csarUuid;
-        Properties headers = new Properties();
-        if (downloadCsarHeaders != null) {
-            downloadCsarHeaders.forEach(headers::put);
-        }
-        if (userId != null) {
-            headers.put(Constants.USER_ID_HEADER, userId);
-        }
-        log.debug("Url for downloading csar is {}. Headers are {}", url, headers);
-        try {
-            HttpResponse<byte[]> httpResponse = HttpRequest.getAsByteArray(url, headers);
-            log.debug("After fetching csar {}. Http return code is {}", csarUuid, httpResponse.getStatusCode());
-            switch (httpResponse.getStatusCode()) {
-                case HttpStatus.SC_OK:
-                    byte[] data = httpResponse.getResponse();
-                    if (data != null && data.length > 0) {
-                        Map<String, byte[]> readZip = ZipUtils.readZip(data, false);
-                        return Either.left(readZip);
-                    } else {
-                        log.debug("Data received from rest is null or empty");
-                        return Either.right(StorageOperationStatus.NOT_FOUND);
-                    }
-                case HttpStatus.SC_NOT_FOUND:
-                    return Either.right(StorageOperationStatus.CSAR_NOT_FOUND);
-                default:
-                    return Either.right(StorageOperationStatus.GENERAL_ERROR);
-            }
-        } catch (Exception e) {
-            log.debug("Request failed with exception", e);
-            return Either.right(StorageOperationStatus.GENERAL_ERROR);
-        }
-    }
-
-    public Either<String, StorageOperationStatus> getPackages(String userId) {
-        String url = buildDownloadCsarUrl();
-        Properties headers = new Properties();
-        headers.put("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8");
-
-        if (userId != null) {
-            headers.put(Constants.USER_ID_HEADER, userId);
-        }
-
-        log.debug("Url for downloading packages is {}. Headers are {}", url, headers);
-
-        try {
-            HttpResponse<String> httpResposne = HttpRequest.get(url, headers);
-            log.debug("After fetching packages. Http return code is {}", httpResposne.getStatusCode());
-
-            switch (httpResposne.getStatusCode()) {
-                case HttpStatus.SC_OK:
-                    String data = httpResposne.getResponse();
-                    return Either.left(data);
-
-                case HttpStatus.SC_NOT_FOUND:
-                    return Either.right(StorageOperationStatus.CSAR_NOT_FOUND);
-
-                default:
-                    return Either.right(StorageOperationStatus.GENERAL_ERROR);
-            }
-        } catch (Exception e) {
-            log.debug("Request failed with exception", e);
-            return Either.right(StorageOperationStatus.GENERAL_ERROR);
-        }
-    }
-
-    /**
-     * Build the url for download CSAR
-     * <p>
-     * E.g., http://0.0.0.0:8181/onboarding-api/v1.0/vendor-software-products/packages/
-     *
-     * @return
-     */
-    public String buildDownloadCsarUrl() {
-        OnboardingConfig onboardingConfig = ConfigurationManager.getConfigurationManager().getConfiguration().getOnboarding();
-        String protocol = onboardingConfig.getProtocol();
-        String host = onboardingConfig.getHost();
-        Integer port = onboardingConfig.getPort();
-        String uri = onboardingConfig.getDownloadCsarUri();
-        return protocol + "://" + host + ":" + port + uri;
-    }
-}
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/config/ModelOperationsSpringConfig.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/config/ModelOperationsSpringConfig.java
index 929441c..28e17b5 100644
--- a/catalog-model/src/test/java/org/openecomp/sdc/be/model/config/ModelOperationsSpringConfig.java
+++ b/catalog-model/src/test/java/org/openecomp/sdc/be/model/config/ModelOperationsSpringConfig.java
@@ -26,6 +26,7 @@
 
 @Configuration
 @ComponentScan({"org.openecomp.sdc.be.dao.cassandra", "org.openecomp.sdc.be.model.cache",
+    "org.openecomp.sdc.be.client",
     "org.openecomp.sdc.be.model.jsonjanusgraph.operations",
     "org.openecomp.sdc.be.model.jsonjanusgraph.utils",
     "org.openecomp.sdc.be.model.jsonjanusgraph.config",
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/mapper/VendorSoftwareProductMapperTest.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/mapper/VendorSoftwareProductMapperTest.java
new file mode 100644
index 0000000..92b4c82
--- /dev/null
+++ b/catalog-model/src/test/java/org/openecomp/sdc/be/model/mapper/VendorSoftwareProductMapperTest.java
@@ -0,0 +1,80 @@
+/*
+ * -
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model.mapper;
+
+import static org.junit.jupiter.api.Assertions.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.jupiter.api.Test;
+import org.openecomp.sdc.be.model.VendorSoftwareProduct;
+import org.openecomp.sdc.be.model.dto.VendorSoftwareProductDto;
+
+class VendorSoftwareProductMapperTest {
+
+    @Test
+    void mapFromSuccess() {
+        final var vendorSoftwareProductDto = new VendorSoftwareProductDto();
+        vendorSoftwareProductDto.setName("name");
+        vendorSoftwareProductDto.setDescription("description");
+        vendorSoftwareProductDto.setCategory("category");
+        vendorSoftwareProductDto.setSubCategory("subcategory");
+        vendorSoftwareProductDto.setVendorName("vendorName");
+        vendorSoftwareProductDto.setVendorId("vendorId");
+        vendorSoftwareProductDto.setSelectedModelList(List.of("model1", "model2"));
+        vendorSoftwareProductDto.setOnboardingMethod("onboardingMethod");
+        vendorSoftwareProductDto.setId("id");
+        vendorSoftwareProductDto.setVersionId("versionId");
+        vendorSoftwareProductDto.setOnboardingOrigin("onboardingOrigin");
+        vendorSoftwareProductDto.setNetworkPackageName("packageName");
+        final VendorSoftwareProduct vendorSoftwareProduct = VendorSoftwareProductMapper.mapFrom(vendorSoftwareProductDto);
+        assertVendorSoftwareProduct(vendorSoftwareProduct, vendorSoftwareProductDto);
+    }
+
+    @Test
+    void mapFromNullModelListShouldReturnEmptyModelList() {
+        final var vendorSoftwareProductDto = new VendorSoftwareProductDto();
+        vendorSoftwareProductDto.setSelectedModelList(null);
+        final VendorSoftwareProduct vendorSoftwareProduct = VendorSoftwareProductMapper.mapFrom(vendorSoftwareProductDto);
+        assertVendorSoftwareProduct(vendorSoftwareProduct, vendorSoftwareProductDto);
+    }
+
+    private void assertVendorSoftwareProduct(final VendorSoftwareProduct vendorSoftwareProduct,
+                                             final VendorSoftwareProductDto vendorSoftwareProductDto) {
+        assertEquals(vendorSoftwareProduct.getId(), vendorSoftwareProductDto.getId(), "id should be equals");
+        assertEquals(vendorSoftwareProduct.getName(), vendorSoftwareProductDto.getName(), "name should be equals");
+        assertEquals(vendorSoftwareProduct.getDescription(), vendorSoftwareProductDto.getDescription(), "description should be equals");
+        assertEquals(vendorSoftwareProduct.getCategory(), vendorSoftwareProductDto.getCategory(), "category should be equals");
+        assertEquals(vendorSoftwareProduct.getSubCategory(), vendorSoftwareProductDto.getSubCategory(), "subCategory should be equals");
+        assertEquals(vendorSoftwareProduct.getVendorName(), vendorSoftwareProductDto.getVendorName(), "vendorName should be equals");
+        assertEquals(vendorSoftwareProduct.getVendorId(), vendorSoftwareProductDto.getVendorId(), "vendorId should be equals");
+        assertEquals(vendorSoftwareProduct.getOnboardingMethod(), vendorSoftwareProductDto.getOnboardingMethod(), "onboardingMethod should be equals");
+        assertEquals(vendorSoftwareProduct.getOnboardingOrigin(), vendorSoftwareProductDto.getOnboardingOrigin(), "onboardingOrigin should be equals");
+        assertEquals(vendorSoftwareProduct.getVersionId(), vendorSoftwareProductDto.getVersionId(), "versionId should be equals");
+        assertEquals(vendorSoftwareProduct.getNetworkPackageName(), vendorSoftwareProductDto.getNetworkPackageName(), "networkPackageName should be equals");
+        if (vendorSoftwareProductDto.getSelectedModelList() == null) {
+            assertTrue(vendorSoftwareProduct.getModelList().isEmpty(), "modelList should be an empty list");
+        } else {
+            assertEquals(vendorSoftwareProduct.getModelList(), vendorSoftwareProductDto.getSelectedModelList(), "modelList should be equals");
+        }
+    }
+}
\ No newline at end of file
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/CsarOperationTest.java b/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/CsarOperationTest.java
new file mode 100644
index 0000000..fbed593
--- /dev/null
+++ b/catalog-model/src/test/java/org/openecomp/sdc/be/model/operations/impl/CsarOperationTest.java
@@ -0,0 +1,112 @@
+/*
+ * -
+ *  ============LICENSE_START=======================================================
+ *  Copyright (C) 2021 Nordix Foundation.
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model.operations.impl;
+
+import static org.junit.jupiter.api.Assertions.*;
+import static org.mockito.Mockito.when;
+
+import fj.data.Either;
+import java.nio.charset.StandardCharsets;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.mockito.InjectMocks;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+import org.openecomp.sdc.be.client.onboarding.api.OnboardingClient;
+import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.VendorSoftwareProduct;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+
+class CsarOperationTest {
+
+    @Mock
+    private OnboardingClient onboardingClient;
+
+    @InjectMocks
+    private CsarOperation csarOperation;
+
+
+    @BeforeEach
+    void setUp() {
+        MockitoAnnotations.openMocks(this);
+    }
+
+    @Test
+    void findVspLatestPackageSuccessTest() {
+        final var csarUuid = "csarUuid";
+        var user = new User("userId");
+        final Map<String, byte[]> csarFileMap = new HashMap<>();
+        csarFileMap.put("test", "test".getBytes(StandardCharsets.UTF_8));
+        when(onboardingClient.findLatestPackage(csarUuid, user.getUserId())).thenReturn(Either.left(csarFileMap));
+        final Either<Map<String, byte[]>, StorageOperationStatus> vspLatestPackage = csarOperation.findVspLatestPackage(csarUuid, user);
+        assertTrue(vspLatestPackage.isLeft());
+        final Map<String, byte[]> actualCsarFileMap = vspLatestPackage.left().value();
+        assertEquals(csarFileMap, actualCsarFileMap);
+    }
+
+    @Test
+    void findVspLatestPackage_csarNotFoundTest() {
+        //given
+        final var vspId = "vspId";
+        var user = new User("userId");
+        //when
+        when(onboardingClient.findLatestPackage(vspId, user.getUserId())).thenReturn(Either.right(StorageOperationStatus.CSAR_NOT_FOUND));
+        final Either<Map<String, byte[]>, StorageOperationStatus> vspLatestPackage = csarOperation.findVspLatestPackage(vspId, user);
+        //then
+        assertTrue(vspLatestPackage.isRight());
+        final StorageOperationStatus storageOperationStatus = vspLatestPackage.right().value();
+        assertEquals(StorageOperationStatus.CSAR_NOT_FOUND, storageOperationStatus);
+    }
+
+    @Test
+    void findVspSuccessTest() {
+        //given
+        final var vspId = "vspId";
+        final var vspVersionId = "vspVersionId";
+        var user = new User("userId");
+        var vendorSoftwareProduct = new VendorSoftwareProduct();
+        vendorSoftwareProduct.setId(vspId);
+        vendorSoftwareProduct.setVersionId(vspVersionId);
+        //when
+        when(onboardingClient.findVendorSoftwareProduct(vspId, vspVersionId, user.getUserId())).thenReturn(Optional.of(vendorSoftwareProduct));
+        final Optional<VendorSoftwareProduct> vspOptional = csarOperation.findVsp(vspId, vspVersionId, user);
+        //then
+        assertTrue(vspOptional.isPresent());
+        assertEquals(vendorSoftwareProduct, vspOptional.get());
+    }
+
+    @Test
+    void findVsp_vspNotFoundTest() {
+        //given
+        final var vspId = "vspId";
+        final var vspVersionId = "vspVersionId";
+        var user = new User("userId");
+        //when
+        when(onboardingClient.findVendorSoftwareProduct(vspId, vspVersionId, user.getUserId())).thenReturn(Optional.empty());
+        final Optional<VendorSoftwareProduct> vspOptional = csarOperation.findVsp(vspId, vspVersionId, user);
+        //then
+        assertTrue(vspOptional.isEmpty());
+    }
+}
\ No newline at end of file
diff --git a/catalog-model/src/test/resources/application-context-test.xml b/catalog-model/src/test/resources/application-context-test.xml
index dc9d5ba..7f4ada2 100644
--- a/catalog-model/src/test/resources/application-context-test.xml
+++ b/catalog-model/src/test/resources/application-context-test.xml
@@ -3,13 +3,14 @@
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
-           
+
 
   <context:component-scan
     base-package="org.openecomp.sdc.be.model.operations.impl,
     	org.openecomp.sdc.be.model.jsonjanusgraph.operations,
     	org.openecomp.sdc.be.dao.jsongraph,
     	org.openecomp.sdc.be.model.cache,
+    	org.openecomp.sdc.be.client,
 		org.openecomp.sdc.be.dao.janusgraph,
 		org.openecomp.sdc.be.dao.cassandra,
 		org.openecomp.sdc.be.model.jsonjanusgraph.utils,
diff --git a/catalog-model/src/test/resources/config/catalog-model/configuration.yaml b/catalog-model/src/test/resources/config/catalog-model/configuration.yaml
index 7d87926..3bb8799 100644
--- a/catalog-model/src/test/resources/config/catalog-model/configuration.yaml
+++ b/catalog-model/src/test/resources/config/catalog-model/configuration.yaml
@@ -266,7 +266,6 @@
     protocol: http
     host: localhost
     port: 8080
-    downloadCsarUri: "/onboarding-api/v1.0/vendor-software-products/packages"
     healthCheckUri: "/onboarding-api/v1.0/healthcheck"
 
 switchoverDetector:
diff --git a/catalog-model/src/test/resources/config/configuration.yaml b/catalog-model/src/test/resources/config/configuration.yaml
index 6705c54..95695b7 100644
--- a/catalog-model/src/test/resources/config/configuration.yaml
+++ b/catalog-model/src/test/resources/config/configuration.yaml
@@ -327,7 +327,6 @@
     protocol: http
     host: localhost
     port: 8080
-    downloadCsarUri: "/onboarding-api/v1.0/vendor-software-products/packages"
     healthCheckUri: "/onboarding-api/v1.0/healthcheck"
 
 
