Catalog alignment
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / ArtifactsBusinessLogic.java
index 9eae363..103edd6 100644 (file)
 
 package org.openecomp.sdc.be.components.impl;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.gson.Gson;
 import com.google.gson.GsonBuilder;
 import fj.data.Either;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.elasticsearch.common.Strings;
 import org.openecomp.sdc.be.components.ArtifactsResolver;
 import org.openecomp.sdc.be.components.impl.ImportUtils.ResultStatusEnum;
 import org.openecomp.sdc.be.components.impl.artifact.ArtifactTypeToPayloadTypeSelector;
 import org.openecomp.sdc.be.components.impl.artifact.PayloadTypeEnum;
 import org.openecomp.sdc.be.components.impl.exceptions.ByActionStatusComponentException;
 import org.openecomp.sdc.be.components.impl.exceptions.ByResponseFormatComponentException;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
 import org.openecomp.sdc.be.components.lifecycle.LifecycleBusinessLogic;
 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction;
 import org.openecomp.sdc.be.components.lifecycle.LifecycleChangeInfoWithAction.LifecycleChanceActionEnum;
@@ -48,11 +50,12 @@ import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.dao.cassandra.ArtifactCassandraDao;
 import org.openecomp.sdc.be.dao.cassandra.CassandraOperationStatus;
 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
+import org.openecomp.sdc.be.datatypes.components.ComponentMetadataDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GroupInstanceDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.HeatParameterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.OperationDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.ToscaArtifactDataDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
@@ -76,19 +79,20 @@ import org.openecomp.sdc.be.model.heat.HeatParameterType;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeTemplateOperation;
+import org.openecomp.sdc.be.model.operations.StorageException;
 import org.openecomp.sdc.be.model.operations.api.IElementOperation;
 import org.openecomp.sdc.be.model.operations.api.IGroupInstanceOperation;
 import org.openecomp.sdc.be.model.operations.api.IGroupOperation;
 import org.openecomp.sdc.be.model.operations.api.IGroupTypeOperation;
 import org.openecomp.sdc.be.model.operations.api.IHeatParametersOperation;
 import org.openecomp.sdc.be.model.operations.api.IInterfaceLifecycleOperation;
-import org.openecomp.sdc.be.model.operations.api.IUserAdminOperation;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.DaoStatusConverter;
 import org.openecomp.sdc.be.model.operations.impl.InterfaceLifecycleOperation;
 import org.openecomp.sdc.be.model.operations.impl.UniqueIdBuilder;
+import org.openecomp.sdc.be.model.operations.impl.UserAdminOperation;
 import org.openecomp.sdc.be.resources.data.ComponentMetadataData;
-import org.openecomp.sdc.be.resources.data.ESArtifactData;
+import org.openecomp.sdc.be.resources.data.DAOArtifactData;
 import org.openecomp.sdc.be.resources.data.auditing.AuditingActionEnum;
 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceCommonInfo;
 import org.openecomp.sdc.be.resources.data.auditing.model.ResourceVersionInfo;
@@ -97,7 +101,6 @@ import org.openecomp.sdc.be.tosca.CsarUtils;
 import org.openecomp.sdc.be.tosca.ToscaError;
 import org.openecomp.sdc.be.tosca.ToscaExportHandler;
 import org.openecomp.sdc.be.tosca.ToscaRepresentation;
-import org.openecomp.sdc.be.user.IUserBusinessLogic;
 import org.openecomp.sdc.be.user.Role;
 import org.openecomp.sdc.be.user.UserBusinessLogic;
 import org.openecomp.sdc.be.utils.TypeUtils;
@@ -136,10 +139,13 @@ import java.util.Map.Entry;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.function.Predicate;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
 
+import static org.openecomp.sdc.be.dao.api.ActionStatus.MISMATCH_BETWEEN_ARTIFACT_TYPE_AND_COMPONENT_TYPE;
+
 @org.springframework.stereotype.Component("artifactBusinessLogic")
 public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     private static final String RESOURCE_INSTANCE = "resource instance";
@@ -159,13 +165,14 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     public static final String HEAT_ENV_SUFFIX = "env";
     private static final String ARTIFACT_PLACEHOLDER_FILE_EXTENSION = "fileExtension";
 
-    private static final Logger log = Logger.getLogger(ArtifactsBusinessLogic.class);
+    private static final Logger log = Logger.getLogger(ArtifactsBusinessLogic.class.getName());
     private static final String FAILED_UPDATE_GROUPS = "Failed to update groups of the component {}. ";
     private static final String FAILED_UPDATE_ARTIFACT = "Failed to delete or update the artifact {}. Parent uniqueId is {}";
     private static final String FAILED_SAVE_ARTIFACT = "Failed to save the artifact.";
+    public static final String ARTIFACT_ACTION_LOCK = "Artifact action - lock ";
     private static final String UPDATE_ARTIFACT_LOCK = "Update Artifact - lock ";
     private static final String FAILED_DOWNLOAD_ARTIFACT = "Download artifact {} failed";
-    private static final String FAILED_UPLOAD_ARTIFACT_TO_COMPONENT = "Failed to upload artifact to component with type {} and uuid {}. Status is {}. ";
+    public static final String FAILED_UPLOAD_ARTIFACT_TO_COMPONENT = "Failed to upload artifact to component with type {} and uuid {}. Status is {}. ";
     private static final String FAILED_UPLOAD_ARTIFACT_TO_INSTANCE = "Failed to upload artifact to component instance {} of component with type {} and uuid {}. Status is {}. ";
     private static final String FAILED_FETCH_COMPONENT = "Could not fetch component with type {} and uuid {}. Status is {}. ";
     private static final String NULL_PARAMETER = "One of the function parameteres is null";
@@ -180,31 +187,28 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     @javax.annotation.Resource
     private IInterfaceLifecycleOperation interfaceLifecycleOperation;
     @javax.annotation.Resource
-    private IUserAdminOperation userOperaton;
+    private UserAdminOperation userOperaton;
 
     @javax.annotation.Resource
     private IElementOperation elementOperation;
 
-    @javax.annotation.Resource
-    private UserBusinessLogic userAdminManager;
-
     @javax.annotation.Resource
     private IHeatParametersOperation heatParametersOperation;
 
-    private final ArtifactCassandraDao artifactCassandraDao;
-    private final ToscaExportHandler toscaExportUtils;
-    private final CsarUtils csarUtils;
-    private final LifecycleBusinessLogic lifecycleBusinessLogic;
-    private final IUserBusinessLogic userBusinessLogic;
-    private final ArtifactsResolver artifactsResolver;
+    private ArtifactCassandraDao artifactCassandraDao;
+    private ToscaExportHandler toscaExportUtils;
+    private CsarUtils csarUtils;
+    private LifecycleBusinessLogic lifecycleBusinessLogic;
+    private UserBusinessLogic userBusinessLogic;
+    private ArtifactsResolver artifactsResolver;
     private NodeTemplateOperation nodeTemplateOperation;
 
     @Autowired
     public ArtifactsBusinessLogic(ArtifactCassandraDao artifactCassandraDao, ToscaExportHandler toscaExportUtils,
-        CsarUtils csarUtils, LifecycleBusinessLogic lifecycleBusinessLogic, IUserBusinessLogic userBusinessLogic,
-        ArtifactsResolver artifactsResolver, IElementOperation elementDao, IGroupOperation groupOperation,
-        IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation, InterfaceOperation interfaceOperation,
-        InterfaceLifecycleOperation interfaceLifecycleTypeOperation, ArtifactsOperations artifactToscaOperation) {
+                                  CsarUtils csarUtils, LifecycleBusinessLogic lifecycleBusinessLogic, UserBusinessLogic userBusinessLogic,
+                                  ArtifactsResolver artifactsResolver, IElementOperation elementDao, IGroupOperation groupOperation,
+                                  IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation, InterfaceOperation interfaceOperation,
+                                  InterfaceLifecycleOperation interfaceLifecycleTypeOperation, ArtifactsOperations artifactToscaOperation) {
         super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
             interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
         this.artifactCassandraDao = artifactCassandraDao;
@@ -250,13 +254,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     }
 
     // new flow US556184
-    public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleArtifactRequest(String componentId, String userId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo,
-                                                                                               String origMd5, String originData, String interfaceUuid, String operationUuid, String parentId, String containerComponentType) {
-        return handleArtifactRequest(componentId, userId, componentType, operation, artifactId, artifactInfo, origMd5, originData, interfaceUuid, operationUuid, parentId, containerComponentType, true, false);
-    }
-
-    public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleArtifactRequest(String componentId, String userId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo,
-                                                                                               String origMd5, String originData, String interfaceUuid, String operationUuid, String parentId, String containerComponentType, boolean shouldLock, boolean inTransaction) {
+    public Either<ArtifactDefinition, Operation> handleArtifactRequest(String componentId, String userId, ComponentTypeEnum componentType,
+                                                                       ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo,
+                                                                       String origMd5, String originData, String interfaceName, String operationName,
+                                                                       String parentId, String containerComponentType, boolean shouldLock, boolean inTransaction) {
 
         // step 1 - detect auditing type
         AuditingActionEnum auditingAction = detectAuditingType(operation, origMd5);
@@ -265,40 +266,33 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
             log.debug("handleArtifactRequest - no HTTP_CSP_HEADER , component id {}", componentId);
             handleAuditing(auditingAction, null, componentId, null, null, null, artifactId, responseFormat, componentType, null);
-            return Either.right(responseFormat);
+            throw new ByActionStatusComponentException(ActionStatus.MISSING_INFORMATION);
         }
         // step 3 - check user existence
-        Either<User, ResponseFormat> userResult = validateUserExists(userId, auditingAction, componentId, artifactId, componentType, inTransaction);
-        if (userResult.isRight()) {
-            return Either.right(userResult.right().value());
-        }
-
         // step 4 - check user's role
-        User user = userResult.left().value();
-        Either<Boolean, ResponseFormat> validateUserRole = validateUserRole(user, auditingAction, componentId, artifactId, componentType, operation);
-        if (validateUserRole.isRight()) {
-            return Either.right(validateUserRole.right().value());
-        }
+        User user = validateUserExists(userId, auditingAction, componentId, artifactId, componentType, inTransaction);
+        validateUserRole(user, auditingAction, componentId, artifactId, componentType, operation);
 
         // steps 5 - 6 - 7
         // 5. check service/resource existence
         // 6. check service/resource check out
         // 7. user is owner of checkout state
-        org.openecomp.sdc.be.model.Component component = null;
+        Component component = null;
         String realComponentId = componentType == ComponentTypeEnum.RESOURCE_INSTANCE ? parentId : componentId;
-        Either<? extends org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponent = validateComponentExists(realComponentId, auditingAction, user, artifactId, componentType, containerComponentType);
-        if (validateComponent.isRight()) {
-            return Either.right(validateComponent.right().value());
-        }
-        component = validateComponent.left().value();
-        Either<Boolean, ResponseFormat> validateWorkOnResource = validateWorkOnComponent(component, userId, auditingAction, user, artifactId, operation);
-        if (validateWorkOnResource.isRight()) {
-            return Either.right(validateWorkOnResource.right().value());
+        component = validateComponentExists(realComponentId, auditingAction, user, artifactId, componentType, containerComponentType);
+        validateWorkOnComponent(component, userId, auditingAction, user, artifactId, operation);
+        if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
+            validateResourceInstanceById(component, componentId);
         }
         // step 8
 
-        return validateAndHandleArtifact(componentId, componentType, operation, artifactId, artifactInfo, origMd5, originData, interfaceUuid, operationUuid, user, component,
-                shouldLock, inTransaction, true);
+        return validateAndHandleArtifact(componentId, componentType, operation, artifactId, artifactInfo, origMd5,
+                originData, interfaceName, operationName, user, component, shouldLock, inTransaction, true);
+    }
+
+    public Either<ArtifactDefinition, Operation> handleArtifactRequest(String componentId, String userId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo,
+                                                                       String origMd5, String originData, String interfaceName, String operationName, String parentId, String containerComponentType) {
+        return handleArtifactRequest(componentId, userId, componentType, operation, artifactId, artifactInfo, origMd5, originData, interfaceName, operationName, parentId, containerComponentType, true, false);
     }
 
     /**
@@ -308,78 +302,75 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      *
      * @return
      */
-    public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> validateAndHandleArtifact(String componentUniqueId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactUniqueId,
-                                                                                                   ArtifactDefinition artifactDefinition, String origMd5, String originData, String interfaceUuid, String operationName, User user, Component component, boolean shouldLock, boolean inTransaction, boolean needUpdateGroup) {
-        Component parent = component;
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-
+    public Either<ArtifactDefinition, Operation> validateAndHandleArtifact(
+            String componentUniqueId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactUniqueId,
+            ArtifactDefinition artifactDefinition, String origMd5, String originData, String interfaceName,
+            String operationName, User user, Component component, boolean shouldLock, boolean inTransaction, boolean needUpdateGroup) {
         AuditingActionEnum auditingAction = detectAuditingType(operation, origMd5);
-        artifactDefinition = validateArtifact(componentUniqueId, componentType, operation, artifactUniqueId, artifactDefinition, auditingAction, user, component, parent, errorWrapper, shouldLock, inTransaction);
-
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> result;
-        if (errorWrapper.isEmpty()) {
-            // step 10
-            result = doAction(componentUniqueId, componentType, operation, artifactUniqueId, artifactDefinition, origMd5, originData, interfaceUuid, operationName, auditingAction, user, parent, shouldLock, inTransaction, needUpdateGroup);
-        }
-        else {
-            result = Either.right(errorWrapper.getInnerElement());
-        }
+        artifactDefinition = validateArtifact(componentUniqueId, componentType, operation,
+                artifactUniqueId, artifactDefinition, auditingAction, user,
+                component, shouldLock, inTransaction);
+
+        // step 10
+        Either<ArtifactDefinition, Operation> result = doAction(componentUniqueId, componentType, operation, artifactUniqueId, artifactDefinition,
+                origMd5, originData, interfaceName, operationName, auditingAction, user, component, shouldLock, inTransaction, needUpdateGroup);
+        //TODO: audit positive action
         return result;
     }
 
-    private ArtifactDefinition validateArtifact(String componentId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, User user,
-                                                Component component, Component parent, Wrapper<ResponseFormat> errorWrapper, boolean shouldLock, boolean inTransaction) {
-        ArtifactDefinition validatedArtifactInfo = artifactInfo;
-        if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.UPDATE || operation.getArtifactOperationEnum() == ArtifactOperationEnum.DELETE || operation
-                .getArtifactOperationEnum() == ArtifactOperationEnum.DOWNLOAD) {
-            Either<ArtifactDefinition, ResponseFormat> validateArtifact = validateArtifact(componentId, componentType, artifactId, component);
-            if (validateArtifact.isRight()) {
-                ResponseFormat responseFormat = validateArtifact.right().value();
-                handleAuditing(auditingAction, parent, componentId, user, null, null, artifactId, responseFormat, componentType, null);
-                errorWrapper.setInnerElement(validateArtifact.right().value());
-            }
-            else if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.DOWNLOAD) {
-                validatedArtifactInfo = validateArtifact.left().value();
-                    handleHeatEnvDownload(componentId, componentType, user, component, validateArtifact, errorWrapper, shouldLock, inTransaction);
+    @VisibleForTesting
+    ArtifactDefinition validateArtifact(String componentId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, User user,
+                                        Component component, boolean shouldLock, boolean inTransaction) {
+        ArtifactDefinition artifactInfoToReturn = artifactInfo;
+        ArtifactOperationEnum operationEnum = operation.getArtifactOperationEnum();
+        if (operationEnum == ArtifactOperationEnum.UPDATE || operationEnum == ArtifactOperationEnum.DELETE || operationEnum == ArtifactOperationEnum.DOWNLOAD) {
+            ArtifactDefinition dbArtifact = getArtifactIfBelongsToComponent(componentId, componentType, artifactId, component);
+            if (operationEnum == ArtifactOperationEnum.DOWNLOAD) {
+                artifactInfoToReturn = dbArtifact;
+                handleHeatEnvDownload(componentId, componentType, user, component, dbArtifact, shouldLock, inTransaction);
             }
         }
-        return validatedArtifactInfo;
+        return artifactInfoToReturn;
     }
 
-    private void handleHeatEnvDownload(String componentId, ComponentTypeEnum componentType, User user, org.openecomp.sdc.be.model.Component component, Either<ArtifactDefinition,
-            ResponseFormat> validateArtifact, Wrapper<ResponseFormat> errorWrapper, boolean shouldLock, boolean inTransaction) {
-        ArtifactDefinition validatedArtifact = validateArtifact.left().value();
+    @VisibleForTesting
+    void handleHeatEnvDownload(String componentId, ComponentTypeEnum componentType, User user, Component component,
+                               ArtifactDefinition artifactDefinition, boolean shouldLock, boolean inTransaction) {
 
-        if (validatedArtifact.getArtifactType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV.getType())
+        if (artifactDefinition.getArtifactType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV.getType())
                 && ComponentTypeEnum.SERVICE == component.getComponentType()) {
             ComponentInstance componentInstance = component.getComponentInstances()
-                                                           .stream()
-                                                           .filter(p -> p.getUniqueId().equals(componentId))
-                                                           .findAny()
-                                                           .get();
+                    .stream()
+                    .filter(p -> p.getUniqueId().equals(componentId))
+                    .findAny()
+                    .orElse(null);
+            if (componentInstance == null) {
+                throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentId,
+                        "instance", "Service", component.getName());
+            }
             Map<String, ArtifactDefinition> deploymentArtifacts = componentInstance.getDeploymentArtifacts();
 
             ArtifactDefinition heatEnvWithHeatParams = deploymentArtifacts.values()
-                                                                          .stream()
-                                                                          .filter(p -> p.getUniqueId()
-                                                                                        .equals(validatedArtifact.getUniqueId()))
-                                                                          .findAny()
-                                                                          .get();
-            Either<ArtifactDefinition, ResponseFormat> eitherGenerated = generateHeatEnvArtifact(heatEnvWithHeatParams, componentType, component, componentInstance
-                    .getName(), user, componentId, shouldLock, inTransaction);
+                    .stream()
+                    .filter(p -> p.getUniqueId()
+                            .equals(artifactDefinition.getUniqueId()))
+                    .findAny()
+                    .orElse(null);
+            Either<ArtifactDefinition, ResponseFormat> eitherGenerated = generateHeatEnvArtifact(heatEnvWithHeatParams,
+                    componentType, component, componentInstance.getName(), user, componentId, shouldLock, inTransaction);
             if (eitherGenerated.isRight()) {
-                errorWrapper.setInnerElement(eitherGenerated.right().value());
+                throw new ByResponseFormatComponentException((eitherGenerated.right().value()));
             }
         }
     }
 
-    private boolean artifactGenerationRequired(org.openecomp.sdc.be.model.Component component, ArtifactDefinition artifactInfo) {
+    private boolean artifactGenerationRequired(Component component, ArtifactDefinition artifactInfo) {
         boolean needGenerate;
         needGenerate = artifactInfo.getArtifactGroupType() == ArtifactGroupTypeEnum.TOSCA && (component.getLifecycleState() == LifecycleStateEnum.NOT_CERTIFIED_CHECKIN || component
                 .getLifecycleState() == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
         needGenerate = needGenerate || (ComponentTypeEnum.RESOURCE == component.getComponentType() && (artifactInfo.getArtifactType()
-                                                                                                                   .equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV
-                                                                                                                           .getType()) || isAbstractVfcEmptyCsar((Resource) component, artifactInfo)));
+                .equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV
+                        .getType()) || isAbstractVfcEmptyCsar((Resource) component, artifactInfo)));
         return needGenerate;
     }
 
@@ -389,139 +380,183 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 .equals(ArtifactTypeEnum.TOSCA_CSAR.getType()) && StringUtils.isEmpty(artifactInfo.getArtifactChecksum());
     }
 
-    public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> generateAndSaveToscaArtifact(
-        ArtifactDefinition artifactDefinition, org.openecomp.sdc.be.model.Component component,
+    public Either<ArtifactDefinition, Operation> generateAndSaveToscaArtifact(
+        ArtifactDefinition artifactDefinition, Component component,
         User user, boolean isInCertificationRequest, boolean shouldLock, boolean inTransaction,
         boolean fetchTemplatesFromDB) {
-
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> generated = generateToscaArtifact(component, artifactDefinition, isInCertificationRequest, fetchTemplatesFromDB);
-        if (generated.isRight()) {
-            return generated;
-        }
+        generateToscaArtifact(component, artifactDefinition, isInCertificationRequest, fetchTemplatesFromDB);
         byte[] decodedPayload = artifactDefinition.getPayloadData();
         artifactDefinition.setEsId(artifactDefinition.getUniqueId());
         artifactDefinition.setArtifactChecksum(GeneralUtility.calculateMD5Base64EncodedByByteArray(decodedPayload));
-        return lockComponentAndUpdateArtifact(component.getUniqueId(), artifactDefinition, AuditingActionEnum.ARTIFACT_PAYLOAD_UPDATE, artifactDefinition
-                        .getUniqueId(), user, component.getComponentType(), component, decodedPayload, null, null,
-                shouldLock, inTransaction);
-
+        return lockComponentAndUpdateArtifact(component.getUniqueId(), artifactDefinition, AuditingActionEnum.ARTIFACT_PAYLOAD_UPDATE, artifactDefinition.getUniqueId(),
+                user, component.getComponentType(), component, decodedPayload, null, null, shouldLock, inTransaction);
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> generateToscaArtifact(Component parent, ArtifactDefinition artifactInfo, boolean isInCertificationRequest, boolean fetchTemplatesFromDB) {
+    private ArtifactDefinition generateToscaArtifact(Component parent, ArtifactDefinition artifactInfo, boolean isInCertificationRequest, boolean fetchTemplatesFromDB) {
         log.debug("tosca artifact generation");
-        if (artifactInfo.getArtifactType().equals(ArtifactTypeEnum.TOSCA_CSAR.getType())) {
+        if (ArtifactTypeEnum.TOSCA_CSAR.getType().equals(artifactInfo.getArtifactType())) {
             Either<byte[], ResponseFormat> generated = csarUtils.createCsar(parent, fetchTemplatesFromDB, isInCertificationRequest);
-
             if (generated.isRight()) {
-                log.debug("Failed to export tosca csar for component {} error {}", parent.getUniqueId(), generated.right()
-                                                                                                                  .value());
-
-                return Either.right(generated.right().value());
+                ResponseFormat error = generated.right().value();
+                log.debug("Failed to generate tosca csar for component {} error {}", parent.getUniqueId(), error);
+                throw new ByResponseFormatComponentException(error);
             }
-            byte[] value = generated.left().value();
-            artifactInfo.setPayload(value);
+            artifactInfo.setPayload(generated.left().value());
 
         }
         else {
             Either<ToscaRepresentation, ToscaError> exportComponent = toscaExportUtils.exportComponent(parent);
             if (exportComponent.isRight()) {
-                log.debug("Failed export tosca yaml for component {} error {}", parent.getUniqueId(), exportComponent.right()
-                                                                                                                     .value());
-                ActionStatus status = componentsUtils.convertFromToscaError(exportComponent.right().value());
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(status);
-                return Either.right(responseFormat);
+                ToscaError toscaError = exportComponent.right().value();
+                log.debug("Failed export tosca yaml for component {} error {}", parent.getUniqueId(), toscaError);
+                ActionStatus status = componentsUtils.convertFromToscaError(toscaError);
+                throw new ByActionStatusComponentException(status);
             }
             log.debug("Tosca yaml exported for component {} ", parent.getUniqueId());
-            String payload = exportComponent.left().value().getMainYaml();
-            artifactInfo.setPayloadData(payload);
+            artifactInfo.setPayloadData(exportComponent.left().value().getMainYaml());
         }
-        return Either.left(Either.left(artifactInfo));
+        return artifactInfo;
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> doAction(String componentId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo, String origMd5,
-                                                                                   String originData, String interfaceName, String operationName, AuditingActionEnum auditingAction, User user, org.openecomp.sdc.be.model.Component parent, boolean shouldLock, boolean inTransaction, boolean needUpdateGroup) {
-        switch (operation.getArtifactOperationEnum()) {
-            case DOWNLOAD:
-                if (artifactGenerationRequired(parent, artifactInfo)) {
-                    return generateNotSavedArtifact(parent, artifactInfo);
-                }
-                return handleDownload(componentId, artifactId, user, auditingAction, componentType, parent);
-            case DELETE:
-                return handleDelete(componentId, artifactId, user, auditingAction, componentType, parent, shouldLock, inTransaction);
-            case UPDATE:
-                Either<Either<ArtifactDefinition, Operation>, ResponseFormat> result = null;
-                ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(artifactInfo.getArtifactType());
-                if (componentType.equals(ComponentTypeEnum.RESOURCE_INSTANCE)
-                        && (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_VOL || artifactType == ArtifactTypeEnum.HEAT_NET || artifactType == ArtifactTypeEnum.HEAT_ENV)) {
-                    result = handleUpdateHeatEnv(componentId, artifactInfo, auditingAction, artifactId, user, componentType, parent, originData, origMd5, operation, shouldLock, inTransaction);
-                    if (needUpdateGroup && result.isLeft()) {
-                        Either<ArtifactDefinition, Operation> updateResult = result.left().value();
-                        ActionStatus error = updateGroupInstance(artifactInfo, updateResult.left()
-                                                                                           .value(), parent, componentType, componentId);
-                        if (error != ActionStatus.OK) {
-                            result = Either.right(componentsUtils.getResponseFormat(error));
-                        }
-                    }
-                }
-                else {
-                    if (componentType.equals(ComponentTypeEnum.RESOURCE) && artifactType == ArtifactTypeEnum.HEAT_ENV) {
-                        result = handleUpdateHeatWithHeatEnvParams(componentId, artifactInfo, auditingAction, artifactId, user, componentType, parent, originData, origMd5, operation, shouldLock, inTransaction, needUpdateGroup);
-                    }
-                }
-                if (result == null) {
-                    result = handleUpdate(componentId, artifactInfo, operation, auditingAction, artifactId, user, componentType, parent, origMd5, originData, interfaceName, operationName, shouldLock, inTransaction);
-                    if (needUpdateGroup && result.isLeft()) {
-                        Either<ArtifactDefinition, Operation> updateResult = result.left().value();
-
-                        ActionStatus error = updateGroupForHeat(artifactInfo, updateResult.left()
-                                                                                          .value(), parent, componentType);
-                        if (error != ActionStatus.OK) {
-                            result = Either.right(componentsUtils.getResponseFormat(error));
-                        }
+    private Either<ArtifactDefinition, Operation> doAction(String componentId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId, ArtifactDefinition artifactInfo, String origMd5,
+                                                           String originData, String interfaceName, String operationName, AuditingActionEnum auditingAction, User user, Component parent, boolean shouldLock, boolean inTransaction, boolean needUpdateGroup) {
+        if (interfaceName != null && operationName != null) {
+            interfaceName = interfaceName.toLowerCase();
+            operationName = operationName.toLowerCase();
+        }
+        if (shouldLock) {
+            lockComponent(componentType, artifactId, auditingAction, user, parent);
+        }
+        Either<ArtifactDefinition, Operation> result;
+        boolean operationSucceeded = false;
+        try {
+            switch (operation.getArtifactOperationEnum()) {
+                case DOWNLOAD:
+                    if (artifactGenerationRequired(parent, artifactInfo)) {
+                        result = Either.left(generateNotSavedArtifact(parent, artifactInfo));
+                    } else {
+                        result = Either.left(handleDownload(componentId, artifactId, componentType, parent));
                     }
+                    break;
+                case DELETE:
+                    result = Either.left(handleDeleteInternal(componentId, artifactId, componentType, parent));
+                    break;
+                case UPDATE:
+                    result = handleUpdate(componentId, componentType, operation, artifactId, artifactInfo, null, origMd5, originData, interfaceName, operationName,
+                            auditingAction, user, parent, needUpdateGroup);
+                    break;
+                case CREATE:
+                    result = handleCreate(componentId, artifactInfo, operation, auditingAction, user, componentType, parent, origMd5, originData, interfaceName,
+                            operationName);
+                    break;
+                case LINK:
+                    result = Either.left(handleLink(componentId, artifactInfo, componentType, parent));
+                    break;
+                default:
+                    throw new UnsupportedOperationException("In ArtifactsBusinessLogic received illegal operation: " + operation.getArtifactOperationEnum());
+            }
+            operationSucceeded = true;
+            return result;
+        }
+        finally {
+            handleLockingAndCommit(parent, shouldLock, inTransaction, operationSucceeded);
+        }
+    }
+
+    private void lockComponent(ComponentTypeEnum componentType, String artifactId, AuditingActionEnum auditingAction, User user, Component parent) {
+        try {
+            lockComponent(parent, ARTIFACT_ACTION_LOCK);
+        }catch (ComponentException e){
+            handleAuditing(auditingAction, parent, parent.getUniqueId(), user, null, null, artifactId, e.getResponseFormat(),
+                    componentType, null);
+            throw e;
+        }
+    }
+
+    @VisibleForTesting
+    public Either<ArtifactDefinition, Operation> handleUpdate(String componentId, ComponentTypeEnum componentType, ArtifactOperationInfo operation, String artifactId,
+                                                       ArtifactDefinition artifactInfo, byte[] decodedPayload, String origMd5, String originData, String interfaceName,
+                                                       String operationName, AuditingActionEnum auditingAction, User user, Component parent,
+                                                       boolean needUpdateGroup) {
+        Either<ArtifactDefinition, Operation> result;
+        ArtifactTypeEnum artifactType = validateAndReturnArtifactType(artifactInfo);
+        if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE
+                && (artifactType == ArtifactTypeEnum.HEAT || artifactType == ArtifactTypeEnum.HEAT_VOL || artifactType == ArtifactTypeEnum.HEAT_NET || artifactType == ArtifactTypeEnum.HEAT_ENV)) {
+            result = handleUpdateHeatEnvAndHeatMeta(componentId, artifactInfo, auditingAction, artifactId, user, componentType, parent, originData, origMd5, operation);
+            if (needUpdateGroup) {
+                ActionStatus error = updateGroupInstance(artifactInfo, result.left().value(), parent, componentId);
+                if (error != ActionStatus.OK) {
+                    throw new ByActionStatusComponentException(error);
                 }
-                return result;
-            case CREATE:
-                return handleCreate(componentId, artifactInfo, operation, auditingAction, user, componentType, parent, origMd5, originData, interfaceName, operationName, shouldLock, inTransaction);
-            case LINK:
-                return handleLink(componentId, artifactInfo, auditingAction, user, componentType, parent, shouldLock, inTransaction);
+            }
+        }
+        else if (componentType == ComponentTypeEnum.RESOURCE && artifactType == ArtifactTypeEnum.HEAT_ENV) {
+            result = handleUpdateHeatWithHeatEnvParams(componentId, artifactInfo, auditingAction, componentType, parent, originData, origMd5, operation, needUpdateGroup);
+        }
+        else {
+            if (decodedPayload == null) {
+                decodedPayload = validateInput(componentId, artifactInfo, operation, auditingAction, artifactId, user,
+                        componentType, parent, origMd5, originData, interfaceName, operationName);
+            }
+            result = updateArtifactFlow(parent, componentId, artifactId, artifactInfo, decodedPayload, componentType, auditingAction, interfaceName, operationName);
+            if (needUpdateGroup && result.isLeft()) {
+                ArtifactDefinition updatedArtifact = result.left().value();
+                updateGroupForHeat(artifactInfo, updatedArtifact, parent);
+            }
+        }
+        return result;
+    }
+
+    private ArtifactTypeEnum validateAndReturnArtifactType(ArtifactDefinition artifactInfo) {
+        ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(artifactInfo.getArtifactType());
+        if (artifactType == null) {
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo.getArtifactType());
         }
-        return null;
+        return artifactType;
+    }
+
+    public ActionStatus updateGroupForHeatEnv(ArtifactDefinition artifactInfo, ArtifactDefinition artAfterUpdate, Component parent) {
+        return ActionStatus.OK;
     }
 
-    private ActionStatus updateGroupForHeat(ArtifactDefinition artifactInfo, ArtifactDefinition artAfterUpdate, Component parent, ComponentTypeEnum componentType) {
+    @VisibleForTesting
+    public ActionStatus updateGroupForHeat(ArtifactDefinition artifactInfo, ArtifactDefinition artAfterUpdate, Component parent) {
         List<GroupDefinition> groups = parent.getGroups();
         if (groups != null && !groups.isEmpty()) {
             List<GroupDataDefinition> groupToUpdate = groups.stream()
-                                                            .filter(g -> g.getArtifacts() != null && g.getArtifacts()
-                                                                                                      .contains(artifactInfo
-                                                                                                              .getUniqueId()))
-                                                            .collect(Collectors.toList());
+                    .filter(g -> g.getArtifacts() != null && g.getArtifacts()
+                            .contains(artifactInfo
+                                    .getUniqueId()))
+                    .collect(Collectors.toList());
             if (groupToUpdate != null && !groupToUpdate.isEmpty()) {
                 groupToUpdate.forEach(g -> {
                     g.getArtifacts().remove(artifactInfo.getUniqueId());
                     g.getArtifactsUuid().remove(artifactInfo.getArtifactUUID());
                     g.getArtifacts().add(artAfterUpdate.getUniqueId());
                     g.getArtifactsUuid().add(artAfterUpdate.getArtifactUUID());
+                    if(!artifactInfo.getArtifactUUID().equals(artAfterUpdate.getArtifactUUID())){
+                        g.setGroupUUID(UniqueIdBuilder.generateUUID());
+                    }
                 });
                 Either<List<GroupDefinition>, StorageOperationStatus> status = toscaOperationFacade.updateGroupsOnComponent(parent, groupToUpdate);
                 if (status.isRight()) {
                     log.debug(FAILED_UPDATE_GROUPS, parent.getUniqueId());
-                    return componentsUtils.convertFromStorageResponse(status.right().value());
+                    throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status.right().value()));
                 }
             }
         }
         return ActionStatus.OK;
     }
 
-    private ActionStatus updateGroupForHeat(ArtifactDefinition artifactInfoHeat, ArtifactDefinition artHeatAfterUpdate, ArtifactDefinition artifactInfoHeatE, ArtifactDefinition artHEAfterUpdate, Component parent, ComponentTypeEnum componentType) {
+    @VisibleForTesting
+    ActionStatus updateGroupForHeat(ArtifactDefinition artifactInfoHeat, ArtifactDefinition artHeatAfterUpdate, ArtifactDefinition artifactInfoHeatE, ArtifactDefinition artHEAfterUpdate, Component parent) {
         List<GroupDefinition> groups = parent.getGroups();
         if (groups != null && !groups.isEmpty()) {
             List<GroupDataDefinition> groupToUpdate = groups.stream()
-                                                            .filter(g -> g.getArtifacts() != null && g.getArtifacts()
-                                                                                                      .contains(artifactInfoHeat
-                                                                                                              .getUniqueId()))
-                                                            .collect(Collectors.toList());
+                    .filter(g -> g.getArtifacts() != null && g.getArtifacts()
+                            .contains(artifactInfoHeat
+                                    .getUniqueId()))
+                    .collect(Collectors.toList());
             if (groupToUpdate != null && !groupToUpdate.isEmpty()) {
                 groupToUpdate.forEach(g -> {
                     g.getArtifacts().remove(artifactInfoHeat.getUniqueId());
@@ -541,13 +576,13 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return ActionStatus.OK;
     }
 
-    private ActionStatus updateGroupInstance(ArtifactDefinition artifactInfo, ArtifactDefinition artAfterUpdate, Component parent, ComponentTypeEnum componentType, String parentId) {
+    private ActionStatus updateGroupInstance(ArtifactDefinition artifactInfo, ArtifactDefinition artAfterUpdate, Component parent, String parentId) {
         List<GroupInstance> updatedGroupInstances = new ArrayList<>();
         List<GroupInstance> groupInstances = null;
         Optional<ComponentInstance> componentInstOp = parent.getComponentInstances()
-                                                            .stream()
-                                                            .filter(ci -> ci.getUniqueId().equals(parentId))
-                                                            .findFirst();
+                .stream()
+                .filter(ci -> ci.getUniqueId().equals(parentId))
+                .findFirst();
         if (componentInstOp.isPresent()) {
             groupInstances = componentInstOp.get().getGroupInstances();
         }
@@ -556,15 +591,15 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             for (GroupInstance groupInstance : groupInstances) {
                 isUpdated = false;
                 if (CollectionUtils.isNotEmpty(groupInstance.getGroupInstanceArtifacts()) && groupInstance.getGroupInstanceArtifacts()
-                                                                                                          .contains(artifactInfo
-                                                                                                                  .getUniqueId())) {
+                        .contains(artifactInfo
+                                .getUniqueId())) {
                     groupInstance.getGroupInstanceArtifacts().remove(artifactInfo.getUniqueId());
                     groupInstance.getGroupInstanceArtifacts().add(artAfterUpdate.getUniqueId());
                     isUpdated = true;
                 }
                 if (CollectionUtils.isNotEmpty(groupInstance.getGroupInstanceArtifactsUuid()) && groupInstance.getGroupInstanceArtifactsUuid()
-                                                                                                              .contains(artifactInfo
-                                                                                                                      .getArtifactUUID())) {
+                        .contains(artifactInfo
+                                .getArtifactUUID())) {
                     groupInstance.getGroupInstanceArtifactsUuid().remove(artifactInfo.getArtifactUUID());
                     groupInstance.getGroupInstanceArtifacts().add(artAfterUpdate.getArtifactUUID());
                     isUpdated = true;
@@ -582,121 +617,77 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return ActionStatus.OK;
     }
 
-    Either<Either<ArtifactDefinition, Operation>, ResponseFormat> generateNotSavedArtifact(Component parent, ArtifactDefinition artifactInfo) {
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> result;
+    ArtifactDefinition generateNotSavedArtifact(Component parent, ArtifactDefinition artifactInfo) {
         if (artifactInfo.getArtifactGroupType() == ArtifactGroupTypeEnum.TOSCA) {
-            result = generateToscaArtifact(parent, artifactInfo, false, false);
+            return generateToscaArtifact(parent, artifactInfo, false, false);
         }
         else {
             String heatArtifactId = artifactInfo.getGeneratedFromId();
             Either<ArtifactDefinition, StorageOperationStatus> heatRes = artifactToscaOperation.getArtifactById(parent.getUniqueId(), heatArtifactId);
             if (heatRes.isRight()) {
-                log.debug("Failed to fetch heat artifact by generated id {} for heat env {}", heatArtifactId, artifactInfo
-                        .getUniqueId());
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(heatRes
-                        .right()
-                        .value()), "");
-                return Either.right(responseFormat);
+                log.debug("Failed to fetch heat artifact by generated id {} for heat env {}", heatArtifactId, artifactInfo.getUniqueId());
+                throw new StorageException(heatRes.right().value());
             }
             String generatedPayload = generateHeatEnvPayload(heatRes.left().value());
             artifactInfo.setPayloadData(generatedPayload);
-            result = Either.left(Either.left(artifactInfo));
+            return artifactInfo;
         }
-        return result;
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleUpdateHeatWithHeatEnvParams(String componentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, String artifactId, User user,
-                                                                                                            ComponentTypeEnum componentType, Component parent, String originData, String origMd5, ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction, boolean needToUpdateGroup) {
-        convertParentType(componentType);
-        String parentId = parent.getUniqueId();
+    private Either<ArtifactDefinition, Operation> handleUpdateHeatWithHeatEnvParams(String componentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction,
+                                                                                    ComponentTypeEnum componentType, Component parent, String originData, String origMd5, ArtifactOperationInfo operation,
+                                                                                    boolean needToUpdateGroup) {
         Either<ArtifactDefinition, StorageOperationStatus> artifactHeatRes = artifactToscaOperation.getArtifactById(componentId, artifactInfo
                 .getGeneratedFromId());
         ArtifactDefinition currHeatArtifact = artifactHeatRes.left().value();
-
         if (origMd5 != null) {
-            Either<Boolean, ResponseFormat> validateMd5 = validateMd5(origMd5, originData, artifactInfo.getPayloadData(), operation);
-            if (validateMd5.isRight()) {
-                ResponseFormat responseFormat = validateMd5.right().value();
-                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                return Either.right(responseFormat);
-            }
-
-            if (artifactInfo.getPayloadData() != null && artifactInfo.getPayloadData().length != 0) {
-
-                Either<byte[], ResponseFormat> payloadEither = handlePayload(artifactInfo, isArtifactMetadataUpdate(auditingAction));
-                if (payloadEither.isRight()) {
-                    ResponseFormat responseFormat = payloadEither.right().value();
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    return Either.right(responseFormat);
-                }
-            }
-            else { // duplicate
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_DATA, ARTIFACT_PAYLOAD);
-                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                return Either.right(responseFormat);
+            validateMd5(origMd5, originData, artifactInfo.getPayloadData(), operation);
+            if (ArrayUtils.isNotEmpty(artifactInfo.getPayloadData())) {
+                handlePayload(artifactInfo, isArtifactMetadataUpdate(auditingAction));
+            } else { // duplicate
+                throw new ByActionStatusComponentException(ActionStatus.MISSING_DATA, ARTIFACT_PAYLOAD);
             }
         }
+        return updateHeatParams(componentId, artifactInfo, auditingAction, parent, componentType, currHeatArtifact, needToUpdateGroup);
+    }
 
-        // lock resource
-        if (shouldLock) {
-            Either<Boolean, ResponseFormat> lockComponent = lockComponent(parent, UPDATE_ARTIFACT_LOCK);
-            if (lockComponent.isRight()) {
-                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, lockComponent.right()
-                                                                                                            .value(), componentType, null);
-                return Either.right(lockComponent.right().value());
+    private void handleLockingAndCommit(Component parent, boolean shouldLock, boolean inTransaction, boolean actionSucceeded) {
+        if (actionSucceeded) {
+            log.debug(COMMIT);
+            if (!inTransaction) {
+                janusGraphDao.commit();
             }
-        }
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        try {
-            resultOp = updateHeatParams(componentId, artifactId, artifactInfo, user, auditingAction, parent, componentType, currHeatArtifact, needToUpdateGroup);
-            return resultOp;
-
-        }
-        finally {
-            // unlock resource
-            if (resultOp == null || resultOp.isRight()) {
-                log.debug(ROLLBACK);
-                if (!inTransaction) {
+        } else {
+            log.debug(ROLLBACK);
+            if (!inTransaction) {
                     janusGraphDao.rollback();
-                }
-            }
-            else {
-                log.debug(COMMIT);
-                if (!inTransaction) {
-                    janusGraphDao.commit();
-                }
-            }
-            if (shouldLock) {
-                graphLockOperation.unlockComponent(parent.getUniqueId(), parent.getComponentType().getNodeType());
             }
         }
+        if (shouldLock) {
+            graphLockOperation.unlockComponent(parent.getUniqueId(), parent.getComponentType().getNodeType());
+        }
     }
 
-    public Either<ImmutablePair<String, byte[]>, ResponseFormat> handleDownloadToscaModelRequest(Component component, ArtifactDefinition csarArtifact) {
+    public ImmutablePair<String, byte[]> handleDownloadToscaModelRequest(Component component, ArtifactDefinition csarArtifact) {
         if (artifactGenerationRequired(component, csarArtifact)) {
             Either<byte[], ResponseFormat> generated = csarUtils.createCsar(component, false, false);
 
             if (generated.isRight()) {
                 log.debug("Failed to export tosca csar for component {} error {}", component.getUniqueId(), generated.right()
-                                                                                                                     .value());
-
-                return Either.right(generated.right().value());
+                        .value());
+                throw new ByResponseFormatComponentException(generated.right().value());
             }
-            return Either.left(new ImmutablePair<String, byte[]>(csarArtifact.getArtifactName(), generated.left()
-                                                                                                          .value()));
+            return new ImmutablePair<>(csarArtifact.getArtifactName(), generated.left().value());
         }
         return downloadArtifact(csarArtifact);
     }
 
-    public Either<ImmutablePair<String, byte[]>, ResponseFormat> handleDownloadRequestById(String componentId, String artifactId, String userId, ComponentTypeEnum componentType, String parentId, String containerComponentType) {
+    public ImmutablePair<String, byte[]> handleDownloadRequestById(String componentId, String artifactId, String userId, ComponentTypeEnum componentType, String parentId, String containerComponentType) {
         // perform all validation in common flow
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> result = handleArtifactRequest(componentId, userId, componentType, new ArtifactOperationInfo(false, false, ArtifactOperationEnum.DOWNLOAD), artifactId, null, null, null, null,
+        Either<ArtifactDefinition, Operation> result = handleArtifactRequest(componentId, userId, componentType, new ArtifactOperationInfo(false, false, ArtifactOperationEnum.DOWNLOAD), artifactId, null, null, null, null,
                 null, parentId, containerComponentType);
-        if (result.isRight()) {
-            return Either.right(result.right().value());
-        }
         ArtifactDefinition artifactDefinition;
-        Either<ArtifactDefinition, Operation> insideValue = result.left().value();
+        Either<ArtifactDefinition, Operation> insideValue = result;
         if (insideValue.isLeft()) {
             artifactDefinition = insideValue.left().value();
         }
@@ -705,39 +696,35 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         }
         // for tosca artifacts and heat env on VF level generated on download without saving
         if (artifactDefinition.getPayloadData() != null) {
-            return Either.left(new ImmutablePair<String, byte[]>(artifactDefinition.getArtifactName(), artifactDefinition
+            return (new ImmutablePair<>(artifactDefinition.getArtifactName(), artifactDefinition
                     .getPayloadData()));
         }
         return downloadArtifact(artifactDefinition);
     }
 
-    public Either<Map<String, ArtifactDefinition>, ResponseFormat> handleGetArtifactsByType(String containerComponentType, String parentId, ComponentTypeEnum componentType, String componentId, String artifactGroupType, String userId) {
+    public Map<String, ArtifactDefinition> handleGetArtifactsByType(String containerComponentType, String parentId, ComponentTypeEnum componentType, String componentId, String artifactGroupType, String userId) {
         // step 1
         // detect auditing type
         Map<String, ArtifactDefinition> resMap = null;
-        Either<Map<String, ArtifactDefinition>, ResponseFormat> resultOp = null;
+//        Either<Map<String, ArtifactDefinition>, ResponseFormat> resultOp = null;
 
         new Wrapper<>();
         // step 2
         // check header
         if (userId == null) {
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
             log.debug("handleGetArtifactsByType - no HTTP_CSP_HEADER , component id {}", componentId);
-
-            resultOp = Either.right(responseFormat);
-            return resultOp;
+            throw new ByActionStatusComponentException(ActionStatus.MISSING_INFORMATION);
         }
         // step 3
         // check user existence
         // step 4
         // check user's role
 
-        validateUserExists(userId, "get artifacts", false);
+        validateUserExists(userId);
         // steps 5 - 6 - 7
         // 5. check service/resource existence
         // 6. check service/resource check out
         // 7. user is owner of checkout state
-        org.openecomp.sdc.be.model.Component component = null;
         String realComponentId = componentType == ComponentTypeEnum.RESOURCE_INSTANCE ? parentId : componentId;
         ComponentParametersView componentFilter = new ComponentParametersView();
         componentFilter.disableAll();
@@ -746,68 +733,50 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             componentFilter.setIgnoreComponentInstances(false);
         }
 
-        Either<? extends org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponent = validateComponentExistsByFilter(realComponentId, ComponentTypeEnum
+        Component component = validateComponentExistsByFilter(realComponentId, ComponentTypeEnum
                 .findByParamName(containerComponentType), componentFilter);
-
-        if (validateComponent.isRight()) {
-            resultOp = Either.right(validateComponent.right().value());
-            return resultOp;
-        }
-        component = validateComponent.left().value();
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(component, UPDATE_ARTIFACT_LOCK);
-        if (lockComponent.isRight()) {
-
-            resultOp = Either.right(lockComponent.right().value());
-            return resultOp;
-        }
-
+        lockComponent(component, ARTIFACT_ACTION_LOCK);
+        boolean failed = false;
         try {
             ArtifactGroupTypeEnum groupType = ArtifactGroupTypeEnum.findType(artifactGroupType);
 
             if (groupType == null) {
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
-                log.debug("handleGetArtifactsByType - not falid groupType {} , component id {}", artifactGroupType, componentId);
-
-                resultOp = Either.right(responseFormat);
-                return resultOp;
-
+                log.debug("handleGetArtifactsByType - not failed groupType {} , component id {}", artifactGroupType, componentId);
+                throw new ByActionStatusComponentException(ActionStatus.MISSING_INFORMATION);
             }
             if (groupType == ArtifactGroupTypeEnum.DEPLOYMENT) {
                 List<ArtifactDefinition> list = getDeploymentArtifacts(component, componentType.getNodeType(), componentId);
                 if (list != null && !list.isEmpty()) {
-                    resMap = list.stream().collect(Collectors.toMap(a -> a.getArtifactLabel(), a -> a));
+                    resMap = list.stream().collect(Collectors.toMap(ArtifactDataDefinition::getArtifactLabel, Function.identity()));
                 }
                 else {
                     resMap = new HashMap<>();
                 }
-                resultOp = Either.left(resMap);
-                return resultOp;
-            }
-            else {
+                return resMap;
+            } else {
 
                 Either<Map<String, ArtifactDefinition>, StorageOperationStatus> artifactsMapStatus = getArtifacts(realComponentId, componentType
                         .getNodeType(), groupType, componentId);
                 if (artifactsMapStatus.isRight()) {
                     if (artifactsMapStatus.right().value() != StorageOperationStatus.NOT_FOUND) {
-                        ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_INFORMATION);
-                        log.debug("handleGetArtifactsByType - not falid groupType {} , component id {}", artifactGroupType, componentId);
-                        resultOp = Either.right(responseFormat);
+                        log.debug("handleGetArtifactsByType - not failed groupType {} , component id {}", artifactGroupType, componentId);
+                        throw new ByActionStatusComponentException(ActionStatus.MISSING_INFORMATION);
                     }
                     else {
                         resMap = new HashMap<>();
-                        resultOp = Either.left(resMap);
                     }
                 }
                 else {
                     resMap = artifactsMapStatus.left().value();
-                    resultOp = Either.left(resMap);
                 }
-                return resultOp;
+                return resMap;
             }
-        }
-        finally {
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        } finally {
             // unlock resource
-            if (resultOp == null || resultOp.isRight()) {
+            if (failed) {
                 log.debug(ROLLBACK);
                 janusGraphDao.rollback();
             }
@@ -823,30 +792,15 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> validateArtifact(String componentId, ComponentTypeEnum componentType, String artifactId, Component component) {
-        // step 9
+    private ArtifactDefinition getArtifactIfBelongsToComponent(String componentId, ComponentTypeEnum componentType, String artifactId, Component component) {
         // check artifact existence
-        Either<ArtifactDefinition, StorageOperationStatus> artifactResult = artifactToscaOperation.getArtifactById(componentId, artifactId, componentType, component
-                .getUniqueId());
+        Either<ArtifactDefinition, StorageOperationStatus> artifactResult = artifactToscaOperation.getArtifactById(componentId, artifactId,
+                componentType, component.getUniqueId());
         if (artifactResult.isRight()) {
-            if (artifactResult.right().value().equals(StorageOperationStatus.ARTIFACT_NOT_FOUND)) {
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, "");
-                log.debug("addArtifact - artifact {} not found", artifactId);
-                return Either.right(responseFormat);
-
-            }
-            else {
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(artifactResult
-                        .right()
-                        .value()));
-                log.debug("addArtifact - failed to fetch artifact {}, error {}", artifactId, artifactResult.right()
-                                                                                                           .value());
-                return Either.right(responseFormat);
-            }
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_ARTIFACT_NOT_FOUND, artifactId, componentId);
         }
-        // step 9.1
-        // check artifact belong to component
-        boolean found = false;
+        // verify artifact belongs to component
+        boolean found;
         switch (componentType) {
             case RESOURCE:
             case SERVICE:
@@ -856,137 +810,86 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 found = checkArtifactInResourceInstance(component, componentId, artifactId);
                 break;
             default:
-
+                found = false;
         }
         if (!found) {
-            String componentName = componentType.name().toLowerCase();
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_ARTIFACT_NOT_FOUND, componentName);
-            log.debug("addArtifact - Component artifact not found component Id {}, artifact id {}", componentId, artifactId);
-            return Either.right(responseFormat);
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_ARTIFACT_NOT_FOUND, artifactId, componentType.name().toLowerCase());
         }
-        return Either.left(artifactResult.left().value());
+        return artifactResult.left().value();
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleCreate(String componentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, AuditingActionEnum auditingAction, User user, ComponentTypeEnum componentType,
-                                                                                       org.openecomp.sdc.be.model.Component parent, String origMd5, String originData, String interfaceType, String operationName, boolean shouldLock, boolean inTransaction) {
-
-        String artifactId = null;
-
-        // step 11
-        Either<byte[], ResponseFormat> payloadEither = validateInput(componentId, artifactInfo, operation, auditingAction, artifactId, user, componentType, parent, origMd5, originData, interfaceType, operationName);
-        if (payloadEither.isRight()) {
-            return Either.right(payloadEither.right().value());
-        }
-        byte[] decodedPayload = payloadEither.left().value();
-        convertParentType(componentType);
+    private Either<ArtifactDefinition, Operation> handleCreate(String componentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, AuditingActionEnum auditingAction, User user, ComponentTypeEnum componentType,
+                                                               Component parent, String origMd5, String originData, String interfaceType, String operationName) {
+        byte[] decodedPayload = validateInput(componentId, artifactInfo, operation, auditingAction, null, user, componentType, parent, origMd5, originData, interfaceType, operationName);
+        return createArtifact(parent, componentId, artifactInfo, decodedPayload, componentType, auditingAction, interfaceType, operationName);
+    }
 
-        if (shouldLock) {
-            Either<Boolean, ResponseFormat> lockComponent = lockComponent(parent, "Upload Artifact - lock ");
-            if (lockComponent.isRight()) {
-                handleAuditing(auditingAction, parent, componentId, user, null, null, null, lockComponent.right()
-                                                                                                         .value(), componentType, null);
-                return Either.right(lockComponent.right().value());
-            }
+    private ArtifactDefinition handleLink(String componentId, ArtifactDefinition artifactInfo, ComponentTypeEnum componentType,
+                                          Component parent) {
+        ComponentInstance foundInstance = findComponentInstance(componentId, parent);
+        String instanceId = null;
+        if (foundInstance != null) {
+            instanceId = foundInstance.getUniqueId();
         }
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-
-        try {
-            resultOp = createArtifact(parent, componentId, artifactInfo, decodedPayload, user, componentType, auditingAction, interfaceType, operationName);
-            return resultOp;
+        NodeTypeEnum nodeType = convertParentType(componentType);
+        Either<ArtifactDefinition, StorageOperationStatus> artifactDefinitionEither = artifactToscaOperation.addArtifactToComponent(artifactInfo, parent,
+                nodeType, true, instanceId);
+        if (artifactDefinitionEither.isRight()) {
+            throw new StorageException(artifactDefinitionEither.right().value(), artifactInfo.getArtifactDisplayName());
         }
-        finally {
-            if (shouldLock) {
-                unlockComponent(resultOp, parent, inTransaction);
-            }
-
+        if (generateCustomizationUUIDOnInstance(parent.getUniqueId(), componentId, componentType) != StorageOperationStatus.OK) {
+            throw new StorageException(artifactDefinitionEither.right().value(), artifactInfo.getArtifactDisplayName());
         }
-
+        return artifactDefinitionEither.left().value();
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleLink(String componentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, User user, ComponentTypeEnum componentType,
-                                                                                     Component parent, boolean shouldLock, boolean inTransaction) {
-
-        if (shouldLock) {
-            Either<Boolean, ResponseFormat> lockComponent = lockComponent(parent, "Upload Artifact - lock ");
-            if (lockComponent.isRight()) {
-                handleAuditing(auditingAction, parent, componentId, user, null, null, null, lockComponent.right()
-                                                                                                         .value(), componentType, null);
-                return Either.right(lockComponent.right().value());
-            }
-        }
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
+    private Either<ArtifactDefinition, Operation> lockComponentAndUpdateArtifact(
+            String parentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, String artifactId,
+            User user, ComponentTypeEnum componentType, Component parent, byte[] decodedPayload, String interfaceType,
+            String operationName, boolean shouldLock, boolean inTransaction) {
 
+        Either<ArtifactDefinition, Operation> resultOp = null;
+        boolean failed = false;
+        boolean writeAudit = true;
         try {
-            resultOp = createAndLinkArtifact(parent, componentId, artifactInfo, user, componentType, auditingAction);
+            lockComponent(parent, shouldLock, ARTIFACT_ACTION_LOCK);
+            writeAudit = false;
+            resultOp = updateArtifactFlow(parent, parentId, artifactId, artifactInfo, decodedPayload, componentType, auditingAction, interfaceType, operationName);
             return resultOp;
         }
-        finally {
-            if (shouldLock) {
-                unlockComponent(resultOp, parent, inTransaction);
-            }
-
-        }
-
-    }
-
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> lockComponentAndUpdateArtifact(String parentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, String artifactId, User user,
-                                                                                                         ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component parent, byte[] decodedPayload, String interfaceType, String operationName, boolean shouldLock, boolean inTransaction) {
-
-        convertParentType(componentType);
-
-        // lock resource
-        if (shouldLock) {
-            Either<Boolean, ResponseFormat> lockComponent = lockComponent(parent, UPDATE_ARTIFACT_LOCK);
-
-            if (lockComponent.isRight()) {
-                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, lockComponent.right()
-                                                                                                            .value(), componentType, null);
-                return Either.right(lockComponent.right().value());
+        catch (ComponentException ce) {
+            if(writeAudit) {
+                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, ce.getResponseFormat(), componentType, null);
             }
+            failed = true;
+            throw ce;
         }
-
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        try {
-            resultOp = updateArtifactFlow(parent, parentId, artifactId, artifactInfo, user, decodedPayload, componentType, auditingAction, interfaceType, operationName);
-            return resultOp;
-
+        catch (StorageException se) {
+            //TODO: audit
+            failed = true;
+            throw se;
         }
         finally {
             if (shouldLock) {
-                unlockComponent(resultOp, parent, inTransaction);
+                unlockComponent(failed, parent, inTransaction);
             }
         }
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleUpdate(String parentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, AuditingActionEnum auditingAction, String artifactId, User user,
-                                                                                       ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component parent, String origMd5, String originData, String interfaceType, String operationName, boolean shouldLock, boolean inTransaction) {
-
-        Either<byte[], ResponseFormat> payloadEither = validateInput(parentId, artifactInfo, operation, auditingAction, artifactId, user, componentType, parent, origMd5, originData, interfaceType, operationName);
-
-        if (payloadEither.isRight()) {
-            return Either.right(payloadEither.right().value());
-        }
-        byte[] decodedPayload = payloadEither.left().value();
-
-        return lockComponentAndUpdateArtifact(parentId, artifactInfo, auditingAction, artifactId, user, componentType, parent, decodedPayload, interfaceType, operationName, shouldLock, inTransaction);
+    private byte[] validateInput(String componentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, AuditingActionEnum auditingAction, String artifactId, User user, ComponentTypeEnum componentType,
+                                 Component parent, String origMd5, String originData, String interfaceType, String operationName) {
+        validateMd5(origMd5, originData, artifactInfo.getPayloadData(), operation);
+        return getValidPayload(componentId, artifactInfo, operation, auditingAction, artifactId, user, componentType, parent, interfaceType, operationName);
     }
 
-    private Either<byte[], ResponseFormat> validateInput(String componentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, AuditingActionEnum auditingAction, String artifactId, User user, ComponentTypeEnum componentType,
-                                                         Component parent, String origMd5, String originData, String interfaceType, String operationName) {
-        // Md5 validations
-        Either<Boolean, ResponseFormat> validateMd5 = validateMd5(origMd5, originData, artifactInfo.getPayloadData(), operation);
-        if (validateMd5.isRight()) {
-            ResponseFormat responseFormat = validateMd5.right().value();
-            handleAuditing(auditingAction, parent, componentId, user, null, null, artifactId, responseFormat, componentType, null);
-            return Either.right(responseFormat);
-        }
-
+    private byte[] getValidPayload(String componentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, AuditingActionEnum auditingAction,
+                                   String artifactId, User user, ComponentTypeEnum componentType, Component parent, String interfaceType, String operationName) {
         // step 11
         Either<ArtifactDefinition, ResponseFormat> validateResult = validateInput(componentId, artifactInfo, operation, artifactId, user, interfaceType, operationName, componentType, parent);
         if (validateResult.isRight()) {
             ResponseFormat responseFormat = validateResult.right().value();
             handleAuditing(auditingAction, parent, componentId, user, null, null, artifactId, responseFormat, componentType, null);
-            return Either.right(validateResult.right().value());
+            throw new ByResponseFormatComponentException(responseFormat);
         }
 
         Either<byte[], ResponseFormat> payloadEither = handlePayload(artifactInfo, isArtifactMetadataUpdate(auditingAction));
@@ -994,24 +897,24 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             ResponseFormat responseFormat = payloadEither.right().value();
             handleAuditing(auditingAction, parent, componentId, user, null, null, artifactId, responseFormat, componentType, null);
             log.debug("Error during handle payload");
-            return Either.right(responseFormat);
+            throw new ByResponseFormatComponentException(responseFormat);
         }
-
         // validate heat parameters. this part must be after the parameters are
         // extracted in "handlePayload"
-        Either<ArtifactDefinition, ResponseFormat> validateAndConvertHeatParamers = validateAndConvertHeatParamers(artifactInfo, artifactInfo
+        Either<ArtifactDefinition, ResponseFormat> validateAndConvertHeatParameters = validateAndConvertHeatParameters(artifactInfo, artifactInfo
                 .getArtifactType());
-        if (validateAndConvertHeatParamers.isRight()) {
-            ResponseFormat responseFormat = validateAndConvertHeatParamers.right().value();
+        if (validateAndConvertHeatParameters.isRight()) {
+            ResponseFormat responseFormat = validateAndConvertHeatParameters.right().value();
             handleAuditing(auditingAction, parent, componentId, user, artifactInfo, null, artifactId, responseFormat, componentType, null);
             log.debug("Error during handle payload");
-            return Either.right(responseFormat);
+            throw new ByResponseFormatComponentException(responseFormat);
         }
-        return payloadEither;
+        return payloadEither.left().value();
     }
 
-    public void handleAuditing(AuditingActionEnum auditingActionEnum, Component component, String componentId, User user, ArtifactDefinition artifactDefinition, String prevArtifactUuid, String currentArtifactUuid, ResponseFormat responseFormat,
-                               ComponentTypeEnum componentTypeEnum, String resourceInstanceName) {
+    public void handleAuditing(AuditingActionEnum auditingActionEnum, Component component, String componentId, User user,
+                               ArtifactDefinition artifactDefinition, String prevArtifactUuid, String currentArtifactUuid,
+                               ResponseFormat responseFormat, ComponentTypeEnum componentTypeEnum, String resourceInstanceName) {
 
         if (componentsUtils.isExternalApiEvent(auditingActionEnum)) {
             return;
@@ -1077,10 +980,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
     private String getResourceInstanceNameFromComponent(Component component, String componentId) {
         ComponentInstance resourceInstance = component.getComponentInstances()
-                                                      .stream()
-                                                      .filter(p -> p.getUniqueId().equals(componentId))
-                                                      .findFirst()
-                                                      .orElse(null);
+                .stream()
+                .filter(p -> p.getUniqueId().equals(componentId))
+                .findFirst()
+                .orElse(null);
         String resourceInstanceName = null;
         if (resourceInstance != null) {
             resourceInstanceName = resourceInstance.getName();
@@ -1088,83 +991,40 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return resourceInstanceName;
     }
 
-    private String buildAuditingArtifactData(ArtifactDefinition artifactDefinition) {
-        StringBuilder sb = new StringBuilder();
-        if (artifactDefinition != null) {
-            sb.append(artifactDefinition.getArtifactGroupType().getType())
-              .append(",")
-              .append("'")
-              .append(artifactDefinition.getArtifactLabel())
-              .append("'")
-              .append(",")
-              .append(artifactDefinition.getArtifactType())
-              .append(",")
-              .append(artifactDefinition.getArtifactName())
-              .append(",")
-              .append(artifactDefinition.getTimeout())
-              .append(",")
-              .append(artifactDefinition.getEsId());
-
-            sb.append(",");
-            if (artifactDefinition.getArtifactVersion() != null) {
-
-                sb.append(artifactDefinition.getArtifactVersion());
-            }
-            else {
-                sb.append(" ");
-            }
-            sb.append(",");
-            if (artifactDefinition.getArtifactUUID() != null) {
-                sb.append(artifactDefinition.getArtifactUUID());
+    private void validateMd5(String origMd5, String originData, byte[] payload, ArtifactOperationInfo operation) {
+        if (origMd5 == null) {
+            if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum()) && ArrayUtils.isNotEmpty(payload)) {
+                log.debug("Missing md5 header during artifact create");
+                throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_INVALID_MD5);
             }
-            else {
-                sb.append(" ");
+            // Update metadata
+            if (ArrayUtils.isNotEmpty(payload)) {
+                log.debug("Cannot have payload while md5 header is missing");
+                throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
             }
-        }
-        return sb.toString();
-    }
-
-    private Either<Boolean, ResponseFormat> validateMd5(String origMd5, String originData, byte[] payload, ArtifactOperationInfo operation) {
-
-        if (origMd5 != null) {
+        } else {
             String encodeBase64Str = GeneralUtility.calculateMD5Base64EncodedByString(originData);
             if (!encodeBase64Str.equals(origMd5)) {
                 log.debug("The calculated md5 is different then the received one");
-                return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_INVALID_MD5));
-            }
-        }
-        else {
-            if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum()) && payload != null && payload.length != 0) {
-                log.debug("Missing md5 header during artifact create");
-                return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_INVALID_MD5));
-            }
-            // Update metadata
-            if (payload != null && payload.length != 0) {
-                log.debug("Cannot have payload while md5 header is missing");
-                return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+                throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_INVALID_MD5);
             }
         }
-        return Either.left(true);
     }
 
     private Either<ArtifactDefinition, ResponseFormat> validateInput(String componentId, ArtifactDefinition artifactInfo, ArtifactOperationInfo operation, String artifactId, User user, String interfaceName, String operationName,
                                                                      ComponentTypeEnum componentType, Component parentComponent) {
 
-        Either<ArtifactDefinition, ResponseFormat> artifactById = findArtifactOnParentComponent(parentComponent, componentType, componentId, operation, artifactId);
-        if (artifactById.isRight()) {
-            return Either.right(artifactById.right().value());
-        }
-        ArtifactDefinition currentArtifactInfo = artifactById.left().value();
-
+        ArtifactDefinition currentArtifactInfo = findArtifactOnParentComponent(parentComponent, componentType, componentId, operation, artifactId);
         ignoreUnupdateableFieldsInUpdate(operation, artifactInfo, currentArtifactInfo);
-        Either<Boolean, ResponseFormat> validateInformationalArtifactRes = validateInformationalArtifact(artifactInfo, parentComponent);
-        if (validateInformationalArtifactRes.isRight()) {
-            return Either.right(validateInformationalArtifactRes.right().value());
-        }
-        Either<Boolean, ResponseFormat> validateAndSetArtifactname = validateAndSetArtifactname(artifactInfo);
+        validateInformationalArtifact(artifactInfo, parentComponent);
+        Either<Boolean, ResponseFormat> validateAndSetArtifactname = validateAndSetArtifactName(
+                artifactInfo);
         if (validateAndSetArtifactname.isRight()) {
             return Either.right(validateAndSetArtifactname.right().value());
         }
+        if (!validateArtifactNameUniqueness(componentId, parentComponent, artifactInfo, componentType)) {
+            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_EXIST));
+        }
         if (operationName != null && interfaceName != null) {
             operationName = operationName.toLowerCase();
             interfaceName = interfaceName.toLowerCase();
@@ -1196,15 +1056,14 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 return Either.right(validateGroupType.right().value());
             }
         }
+        // TODO TEMP !!!
         NodeTypeEnum parentType = convertParentType(componentType);
 
+        // TODO TEMP !!!
         boolean isCreate = ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum());
 
         if (isDeploymentArtifact(artifactInfo)) {
-            Either<Boolean, ResponseFormat> deploymentValidationResult = validateDeploymentArtifact(parentComponent, componentId, isCreate, artifactInfo, currentArtifactInfo, parentType);
-            if (deploymentValidationResult.isRight()) {
-                return Either.right(deploymentValidationResult.right().value());
-            }
+            validateDeploymentArtifact(parentComponent, componentId, isCreate, artifactInfo, currentArtifactInfo, parentType);
         }
         else {
             artifactInfo.setTimeout(NodeTemplateOperation.NON_HEAT_TIMEOUT);
@@ -1215,8 +1074,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             return Either.right(descriptionResult.right().value());
         }
 
-        if (currentArtifactInfo != null && currentArtifactInfo.getArtifactGroupType()
-                                                              .equals(ArtifactGroupTypeEnum.SERVICE_API)) {
+        if (currentArtifactInfo != null && currentArtifactInfo.getArtifactGroupType() == ArtifactGroupTypeEnum.SERVICE_API) {
             Either<ActionStatus, ResponseFormat> validateServiceApiType = validateArtifactType(user.getUserId(), artifactInfo, parentType);
             if (validateServiceApiType.isRight()) {
                 return Either.right(validateServiceApiType.right().value());
@@ -1256,32 +1114,28 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     }
 
     private void ignoreUnupdateableFieldsInUpdate(ArtifactOperationInfo operation, ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifactInfo) {
-        if (operation.getArtifactOperationEnum().equals(ArtifactOperationEnum.UPDATE)) {
+        if (operation.getArtifactOperationEnum() == ArtifactOperationEnum.UPDATE) {
             artifactInfo.setArtifactType(currentArtifactInfo.getArtifactType());
             artifactInfo.setArtifactGroupType(currentArtifactInfo.getArtifactGroupType());
             artifactInfo.setArtifactLabel(currentArtifactInfo.getArtifactLabel());
         }
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> findArtifactOnParentComponent(Component parentComponent, ComponentTypeEnum componentType, String parentId, ArtifactOperationInfo operation, String artifactId) {
+    private ArtifactDefinition findArtifactOnParentComponent(Component parentComponent, ComponentTypeEnum componentType, String parentId, ArtifactOperationInfo operation, String artifactId) {
 
-        Either<ArtifactDefinition, ResponseFormat> result = null;
         ArtifactDefinition foundArtifact = null;
         if (StringUtils.isNotEmpty(artifactId)) {
             foundArtifact = findArtifact(parentComponent, componentType, parentId, artifactId);
         }
         if (foundArtifact != null && ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
             log.debug("Artifact {} already exist", artifactId);
-            result = Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_EXIST, foundArtifact.getArtifactLabel()));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_EXIST, foundArtifact.getArtifactLabel());
         }
         if (foundArtifact == null && !ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
             log.debug("The artifact {} was not found on parent {}. ", artifactId, parentId);
-            result = Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ""));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, "");
         }
-        if (result == null) {
-            result = Either.left(foundArtifact);
-        }
-        return result;
+        return foundArtifact;
     }
 
     private ArtifactDefinition findArtifact(Component parentComponent, ComponentTypeEnum componentType, String parentId, String artifactId) {
@@ -1296,41 +1150,38 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return foundArtifact;
     }
 
-    private Either<Boolean, ResponseFormat> validateInformationalArtifact(ArtifactDefinition artifactInfo, Component parentComponent) {
+    private void validateInformationalArtifact(ArtifactDefinition artifactInfo, Component parentComponent) {
         ComponentTypeEnum parentComponentType = parentComponent.getComponentType();
         ArtifactGroupTypeEnum groupType = artifactInfo.getArtifactGroupType();
-        Either<Boolean, ResponseFormat> validationResult = Either.left(true);
         ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(artifactInfo.getArtifactType());
         if (artifactType == null) {
-            validationResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo
-                    .getArtifactType()));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo.getArtifactType());
         }
         else if (parentComponentType == ComponentTypeEnum.RESOURCE && groupType == ArtifactGroupTypeEnum.INFORMATIONAL) {
             String artifactTypeName = artifactType.getType();
             ResourceTypeEnum parentResourceType = ((Resource) parentComponent).getResourceType();
             Map<String, ArtifactTypeConfig> resourceInformationalArtifacts = ConfigurationManager.getConfigurationManager()
-                                                                                                 .getConfiguration()
-                                                                                                 .getResourceInformationalArtifacts();
+                    .getConfiguration()
+                    .getResourceInformationalArtifacts();
             Set<String> validArtifactTypes = resourceInformationalArtifacts.keySet();
             if (!validArtifactTypes.contains(artifactTypeName)) {
-                validationResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactTypeName));
+                throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactTypeName);
             }
             else {
                 List<String> validResourceType = resourceInformationalArtifacts.get(artifactTypeName)
-                                                                               .getValidForResourceTypes();
+                        .getValidForResourceTypes();
                 if (!validResourceType.contains(parentResourceType.name())) {
-                    validationResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactTypeName));
+                    throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactTypeName);
                 }
             }
         }
-        return validationResult;
     }
 
     private NodeTypeEnum convertParentType(ComponentTypeEnum componentType) {
-        if (componentType.equals(ComponentTypeEnum.RESOURCE)) {
+        if (componentType == ComponentTypeEnum.RESOURCE) {
             return NodeTypeEnum.Resource;
         }
-        else if (componentType.equals(ComponentTypeEnum.RESOURCE_INSTANCE)) {
+        else if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
             return NodeTypeEnum.ResourceInstance;
         }
         else {
@@ -1338,213 +1189,133 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         }
     }
 
+    // This method is here for backward compatibility - when other parts of the code are cleaned can change to use the internal version
     public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleDelete(String parentId, String artifactId, User user, AuditingActionEnum auditingAction, ComponentTypeEnum componentType, Component parent,
                                                                                       boolean shouldLock, boolean inTransaction) {
+        ResponseFormat responseFormat;
+        boolean operationSucceeded = false;
+        if (shouldLock) {
+            lockComponent(componentType, artifactId, auditingAction, user, parent);
+        }
+        try {
+            ArtifactDefinition artifactDefinition = handleDeleteInternal(parentId, artifactId, componentType, parent);
+            operationSucceeded = true;
+            return Either.left(Either.left(artifactDefinition));
+        }
+        catch (ComponentException ce) {
+            responseFormat = componentsUtils.getResponseFormat(ce);
+            handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
+            return Either.right(responseFormat);
+        }
+        catch (StorageException se) {
+            responseFormat = componentsUtils.getResponseFormat(se);
+            handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
+            return Either.right(responseFormat);
+        } finally {
+            handleLockingAndCommit(parent, shouldLock, inTransaction, operationSucceeded);
+        }
+    }
 
+    private ArtifactDefinition handleDeleteInternal(String parentId, String artifactId, ComponentTypeEnum componentType, Component parent) {
         NodeTypeEnum parentType = convertParentType(componentType);
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        Either<ImmutablePair<ArtifactDefinition, ComponentInstance>, ActionStatus> getArtifactRes = null;
-        ArtifactDefinition foundArtifact = null;
-        ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-        Either<org.openecomp.sdc.be.model.Component, StorageOperationStatus> getContainerRes = null;
-        org.openecomp.sdc.be.model.Component fetchedContainerComponent = null;
+        log.debug("Going to find the artifact {} on the component {}", artifactId, parent.getUniqueId());
+        Either<ImmutablePair<ArtifactDefinition, ComponentInstance>, ActionStatus> getArtifactRes = findArtifact(artifactId, parent, parentId, componentType);
+        if (getArtifactRes.isRight()) {
+            log.debug("Failed to find the artifact {} belonging to {} on the component {}", artifactId, parentId, parent.getUniqueId());
+            throw new ByActionStatusComponentException(getArtifactRes.right().value(), artifactId);
+        }
+        ArtifactDefinition foundArtifact = getArtifactRes.left().value().getLeft();
+        ComponentInstance foundInstance = getArtifactRes.left().value().getRight();
+        String esId = foundArtifact.getEsId();
+        boolean needToClone = false;
+        if (StringUtils.isNotEmpty(esId)) {
+            Either<Boolean, StorageOperationStatus> needCloneRes = null;
+            needCloneRes = artifactToscaOperation.isCloneNeeded(parent.getUniqueId(), foundArtifact, parentType);
+            if (needCloneRes.isRight()) {
+                throw new StorageException(needCloneRes.right().value(), foundArtifact.getArtifactDisplayName());
+            } else if (log.isDebugEnabled()) {
+                needToClone = needCloneRes.left().value();
+                log.debug("handleDelete: clone is needed for deleting {} held by {} in component {} ? {}",
+                        foundArtifact.getArtifactName(), parentType, parent.getUniqueId(), parent.getName(), needCloneRes.left().value());
+            }
+        }
+        boolean isNeedToDeleteArtifactFromDB = true;
         boolean isDuplicated = false;
-        String esId = null;
-        Either<Boolean, StorageOperationStatus> needCloneRes = null;
-        try {
-            if (shouldLock) {
-                Either<Boolean, ResponseFormat> lockComponent = lockComponent(parent, "Delete Artifact - lock resource: ");
-                if (lockComponent.isRight()) {
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, lockComponent.right()
-                                                                                                                .value(), componentType, null);
-                    resultOp = Either.right(lockComponent.right().value());
-                }
-            }
-            if (resultOp == null) {
-                log.debug("Going to fetch the container component {}. ", parent.getUniqueId());
-                getContainerRes = toscaOperationFacade.getToscaElement(parent.getUniqueId());
-                if (getContainerRes.isRight()) {
-                    log.debug("Failed to fetch the container component {}. ", parentId);
-                    responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(getContainerRes
-                            .right()
-                            .value()), artifactId);
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    resultOp = Either.right(responseFormat);
-                }
-            }
-            if (resultOp == null) {
-                fetchedContainerComponent = getContainerRes.left().value();
-                log.debug("Going to find the artifact {} on the component {}", artifactId, fetchedContainerComponent.getUniqueId());
-                getArtifactRes = findArtifact(artifactId, fetchedContainerComponent, parentId, componentType);
-                if (getArtifactRes.isRight()) {
-                    log.debug("Failed to find the artifact {} belonging to {} on the component {}", artifactId, parentId, fetchedContainerComponent
-                            .getUniqueId());
-                    responseFormat = componentsUtils.getResponseFormatByArtifactId(getArtifactRes.right()
-                                                                                                 .value(), artifactId);
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    resultOp = Either.right(responseFormat);
-                }
-                else {
-                    foundArtifact = getArtifactRes.left().value().getLeft();
-                    esId = foundArtifact.getEsId();
-                }
-            }
-            if (resultOp == null && StringUtils.isNotEmpty(esId)) {
-                needCloneRes = artifactToscaOperation.isCloneNeeded(parent.getUniqueId(), foundArtifact, convertParentType(parent
-                        .getComponentType()));
-                if (needCloneRes.isRight()) {
-                    log.debug(FAILED_UPDATE_ARTIFACT, artifactId, parentId);
-                    responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(needCloneRes
-                            .right()
-                            .value()), foundArtifact.getArtifactDisplayName());
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    resultOp = Either.right(responseFormat);
-                }
-            }
-            boolean isNeedToDeleteArtifactFromDB = true;
-            if (resultOp == null) {
-
-                if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
-                    String instanceId = parentId;
-                    Either<Boolean, ActionStatus> isOnlyResourceInstanceArtifact = isArtifactOnlyResourceInstanceArtifact(foundArtifact, fetchedContainerComponent, instanceId);
-
-                    if (isOnlyResourceInstanceArtifact.isRight()) {
-                        log.debug(FAILED_UPDATE_ARTIFACT, artifactId, parentId);
-                        responseFormat = componentsUtils.getResponseFormatByArtifactId(isOnlyResourceInstanceArtifact.right()
-                                                                                                                     .value(), foundArtifact
-                                .getArtifactDisplayName());
-                        handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                        return Either.right(responseFormat);
-                    }
-                    isNeedToDeleteArtifactFromDB = isOnlyResourceInstanceArtifact.left().value();
-                }
-
-                Either<ArtifactDataDefinition, StorageOperationStatus> updatedArtifactRes = deleteOrUpdateArtifactOnGraph(parent, parentId, artifactId, parentType, foundArtifact, needCloneRes
-                        .left()
-                        .value());
-                if (updatedArtifactRes.isRight()) {
-                    log.debug(FAILED_UPDATE_ARTIFACT, artifactId, parentId);
-                    responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(updatedArtifactRes
-                            .right()
-                            .value()), foundArtifact.getArtifactDisplayName());
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    resultOp = Either.right(responseFormat);
-                }
-                else {
-                    isDuplicated = updatedArtifactRes.left().value().getDuplicated();
-                }
-            }
+        if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
+            isNeedToDeleteArtifactFromDB = isArtifactOnlyResourceInstanceArtifact(foundArtifact, parent, parentId);
+        }
+        ArtifactDataDefinition updatedArtifact = deleteOrUpdateArtifactOnGraph(parent, parentId, artifactId, parentType, foundArtifact, needToClone);
+        isDuplicated = updatedArtifact.getDuplicated();
 
-            if (resultOp == null && (!needCloneRes.left().value() && !isDuplicated) && isNeedToDeleteArtifactFromDB) {
-                log.debug("Going to delete the artifact {} from the database. ", artifactId);
-                CassandraOperationStatus cassandraStatus = artifactCassandraDao.deleteArtifact(esId);
-                if (cassandraStatus != CassandraOperationStatus.OK) {
-                    log.debug("Failed to delete the artifact {} from the database. ", artifactId);
-                    responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(componentsUtils.convertToStorageOperationStatus(cassandraStatus)), foundArtifact
-                            .getArtifactDisplayName());
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    resultOp = Either.right(responseFormat);
-                }
+        if (!needToClone && !isDuplicated && isNeedToDeleteArtifactFromDB) {
+            log.debug("Going to delete the artifact {} from the database. ", artifactId);
+            CassandraOperationStatus cassandraStatus = artifactCassandraDao.deleteArtifact(esId);
+            if (cassandraStatus != CassandraOperationStatus.OK) {
+                log.debug("Failed to delete the artifact {} from the database. ", artifactId);
+                throw new StorageException(convertToStorageOperationStatus(cassandraStatus), foundArtifact.getArtifactDisplayName());
             }
-            if (resultOp == null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
-
-                List<GroupInstance> updatedGroupInstances = getUpdatedGroupInstances(artifactId, foundArtifact, getArtifactRes
-                        .left()
-                        .value()
-                        .getRight()
-                        .getGroupInstances());
-                if (CollectionUtils.isNotEmpty(updatedGroupInstances)) {
-                    Either<List<GroupInstance>, StorageOperationStatus> status = toscaOperationFacade.updateGroupInstancesOnComponent(fetchedContainerComponent, parentId, updatedGroupInstances);
-                    if (status.isRight()) {
-                        log.debug(FAILED_UPDATE_GROUPS, fetchedContainerComponent.getUniqueId());
-                        responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(status
-                                .right()
-                                .value()), foundArtifact.getArtifactDisplayName());
-                        handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                        resultOp = Either.right(responseFormat);
-                    }
+        }
+        if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
+            List<GroupInstance> updatedGroupInstances = getUpdatedGroupInstances(artifactId, foundArtifact, foundInstance.getGroupInstances());
+            if (CollectionUtils.isNotEmpty(updatedGroupInstances)) {
+                Either<List<GroupInstance>, StorageOperationStatus> status = toscaOperationFacade.updateGroupInstancesOnComponent(parent, parentId, updatedGroupInstances);
+                if (status.isRight()) {
+                    log.debug(FAILED_UPDATE_GROUPS, parent.getUniqueId());
+                    throw new StorageException(status.right().value(), foundArtifact.getArtifactDisplayName());
                 }
             }
-            if (resultOp == null && componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
-                StorageOperationStatus status = generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentType);
-                if (status != StorageOperationStatus.OK) {
-                    log.debug("Failed to generate new customization UUID for the component instance {}. ", parentId);
-                    responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(status), foundArtifact
-                            .getArtifactDisplayName());
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    resultOp = Either.right(responseFormat);
-                }
+            StorageOperationStatus status = generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentType);
+            if (status != StorageOperationStatus.OK) {
+                log.debug("Failed to generate new customization UUID for the component instance {}. ", parentId);
+                throw new StorageException(status, foundArtifact.getArtifactDisplayName());
             }
-            if (resultOp == null && componentType != ComponentTypeEnum.RESOURCE_INSTANCE) {
-                List<GroupDataDefinition> updatedGroups = getUpdatedGroups(artifactId, foundArtifact, fetchedContainerComponent
-                        .getGroups());
-                if (CollectionUtils.isNotEmpty(updatedGroups)) {
-                    Either<List<GroupDefinition>, StorageOperationStatus> status = toscaOperationFacade.updateGroupsOnComponent(fetchedContainerComponent, updatedGroups);
-                    if (status.isRight()) {
-                        log.debug(FAILED_UPDATE_GROUPS, fetchedContainerComponent.getUniqueId());
-                        responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(status
-                                .right()
-                                .value()), foundArtifact.getArtifactDisplayName());
-                        handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                        resultOp = Either.right(responseFormat);
-                    }
+        } else {
+            List<GroupDataDefinition> updatedGroups = getUpdatedGroups(artifactId, foundArtifact, parent.getGroups());
+            if (CollectionUtils.isNotEmpty(updatedGroups)) {
+                Either<List<GroupDefinition>, StorageOperationStatus> status = toscaOperationFacade.updateGroupsOnComponent(parent, updatedGroups);
+                if (status.isRight()) {
+                    log.debug(FAILED_UPDATE_GROUPS, parent.getUniqueId());
+                    throw new StorageException(status.right().value(), foundArtifact.getArtifactDisplayName());
                 }
             }
-            if (resultOp == null) {
-                resultOp = Either.left(Either.left(foundArtifact));
-                handleAuditing(auditingAction, parent, parentId, user, foundArtifact, null, artifactId, responseFormat, componentType, null);
-            }
-            return resultOp;
-        }
-        finally {
-            if (shouldLock) {
-                unlockComponent(resultOp, parent, inTransaction);
-            }
         }
+        return foundArtifact;
     }
 
-    private Either<Boolean, ActionStatus> isArtifactOnlyResourceInstanceArtifact(ArtifactDefinition foundArtifact, Component parent, String instanceId) {
-        Either<Boolean, ActionStatus> result = Either.left(true);
-        ComponentInstance foundInstance = null;
-        Optional<ComponentInstance> componentInstanceOpt = parent.getComponentInstances()
-                                                                 .stream()
-                                                                 .filter(i -> i.getUniqueId().equals(instanceId))
-                                                                 .findFirst();
+    private boolean isArtifactOnlyResourceInstanceArtifact(ArtifactDefinition foundArtifact, Component parent, String instanceId) {
+        Optional<ComponentInstance> componentInstanceOpt = parent.getComponentInstanceById(instanceId);
         if (!componentInstanceOpt.isPresent()) {
-            result = Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER);
-        }
-        else {
-            foundInstance = componentInstanceOpt.get();
-            String componentUid = foundInstance.getComponentUid();
-            Either<Component, StorageOperationStatus> getContainerRes = toscaOperationFacade.getToscaElement(componentUid);
-            if (getContainerRes.isRight()) {
-                log.debug("Failed to fetch the container component {}. ", componentUid);
-                return Either.right(componentsUtils.convertFromStorageResponse(getContainerRes.right().value()));
-            }
-            Component origComponent = getContainerRes.left().value();
-            Map<String, ArtifactDefinition> deploymentArtifacts = origComponent.getDeploymentArtifacts();
-            if (deploymentArtifacts != null && !deploymentArtifacts.isEmpty()) {
-                Optional<String> op = deploymentArtifacts.keySet()
-                                                         .stream()
-                                                         .filter(a -> a.equals(foundArtifact.getArtifactLabel()))
-                                                         .findAny();
-                if (op.isPresent()) {
-                    return Either.left(false);
-                }
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, instanceId, "", "", parent.getName());
+        }
+        ComponentInstance foundInstance = componentInstanceOpt.get();
+        String componentUid = foundInstance.getComponentUid();
+        Either<Component, StorageOperationStatus> getContainerRes = toscaOperationFacade.getToscaElement(componentUid);
+        if (getContainerRes.isRight()) {
+            log.debug("Failed to fetch the container component {}. ", componentUid);
+            throw new StorageException(getContainerRes.right().value());
+        }
+        Component origComponent = getContainerRes.left().value();
+        Map<String, ArtifactDefinition> deploymentArtifacts = origComponent.getDeploymentArtifacts();
+        if (MapUtils.isNotEmpty(deploymentArtifacts)) {
+            Optional<String> op = deploymentArtifacts.keySet()
+                    .stream()
+                    .filter(a -> a.equals(foundArtifact.getArtifactLabel()))
+                    .findAny();
+            if (op.isPresent()) {
+                return false;
             }
-            Map<String, ArtifactDefinition> artifacts = origComponent.getArtifacts();
-            if (artifacts != null && !artifacts.isEmpty()) {
-                Optional<String> op = artifacts.keySet()
-                                               .stream()
-                                               .filter(a -> a.equals(foundArtifact.getArtifactLabel()))
-                                               .findAny();
-                if (op.isPresent()) {
-                    return Either.left(false);
-                }
+        }
+        Map<String, ArtifactDefinition> artifacts = origComponent.getArtifacts();
+        if (MapUtils.isNotEmpty(artifacts)) {
+            Optional<String> op = artifacts.keySet()
+                    .stream()
+                    .filter(a -> a.equals(foundArtifact.getArtifactLabel()))
+                    .findAny();
+            if (op.isPresent()) {
+                return false;
             }
-
         }
-        return result;
+        return true;
     }
 
     private List<GroupDataDefinition> getUpdatedGroups(String artifactId, ArtifactDefinition foundArtifact, List<GroupDefinition> groups) {
@@ -1558,7 +1329,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     isUpdated = true;
                 }
                 if (CollectionUtils.isNotEmpty(group.getArtifactsUuid()) && group.getArtifactsUuid()
-                                                                                 .contains(foundArtifact.getArtifactUUID())) {
+                        .contains(foundArtifact.getArtifactUUID())) {
                     group.getArtifactsUuid().remove(foundArtifact.getArtifactUUID());
                     isUpdated = true;
                 }
@@ -1576,14 +1347,12 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             boolean isUpdated = false;
             for (GroupInstance groupInstance : groupInstances) {
                 isUpdated = false;
-                if (CollectionUtils.isNotEmpty(groupInstance.getGroupInstanceArtifacts()) && groupInstance.getGroupInstanceArtifacts()
-                                                                                                          .contains(artifactId)) {
+                if (CollectionUtils.isNotEmpty(groupInstance.getGroupInstanceArtifacts()) && groupInstance.getGroupInstanceArtifacts().contains(artifactId)) {
                     groupInstance.getGroupInstanceArtifacts().remove(artifactId);
                     isUpdated = true;
                 }
                 if (CollectionUtils.isNotEmpty(groupInstance.getGroupInstanceArtifactsUuid()) && groupInstance.getGroupInstanceArtifactsUuid()
-                                                                                                              .contains(foundArtifact
-                                                                                                                      .getArtifactUUID())) {
+                        .contains(foundArtifact.getArtifactUUID())) {
                     groupInstance.getGroupInstanceArtifactsUuid().remove(foundArtifact.getArtifactUUID());
                     isUpdated = true;
                 }
@@ -1595,7 +1364,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return updatedGroupInstances;
     }
 
-    private Either<ArtifactDataDefinition, StorageOperationStatus> deleteOrUpdateArtifactOnGraph(Component component, String parentId, String artifactId, NodeTypeEnum parentType, ArtifactDefinition foundArtifact, Boolean cloneIsNeeded) {
+    private ArtifactDataDefinition deleteOrUpdateArtifactOnGraph(Component component, String parentId, String artifactId, NodeTypeEnum parentType, ArtifactDefinition foundArtifact, Boolean cloneIsNeeded) {
 
         Either<ArtifactDataDefinition, StorageOperationStatus> result;
         boolean isMandatory = foundArtifact.getMandatory() || foundArtifact.getServiceApi();
@@ -1604,7 +1373,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         if (isMandatory) {
             log.debug("Going to update mandatory artifact {} from the component {}", artifactId, parentId);
             resetMandatoryArtifactFields(foundArtifact);
-            result = artifactToscaOperation.updateArtifactOnGraph(componentId, foundArtifact, parentType, artifactId, instanceId, true, true);
+            result = artifactToscaOperation.updateArtifactOnGraph(component, foundArtifact, parentType, artifactId, instanceId, true, true);
         }
         else if (cloneIsNeeded) {
             log.debug("Going to clone artifacts and to delete the artifact {} from the component {}", artifactId, parentId);
@@ -1614,7 +1383,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             log.debug("Going to delete the artifact {} from the component {}", artifactId, parentId);
             result = artifactToscaOperation.removeArtifactOnGraph(foundArtifact, componentId, instanceId, parentType, false);
         }
-        return result;
+        if (result.isRight()) {
+            throw new StorageException(result.right().value(), foundArtifact.getArtifactDisplayName());
+        }
+        return result.left().value();
     }
 
     private Either<ImmutablePair<ArtifactDefinition, ComponentInstance>, ActionStatus> findArtifact(String artifactId, Component fetchedContainerComponent, String parentId, ComponentTypeEnum componentType) {
@@ -1624,10 +1396,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         ComponentInstance foundInstance = null;
         if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE && StringUtils.isNotEmpty(parentId)) {
             Optional<ComponentInstance> componentInstanceOpt = fetchedContainerComponent.getComponentInstances()
-                                                                                        .stream()
-                                                                                        .filter(i -> i.getUniqueId()
-                                                                                                      .equals(parentId))
-                                                                                        .findFirst();
+                    .stream()
+                    .filter(i -> i.getUniqueId()
+                            .equals(parentId))
+                    .findFirst();
             if (!componentInstanceOpt.isPresent()) {
                 result = Either.right(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER);
             }
@@ -1654,27 +1426,27 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Map<String, ArtifactDefinition> currArtifacts;
         if (!artifacts.containsKey(artifactId) && MapUtils.isNotEmpty(component.getDeploymentArtifacts())) {
             currArtifacts = component.getDeploymentArtifacts()
-                                     .values()
-                                     .stream()
-                                     .collect(Collectors.toMap(i -> i.getUniqueId(), i -> i));
+                    .values()
+                    .stream()
+                    .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId, i -> i));
             if (MapUtils.isNotEmpty(currArtifacts)) {
                 artifacts.putAll(currArtifacts);
             }
         }
         if (!artifacts.containsKey(artifactId) && MapUtils.isNotEmpty(component.getArtifacts())) {
             currArtifacts = component.getArtifacts()
-                                     .values()
-                                     .stream()
-                                     .collect(Collectors.toMap(i -> i.getUniqueId(), i -> i));
+                    .values()
+                    .stream()
+                    .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId, Function.identity()));
             if (MapUtils.isNotEmpty(currArtifacts)) {
                 artifacts.putAll(currArtifacts);
             }
         }
         if (!artifacts.containsKey(artifactId) && MapUtils.isNotEmpty(component.getArtifacts())) {
             currArtifacts = component.getToscaArtifacts()
-                                     .values()
-                                     .stream()
-                                     .collect(Collectors.toMap(i -> i.getUniqueId(), i -> i));
+                    .values()
+                    .stream()
+                    .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId, Function.identity()));
             if (MapUtils.isNotEmpty(currArtifacts)) {
                 artifacts.putAll(currArtifacts);
             }
@@ -1685,24 +1457,44 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Map<String, ArtifactDefinition> currArtifacts;
         if (MapUtils.isNotEmpty(instance.getDeploymentArtifacts())) {
             currArtifacts = instance.getDeploymentArtifacts()
-                                    .values()
-                                    .stream()
-                                    .collect(Collectors.toMap(i -> i.getUniqueId(), i -> i));
+                    .values()
+                    .stream()
+                    .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId, Function.identity()));
             if (MapUtils.isNotEmpty(currArtifacts)) {
                 artifacts.putAll(currArtifacts);
             }
         }
         if (!artifacts.containsKey(artifactId) && MapUtils.isNotEmpty(instance.getArtifacts())) {
             currArtifacts = instance.getArtifacts()
-                                    .values()
-                                    .stream()
-                                    .collect(Collectors.toMap(i -> i.getUniqueId(), i -> i));
+                    .values()
+                    .stream()
+                    .collect(Collectors.toMap(ArtifactDataDefinition::getUniqueId, Function.identity()));
             if (MapUtils.isNotEmpty(currArtifacts)) {
                 artifacts.putAll(currArtifacts);
             }
         }
     }
 
+    private StorageOperationStatus convertToStorageOperationStatus(CassandraOperationStatus cassandraStatus) {
+        StorageOperationStatus result;
+        switch (cassandraStatus) {
+            case OK:
+                result = StorageOperationStatus.OK;
+                break;
+            case NOT_FOUND:
+                result = StorageOperationStatus.NOT_FOUND;
+                break;
+            case CLUSTER_NOT_CONNECTED:
+            case KEYSPACE_NOT_CONNECTED:
+                result = StorageOperationStatus.CONNECTION_FAILURE;
+                break;
+            default:
+                result = StorageOperationStatus.GENERAL_ERROR;
+                break;
+        }
+        return result;
+    }
+
     private void resetMandatoryArtifactFields(ArtifactDefinition fetchedArtifact) {
         if (fetchedArtifact != null) {
             log.debug("Going to reset mandatory artifact {} fields. ", fetchedArtifact.getUniqueId());
@@ -1729,29 +1521,18 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return error;
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleDownload(String componentId, String artifactId, User user, AuditingActionEnum auditingAction, ComponentTypeEnum componentType,
-                                                                                         Component parent) {
-        Either<ArtifactDefinition, StorageOperationStatus> artifactById = artifactToscaOperation.getArtifactById(componentId, artifactId, componentType, parent
-                .getUniqueId());
+    private ArtifactDefinition handleDownload(String componentId, String artifactId, ComponentTypeEnum componentType,
+                                              Component parent) {
+        Either<ArtifactDefinition, StorageOperationStatus> artifactById = artifactToscaOperation.getArtifactById(componentId, artifactId, componentType,
+                parent.getUniqueId());
         if (artifactById.isRight()) {
-            ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(artifactById.right().value());
-            log.debug("Error when getting artifact info by id{}, error: {}", artifactId, actionStatus);
-            ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(actionStatus, "");
-            handleAuditing(auditingAction, parent, componentId, user, null, null, artifactId, responseFormat, componentType, null);
-            return Either.right(responseFormat);
+            throw new StorageException(artifactById.right().value());
         }
         ArtifactDefinition artifactDefinition = artifactById.left().value();
         if (artifactDefinition == null) {
-            log.debug("Empty artifact definition returned from DB by artifact id {}", artifactId);
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, "");
-            handleAuditing(auditingAction, parent, componentId, user, null, null, artifactId, responseFormat, componentType, null);
-            return Either.right(responseFormat);
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, artifactId);
         }
-
-        Either<ArtifactDefinition, Operation> insideEither = Either.left(artifactDefinition);
-        ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-        handleAuditing(auditingAction, parent, componentId, user, artifactDefinition, null, artifactId, responseFormat, componentType, null);
-        return Either.left(insideEither);
+        return artifactDefinition;
     }
 
     private Either<ActionStatus, ResponseFormat> handleArtifactLabel(String componentId, Component parentComponent, ArtifactOperationInfo operation, ArtifactDefinition artifactInfo, String operationName,
@@ -1759,9 +1540,9 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
         String artifactLabel = artifactInfo.getArtifactLabel();
         if (operationName == null && (artifactInfo.getArtifactLabel() == null || artifactInfo.getArtifactLabel()
-                                                                                             .isEmpty())) {
+                .isEmpty())) {
             BeEcompErrorManager.getInstance()
-                               .logBeMissingArtifactInformationError("Artifact Update / Upload", "artifactLabel");
+                    .logBeMissingArtifactInformationError("Artifact Update / Upload", "artifactLabel");
             log.debug("missing artifact logical name for component {}", componentId);
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.MISSING_DATA, ARTIFACT_LABEL));
         }
@@ -1812,7 +1593,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     private boolean validateLabelUniqueness(String componentId, Component parentComponent, String artifactLabel, ComponentTypeEnum componentType) {
         boolean isUnique = true;
         Either<Map<String, ArtifactDefinition>, StorageOperationStatus> artifacts;
-        if (componentType.equals(ComponentTypeEnum.RESOURCE_INSTANCE)) {
+        if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
             artifacts = artifactToscaOperation.getAllInstanceArtifacts(parentComponent.getUniqueId(), componentId);
         }
         else {
@@ -1827,21 +1608,8 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 }
             }
         }
-        if (componentType.equals(ComponentTypeEnum.RESOURCE)) {
-            Either<Map<String, InterfaceDefinition>, StorageOperationStatus> allInterfacesOfResource = interfaceLifecycleOperation
-                    .getAllInterfacesOfResource(componentId, true, true);
-            if (allInterfacesOfResource.isLeft()) {
-                for (InterfaceDefinition interace : allInterfacesOfResource.left().value().values()) {
-                    for (Operation operation : interace.getOperationsMap().values()) {
-                        if (operation.getImplementation() != null && operation.getImplementation()
-                                                                              .getArtifactLabel()
-                                                                              .equals(artifactLabel)) {
-                            isUnique = false;
-                            break;
-                        }
-                    }
-                }
-            }
+        if (componentType == ComponentTypeEnum.RESOURCE && isUnique) {
+            isUnique = isUniqueLabelInResourceInterfaces(componentId, artifactLabel);
         }
         return isUnique;
     }
@@ -1859,7 +1627,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 return false;
             }
         }
-        if (ComponentTypeEnum.RESOURCE.equals(componentType)) {
+        if (ComponentTypeEnum.RESOURCE == componentType) {
             return isUniqueArtifactNameInResourceInterfaces(componentId, artifactName, artifactInfo.getArtifactLabel());
         }
         return true;
@@ -1869,14 +1637,14 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Either<Map<String, InterfaceDefinition>, StorageOperationStatus> allInterfacesOfResource = interfaceLifecycleOperation
                 .getAllInterfacesOfResource(componentId, true, true);
 
-        if (allInterfacesOfResource.isLeft() && Objects.nonNull(allInterfacesOfResource)){
-            return !allInterfacesOfResource.left().value()
+        if (allInterfacesOfResource.isLeft()){
+            return allInterfacesOfResource.left().value()
                     .values()
                     .stream().map(InterfaceDefinition :: getOperationsMap)
                     .flatMap(map -> map.values().stream())
                     .map(OperationDataDefinition::getImplementation)
                     .filter(Objects::nonNull)
-                    .anyMatch(add -> artifactName.equals(add.getArtifactName())
+                    .noneMatch(add -> artifactName.equals(add.getArtifactName())
                             && !artifactLabel.equals(add.getArtifactLabel()));
         }
         return true;
@@ -1887,13 +1655,13 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 .getAllInterfacesOfResource(componentId, true, true);
 
         if (allInterfacesOfResource.isLeft()){
-            return !allInterfacesOfResource.left().value()
+            return allInterfacesOfResource.left().value()
                     .values()
                     .stream().map(InterfaceDefinition :: getOperationsMap)
                     .flatMap(map -> map.values().stream())
                     .map(OperationDataDefinition::getImplementation)
                     .filter(Objects::nonNull)
-                    .anyMatch(add -> artifactLabel.equals(add.getArtifactLabel()));
+                    .noneMatch(add -> artifactLabel.equals(add.getArtifactLabel()));
         }
         return true;
     }
@@ -1901,349 +1669,196 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     private Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifacts(ComponentTypeEnum componentType, Component parentComponent,
                                                                                          String componentId, ArtifactGroupTypeEnum artifactGroupType) {
         Either<Map<String, ArtifactDefinition>, StorageOperationStatus> artifactsResponse;
-        if (componentType.equals(ComponentTypeEnum.RESOURCE_INSTANCE)) {
+        if (componentType == ComponentTypeEnum.RESOURCE_INSTANCE) {
             artifactsResponse = artifactToscaOperation.getAllInstanceArtifacts(parentComponent.getUniqueId(), componentId);
         }
         else {
             artifactsResponse = artifactToscaOperation.getArtifacts(componentId);
         }
-        if (artifactsResponse.isRight() && artifactsResponse.right().value().equals(StorageOperationStatus.NOT_FOUND)) {
+        if (artifactsResponse.isRight() && artifactsResponse.right().value() == StorageOperationStatus.NOT_FOUND) {
             log.debug("failed to retrieve artifacts for {} ", componentId);
             return Either.right(artifactsResponse.right().value());
         }
         return Either.left(artifactsResponse.left().value().entrySet()
                 .stream()
-                .filter(x -> artifactGroupType.equals(x.getValue().getArtifactGroupType()))
+                .filter(x -> artifactGroupType == x.getValue().getArtifactGroupType())
                 .collect(Collectors.toMap(Entry::getKey, Entry::getValue)));
     }
 
-    private List<String> getListOfArtifactName(Map<String, ArtifactDefinition> artifacts) {
-        return artifacts.entrySet()
-                .stream()
-                .map(x -> x.getValue().getArtifactName())
-                .collect(Collectors.toList());
-    }
-
     // ***************************************************************
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> createAndLinkArtifact(org.openecomp.sdc.be.model.Component parent, String parentId, ArtifactDefinition artifactInfo, User user,
-                                                                                                ComponentTypeEnum componentTypeEnum, AuditingActionEnum auditingActionEnum) {
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        Either<ArtifactDefinition, Operation> insideEither = null;
-        ComponentInstance foundInstance = findComponentInstance(parentId, parent);
-        String instanceId = null;
-        String instanceName = null;
-        if (foundInstance != null) {
-            instanceId = foundInstance.getUniqueId();
-            instanceName = foundInstance.getName();
-        }
-        boolean isLeft = false;
-        String artifactUniqueId = null;
-        StorageOperationStatus error = null;
-        // information/deployment/api aritfacts
-        log.trace("Try to create entry on graph");
-        NodeTypeEnum nodeType = convertParentType(componentTypeEnum);
-        Either<ArtifactDefinition, StorageOperationStatus> result = artifactToscaOperation.addArifactToComponent(artifactInfo, parent
-                .getUniqueId(), nodeType, true, instanceId);
-
-        isLeft = result.isLeft();
-        if (isLeft) {
-            artifactUniqueId = result.left().value().getUniqueId();
-            result.left().value();
-
-            insideEither = Either.left(result.left().value());
-            resultOp = Either.left(insideEither);
-
-            error = generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentTypeEnum);
-            if (error != StorageOperationStatus.OK) {
-                isLeft = false;
-            }
-
-        }
-        if (isLeft) {
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-            handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, artifactUniqueId, artifactUniqueId, responseFormat, componentTypeEnum, instanceName);
-            return resultOp;
-        }
-        else {
-            log.debug("Failed to create entry on graph for artifact {}", artifactInfo.getArtifactName());
-            ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(error), artifactInfo
-                    .getArtifactDisplayName());
-            handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, null, null, responseFormat, componentTypeEnum, instanceName);
-            resultOp = Either.right(responseFormat);
-            return resultOp;
+    private Either<ArtifactDefinition, Operation> createArtifact(Component parent, String parentId, ArtifactDefinition artifactInfo, byte[] decodedPayload,
+                                                                 ComponentTypeEnum componentTypeEnum, AuditingActionEnum auditingActionEnum, String interfaceType, String operationName) {
 
+        DAOArtifactData artifactData = createEsArtifactData(artifactInfo, decodedPayload);
+        if (artifactData == null) {
+            BeEcompErrorManager.getInstance().logBeDaoSystemError("Upload Artifact");
+            log.debug("Failed to create artifact object for ES.");
+            throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
         }
-    }
-
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> createArtifact(org.openecomp.sdc.be.model.Component parent, String parentId, ArtifactDefinition artifactInfo, byte[] decodedPayload, User user,
-                                                                                         ComponentTypeEnum componentTypeEnum, AuditingActionEnum auditingActionEnum, String interfaceType, String operationName) {
-
-        ESArtifactData artifactData = createEsArtifactData(artifactInfo, decodedPayload);
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        Either<ArtifactDefinition, Operation> insideEither = null;
         ComponentInstance foundInstance = findComponentInstance(parentId, parent);
         String instanceId = null;
-        String instanceName = null;
         if (foundInstance != null) {
             if (foundInstance.isArtifactExists(artifactInfo.getArtifactGroupType(), artifactInfo.getArtifactLabel())) {
                 log.debug("Failed to create artifact, already exists");
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_EXIST, artifactInfo
-                        .getArtifactLabel());
-                handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, null, artifactInfo.getUniqueId(), responseFormat, componentTypeEnum, foundInstance
-                        .getName());
-                resultOp = Either.right(responseFormat);
-                return resultOp;
+                throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_EXIST, artifactInfo.getArtifactLabel());
             }
-
             instanceId = foundInstance.getUniqueId();
-            instanceName = foundInstance.getName();
-        }
-        if (artifactData == null) {
-            BeEcompErrorManager.getInstance().logBeDaoSystemError("Upload Artifact");
-            log.debug("Failed to create artifact object for ES.");
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
-            handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, null, null, responseFormat, componentTypeEnum, null);
-            resultOp = Either.right(responseFormat);
-            return resultOp;
-
         }
         // set on graph object id of artifact in ES!
         artifactInfo.setEsId(artifactData.getId());
 
-        boolean isLeft = false;
-        String artifactUniqueId = null;
-        StorageOperationStatus error = null;
+        Either<ArtifactDefinition, Operation> operationResult;
         if (interfaceType != null && operationName != null) {
             // lifecycle artifact
             Operation operation = convertToOperation(artifactInfo, operationName);
-
             Either<Operation, StorageOperationStatus> result = interfaceLifecycleOperation.updateInterfaceOperation(parentId, interfaceType, operationName, operation);
-
-            isLeft = result.isLeft();
-            if (isLeft) {
-                artifactUniqueId = result.left().value().getImplementation().getUniqueId();
-                result.left().value().getImplementation();
-
-                insideEither = Either.right(result.left().value());
-                resultOp = Either.left(insideEither);
-            }
-            else {
-                error = result.right().value();
+            if (result.isRight()) {
+                throw new StorageException(result.right().value());
             }
+            operationResult = Either.right(result.left().value());
         }
         else {
-            // information/deployment/api aritfacts
-            log.trace("Try to create entry on graph");
+            // information/deployment/api artifacts
             NodeTypeEnum nodeType = convertParentType(componentTypeEnum);
-            Either<ArtifactDefinition, StorageOperationStatus> result = artifactToscaOperation.addArifactToComponent(artifactInfo, parent
-                    .getUniqueId(), nodeType, true, instanceId);
-
-            isLeft = result.isLeft();
-            if (isLeft) {
-                artifactUniqueId = result.left().value().getUniqueId();
-                artifactData.setId(result.left().value().getEsId());
-                insideEither = Either.left(result.left().value());
-                resultOp = Either.left(insideEither);
-
-                error = generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentTypeEnum);
-                if (error != StorageOperationStatus.OK) {
-                    isLeft = false;
-                }
-
-            }
-            else {
-                error = result.right().value();
-            }
-        }
-        if (isLeft) {
-            boolean res = saveArtifacts(artifactData, parentId);
-
-            if (res) {
-                log.debug(ARTIFACT_SAVED, artifactUniqueId);
-
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-                handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, artifactUniqueId, artifactUniqueId, responseFormat, componentTypeEnum, instanceName);
-                return resultOp;
+            Either<ArtifactDefinition, StorageOperationStatus> result = artifactToscaOperation.addArtifactToComponent(
+                    artifactInfo, parent, nodeType, true, instanceId);
+            if (result.isRight()) {
+                throw new StorageException(result.right().value());
             }
-            else {
-                BeEcompErrorManager.getInstance().logBeDaoSystemError("Upload Artifact");
-                log.debug(FAILED_SAVE_ARTIFACT);
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
-                handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, null, artifactUniqueId, responseFormat, componentTypeEnum, instanceName);
+            ArtifactDefinition artifactDefinition = result.left().value();
+            artifactData.setId(artifactDefinition.getEsId());
+            operationResult = Either.left(artifactDefinition);
 
-                resultOp = Either.right(responseFormat);
-                return resultOp;
+            if (generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentTypeEnum) != StorageOperationStatus.OK) {
+                throw new StorageException(generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentTypeEnum));
             }
         }
-        else {
-            log.debug("Failed to create entry on graph for artifact {}", artifactInfo.getArtifactName());
-            ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils.convertFromStorageResponse(error), artifactInfo
-                    .getArtifactDisplayName());
-            handleAuditing(auditingActionEnum, parent, parentId, user, artifactInfo, null, null, responseFormat, componentTypeEnum, instanceName);
-            resultOp = Either.right(responseFormat);
-            return resultOp;
-        }
-
+        saveArtifactInCassandra(artifactData, parent, artifactInfo, "", "", auditingActionEnum, componentTypeEnum);
+        return operationResult;
     }
 
     private ComponentInstance findComponentInstance(String componentInstanceId, Component containerComponent) {
         ComponentInstance foundInstance = null;
         if (CollectionUtils.isNotEmpty(containerComponent.getComponentInstances())) {
             foundInstance = containerComponent.getComponentInstances()
-                                              .stream()
-                                              .filter(i -> i.getUniqueId().equals(componentInstanceId))
-                                              .findFirst()
-                                              .orElse(null);
+                    .stream()
+                    .filter(i -> i.getUniqueId().equals(componentInstanceId))
+                    .findFirst()
+                    .orElse(null);
         }
         return foundInstance;
     }
 
-    private Either<Boolean, ResponseFormat> validateDeploymentArtifact(Component parentComponent, String parentId, boolean isCreate, ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifact, NodeTypeEnum parentType) {
-
-        Either<Boolean, ResponseFormat> result = Either.left(true);
-        Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
-
-        validateArtifactTypeExists(responseWrapper, artifactInfo);
-
-        ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(artifactInfo.getArtifactType());
+    private void validateDeploymentArtifact(Component parentComponent, String parentId, boolean isCreate, ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifact, NodeTypeEnum parentType) {
 
+        ArtifactTypeEnum artifactType = getValidArtifactType(artifactInfo);
         Map<String, ArtifactTypeConfig> resourceDeploymentArtifacts = fillDeploymentArtifactTypeConf(parentType);
-
-        if (responseWrapper.isEmpty()) {
-            validateDeploymentArtifactConf(artifactInfo, responseWrapper, artifactType, resourceDeploymentArtifacts);
+        validateDeploymentArtifactTypeIsLegalForParent(artifactInfo, artifactType, resourceDeploymentArtifacts);
+        if (!isCreate) {
+            validateArtifactTypeNotChanged(artifactInfo, currentArtifact);
         }
-
-        // Common code for all types
-        // not allowed to change artifactType
-        if (responseWrapper.isEmpty() && !isCreate) {
-            Either<Boolean, ResponseFormat> validateServiceApiType = validateArtifactTypeNotChanged(artifactInfo, currentArtifact);
-            if (validateServiceApiType.isRight()) {
-                responseWrapper.setInnerElement(validateServiceApiType.right().value());
-            }
-        }
-        if (responseWrapper.isEmpty()) {
-            if (parentType.equals(NodeTypeEnum.Resource)) {
-                Resource resource = (Resource) parentComponent;
-                ResourceTypeEnum resourceType = resource.getResourceType();
-                ArtifactTypeConfig config = resourceDeploymentArtifacts.get(artifactType.getType());
-                if (config == null) {
-                    responseWrapper.setInnerElement(ResponseFormatManager.getInstance()
-                                                                         .getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo
-                                                                                 .getArtifactType()));
-                }
-                else {
-                    List<String> myList = config.getValidForResourceTypes();
-                    Either<Boolean, ResponseFormat> either = validateResourceType(resourceType, artifactInfo, myList);
-                    if (either.isRight()) {
-                        responseWrapper.setInnerElement(either.right().value());
-                    }
-                }
+        if (parentType == NodeTypeEnum.Resource) {
+            Resource resource = (Resource) parentComponent;
+            ResourceTypeEnum resourceType = resource.getResourceType();
+            ArtifactTypeConfig config = resourceDeploymentArtifacts.get(artifactType.getType());
+            if (config == null) {
+                throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo.getArtifactType());
             }
-
-            validateFileExtension(responseWrapper, () -> getDeploymentArtifactTypeConfig(parentType, artifactType), artifactInfo, parentType, artifactType);
+            List<String> myList = config.getValidForResourceTypes();
+            validateResourceType(resourceType, artifactInfo, myList);
         }
 
-        if (responseWrapper.isEmpty() && !NodeTypeEnum.ResourceInstance.equals(parentType)) {
+        validateFileExtension(() -> getDeploymentArtifactTypeConfig(parentType, artifactType), artifactInfo, parentType, artifactType);
+
+        if (NodeTypeEnum.ResourceInstance != parentType) {
             String artifactName = artifactInfo.getArtifactName();
             if (isCreate || !artifactName.equalsIgnoreCase(currentArtifact.getArtifactName())) {
-                validateSingleDeploymentArtifactName(responseWrapper, artifactName, parentComponent, parentType);
-            }
-        }
-
-        if (responseWrapper.isEmpty()) {
-            switch (artifactType) {
-                case HEAT:
-                case HEAT_VOL:
-                case HEAT_NET:
-                    result = validateHeatDeploymentArtifact(isCreate, artifactInfo, currentArtifact);
-                    break;
-                case HEAT_ENV:
-                    result = validateHeatEnvDeploymentArtifact(parentComponent, parentId, artifactInfo, parentType);
-                    artifactInfo.setTimeout(NodeTemplateOperation.NON_HEAT_TIMEOUT);
-                    break;
-                case DCAE_INVENTORY_TOSCA:
-                case DCAE_INVENTORY_JSON:
-                case DCAE_INVENTORY_POLICY:
-                    // Validation is done in handle payload.
-                case DCAE_INVENTORY_DOC:
-                case DCAE_INVENTORY_BLUEPRINT:
-                case DCAE_INVENTORY_EVENT:
-                    // No specific validation
-                default:
-                    artifactInfo.setTimeout(NodeTemplateOperation.NON_HEAT_TIMEOUT);
-                    break;
+                validateSingleDeploymentArtifactName(artifactName, parentComponent, parentType);
             }
-
         }
 
-        if (!responseWrapper.isEmpty()) {
-            result = Either.right(responseWrapper.getInnerElement());
+        switch (artifactType) {
+            case HEAT:
+            case HEAT_VOL:
+            case HEAT_NET:
+                validateHeatTimeoutValue(isCreate, artifactInfo, currentArtifact);
+                break;
+            case HEAT_ENV:
+                validateHeatEnvDeploymentArtifact(parentComponent, parentId, artifactInfo, parentType);
+                artifactInfo.setTimeout(NodeTemplateOperation.NON_HEAT_TIMEOUT);
+                break;
+            case DCAE_INVENTORY_TOSCA:
+            case DCAE_INVENTORY_JSON:
+            case DCAE_INVENTORY_POLICY:
+                // Validation is done in handle payload.
+            case DCAE_INVENTORY_DOC:
+            case DCAE_INVENTORY_BLUEPRINT:
+            case DCAE_INVENTORY_EVENT:
+                // No specific validation
+            default:
+                artifactInfo.setTimeout(NodeTemplateOperation.NON_HEAT_TIMEOUT);
+                break;
         }
-        return result;
     }
 
-    private void validateDeploymentArtifactConf(ArtifactDefinition artifactInfo, Wrapper<ResponseFormat> responseWrapper, ArtifactTypeEnum artifactType, Map<String, ArtifactTypeConfig> resourceDeploymentArtifacts) {
+    @VisibleForTesting
+    void validateDeploymentArtifactTypeIsLegalForParent(ArtifactDefinition artifactInfo, ArtifactTypeEnum artifactType, Map<String, ArtifactTypeConfig> resourceDeploymentArtifacts) {
         if ((resourceDeploymentArtifacts == null) || !resourceDeploymentArtifacts.containsKey(artifactType.name())) {
-            ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                                 .getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo
-                                                                         .getArtifactType());
-            responseWrapper.setInnerElement(responseFormat);
             log.debug("Artifact Type: {} Not found !", artifactInfo.getArtifactType());
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo.getArtifactType());
         }
     }
 
     private Map<String, ArtifactTypeConfig> fillDeploymentArtifactTypeConf(NodeTypeEnum parentType) {
-        Map<String, ArtifactTypeConfig> resourceDeploymentArtifacts = null;
-        if (parentType.equals(NodeTypeEnum.Resource)) {
+        Map<String, ArtifactTypeConfig> resourceDeploymentArtifacts;
+        if (parentType == NodeTypeEnum.Resource) {
             resourceDeploymentArtifacts = ConfigurationManager.getConfigurationManager()
-                                                              .getConfiguration()
-                                                              .getResourceDeploymentArtifacts();
+                    .getConfiguration()
+                    .getResourceDeploymentArtifacts();
         }
-        else if (parentType.equals(NodeTypeEnum.ResourceInstance)) {
+        else if (parentType == NodeTypeEnum.ResourceInstance) {
             resourceDeploymentArtifacts = ConfigurationManager.getConfigurationManager()
-                                                              .getConfiguration()
-                                                              .getResourceInstanceDeploymentArtifacts();
+                    .getConfiguration()
+                    .getResourceInstanceDeploymentArtifacts();
         }
         else {
             resourceDeploymentArtifacts = ConfigurationManager.getConfigurationManager()
-                                                              .getConfiguration()
-                                                              .getServiceDeploymentArtifacts();
+                    .getConfiguration()
+                    .getServiceDeploymentArtifacts();
         }
         return resourceDeploymentArtifacts;
     }
 
-    public void validateArtifactTypeExists(Wrapper<ResponseFormat> responseWrapper, ArtifactDefinition artifactInfo) {
+    public ArtifactTypeEnum getValidArtifactType(ArtifactDefinition artifactInfo) {
         ArtifactTypeEnum artifactType = ArtifactTypeEnum.findType(artifactInfo.getArtifactType());
         if (artifactType == null) {
-            ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                                 .getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo
-                                                                         .getArtifactType());
-            responseWrapper.setInnerElement(responseFormat);
             log.debug("Artifact Type: {} Not found !", artifactInfo.getArtifactType());
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo.getArtifactType());
         }
+        return artifactType;
     }
 
     private ArtifactTypeConfig getDeploymentArtifactTypeConfig(NodeTypeEnum parentType, ArtifactTypeEnum artifactType) {
         ArtifactTypeConfig retConfig = null;
         String fileType = artifactType.getType();
-        if (parentType.equals(NodeTypeEnum.Resource)) {
+        if (parentType == NodeTypeEnum.Resource) {
             retConfig = ConfigurationManager.getConfigurationManager()
-                                            .getConfiguration()
-                                            .getResourceDeploymentArtifacts()
-                                            .get(fileType);
+                    .getConfiguration()
+                    .getResourceDeploymentArtifacts()
+                    .get(fileType);
         }
-        else if (parentType.equals(NodeTypeEnum.Service)) {
+        else if (parentType == NodeTypeEnum.Service) {
             retConfig = ConfigurationManager.getConfigurationManager()
-                                            .getConfiguration()
-                                            .getServiceDeploymentArtifacts()
-                                            .get(fileType);
+                    .getConfiguration()
+                    .getServiceDeploymentArtifacts()
+                    .get(fileType);
         }
-        else if (parentType.equals(NodeTypeEnum.ResourceInstance)) {
+        else if (parentType == NodeTypeEnum.ResourceInstance) {
             retConfig = ConfigurationManager.getConfigurationManager()
-                                            .getConfiguration()
-                                            .getResourceInstanceDeploymentArtifacts()
-                                            .get(fileType);
+                    .getConfiguration()
+                    .getResourceInstanceDeploymentArtifacts()
+                    .get(fileType);
         }
         return retConfig;
     }
@@ -2254,9 +1869,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             String heatDecodedPayload = new String(Base64.decodeBase64(artifactInfo.getPayloadData()));
             Either<List<HeatParameterDefinition>, ResultStatusEnum> heatParameters = ImportUtils.getHeatParamsWithoutImplicitTypes(heatDecodedPayload, artifactInfo
                     .getArtifactType());
-            if (heatParameters.isRight() && (!heatParameters.right()
-                                                            .value()
-                                                            .equals(ResultStatusEnum.ELEMENT_NOT_FOUND))) {
+            if (heatParameters.isRight() && (heatParameters.right().value() != ResultStatusEnum.ELEMENT_NOT_FOUND)) {
                 log.info("failed to parse heat parameters ");
                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_DEPLOYMENT_ARTIFACT_HEAT, artifactInfo
                         .getArtifactType());
@@ -2270,82 +1883,63 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    // Valid extension
-    public void validateFileExtension(Wrapper<ResponseFormat> responseWrapper, IDeploymentArtifactTypeConfigGetter deploymentConfigGetter, ArtifactDefinition artifactInfo, NodeTypeEnum parentType, ArtifactTypeEnum artifactType) {
-        String fileType = artifactType.getType();
-        List<String> acceptedTypes = null;
-        ArtifactTypeConfig deploymentAcceptedTypes = deploymentConfigGetter.getDeploymentArtifactConfig();
-        if (!parentType.equals(NodeTypeEnum.Resource) && !parentType.equals(NodeTypeEnum.Service) && !parentType.equals(NodeTypeEnum.ResourceInstance)) {
+    @VisibleForTesting
+    public void validateFileExtension(IDeploymentArtifactTypeConfigGetter deploymentConfigGetter, ArtifactDefinition artifactInfo, NodeTypeEnum parentType, ArtifactTypeEnum artifactType) {
+        if (parentType != NodeTypeEnum.Resource && parentType != NodeTypeEnum.Service && parentType != NodeTypeEnum.ResourceInstance) {
             log.debug("parent type of artifact can be either resource or service");
-            responseWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-            return;
+            throw new ByActionStatusComponentException(MISMATCH_BETWEEN_ARTIFACT_TYPE_AND_COMPONENT_TYPE, artifactType.name(), "Service, Resource or ResourceInstance", parentType.getName());
         }
 
+        String fileType = artifactType.getType();
+        ArtifactTypeConfig deploymentAcceptedTypes = deploymentConfigGetter.getDeploymentArtifactConfig();
         if (deploymentAcceptedTypes == null) {
-            log.debug("parent type of artifact can be either resource or service");
-            responseWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo
-                    .getArtifactType()));
-            return;
-        }
-        else {
-            acceptedTypes = deploymentAcceptedTypes.getAcceptedTypes();
+            log.debug("invalid artifact type {}", fileType);
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, fileType);
         }
         /*
          * No need to check specific types. In case there are no acceptedTypes in configuration, then any type is accepted.
          */
 
+        List<String> acceptedTypes = deploymentAcceptedTypes.getAcceptedTypes();
         String artifactName = artifactInfo.getArtifactName();
         String fileExtension = GeneralUtility.getFilenameExtension(artifactName);
         // Pavel - File extension validation is case-insensitive - Ella,
         // 21/02/2016
-        if (acceptedTypes != null && !acceptedTypes.isEmpty() && !acceptedTypes.contains(fileExtension.toLowerCase())) {
+        if (CollectionUtils.isNotEmpty(acceptedTypes) && !acceptedTypes.contains(fileExtension.toLowerCase())) {
             log.debug("File extension \"{}\" is not allowed for {} which is of type:{}", fileExtension, artifactName, fileType);
-            responseWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.WRONG_ARTIFACT_FILE_EXTENSION, fileType));
-            return;
+            throw new ByActionStatusComponentException(ActionStatus.WRONG_ARTIFACT_FILE_EXTENSION, fileType);
         }
     }
 
-    private Either<Boolean, ResponseFormat> validateHeatEnvDeploymentArtifact(Component parentComponent, String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum parentType) {
+    @VisibleForTesting
+    void validateHeatEnvDeploymentArtifact(Component parentComponent, String parentId, ArtifactDefinition artifactInfo, NodeTypeEnum parentType) {
 
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
         Wrapper<ArtifactDefinition> heatMDWrapper = new Wrapper<>();
         Wrapper<byte[]> payloadWrapper = new Wrapper<>();
 
-        if (errorWrapper.isEmpty()) {
-            validateValidYaml(errorWrapper, artifactInfo);
-        }
-
-        if (errorWrapper.isEmpty()) {
-            // Validate Heat Exist
-            validateHeatExist(parentComponent.getUniqueId(), parentId, errorWrapper, heatMDWrapper, artifactInfo, parentType, parentComponent
-                    .getComponentType());
-        }
-
-        if (errorWrapper.isEmpty() && !heatMDWrapper.isEmpty()) {
-            fillArtifactPayloadValidation(errorWrapper, payloadWrapper, heatMDWrapper.getInnerElement());
-        }
+        validateYaml(artifactInfo);
+        validateHeatExist(parentComponent.getUniqueId(), parentId, heatMDWrapper, artifactInfo,
+                parentType, parentComponent.getComponentType());
 
-        if (errorWrapper.isEmpty() && !heatMDWrapper.isEmpty()) {
-            validateEnvVsHeat(errorWrapper, artifactInfo, heatMDWrapper.getInnerElement(), payloadWrapper.getInnerElement());
+        if (!heatMDWrapper.isEmpty()) {
+            fillArtifactPayload(payloadWrapper, heatMDWrapper.getInnerElement());
         }
 
-        // init Response
-        Either<Boolean, ResponseFormat> eitherResponse;
-        if (errorWrapper.isEmpty()) {
-            eitherResponse = Either.left(true);
+        if (!heatMDWrapper.isEmpty()) {
+            validateEnvVsHeat(artifactInfo, heatMDWrapper.getInnerElement(), payloadWrapper.getInnerElement());
         }
-        else {
-            eitherResponse = Either.right(errorWrapper.getInnerElement());
-        }
-        return eitherResponse;
     }
 
-    public void fillArtifactPayloadValidation(Wrapper<ResponseFormat> errorWrapper, Wrapper<byte[]> payloadWrapper, ArtifactDefinition artifactDefinition) {
-        if (artifactDefinition.getPayloadData() == null || artifactDefinition.getPayloadData().length == 0) {
-            Either<Boolean, ResponseFormat> fillArtifactPayload = fillArtifactPayload(payloadWrapper, artifactDefinition);
-            if (fillArtifactPayload.isRight()) {
-                errorWrapper.setInnerElement(fillArtifactPayload.right().value());
+    public void fillArtifactPayload(Wrapper<byte[]> payloadWrapper, ArtifactDefinition artifactDefinition) {
+        if (ArrayUtils.isEmpty(artifactDefinition.getPayloadData())) {
+            Either<DAOArtifactData, CassandraOperationStatus> eitherArtifactData = artifactCassandraDao.getArtifact(artifactDefinition.getEsId());
+            if (eitherArtifactData.isLeft()) {
+                byte[] data = eitherArtifactData.left().value().getDataAsArray();
+                payloadWrapper.setInnerElement(Base64.encodeBase64(data));
+            }
+            else {
                 log.debug("Error getting payload for artifact:{}", artifactDefinition.getArtifactName());
+                throw new StorageException(DaoStatusConverter.convertCassandraStatusToStorageStatus(eitherArtifactData.right().value()));
             }
         }
         else {
@@ -2353,71 +1947,37 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         }
     }
 
-    public Either<Boolean, ResponseFormat> fillArtifactPayload(Wrapper<byte[]> payloadWrapper, ArtifactDefinition artifactMD) {
-        Either<Boolean, ResponseFormat> result = Either.left(true);
-        Either<ESArtifactData, CassandraOperationStatus> eitherArtifactData = artifactCassandraDao.getArtifact(artifactMD
-                .getEsId());
-        if (eitherArtifactData.isLeft()) {
-            byte[] data = eitherArtifactData.left().value().getDataAsArray();
-            data = Base64.encodeBase64(data);
-            payloadWrapper.setInnerElement(data);
-        }
-        else {
-            StorageOperationStatus storageStatus = DaoStatusConverter.convertCassandraStatusToStorageStatus(eitherArtifactData
-                    .right()
-                    .value());
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus));
-            result = Either.right(responseFormat);
-        }
-        return result;
-
-    }
-
-    @SuppressWarnings("unchecked")
-    private void validateEnvVsHeat(Wrapper<ResponseFormat> errorWrapper, ArtifactDefinition envArtifact, ArtifactDefinition heatArtifact, byte[] heatPayloadData) {
+    private void validateEnvVsHeat(ArtifactDefinition envArtifact, ArtifactDefinition heatArtifact, byte[] heatPayloadData) {
         String envPayload = new String(Base64.decodeBase64(envArtifact.getPayloadData()));
         Map<String, Object> heatEnvToscaJson = (Map<String, Object>) new Yaml().load(envPayload);
         String heatDecodedPayload = new String(Base64.decodeBase64(heatPayloadData));
         Map<String, Object> heatToscaJson = (Map<String, Object>) new Yaml().load(heatDecodedPayload);
 
         Either<Map<String, Object>, ResultStatusEnum> eitherHeatEnvProperties = ImportUtils.findFirstToscaMapElement(heatEnvToscaJson, TypeUtils.ToscaTagNamesEnum.PARAMETERS);
-        Either<Map<String, Object>, ResultStatusEnum> eitherHeatProperties = ImportUtils.findFirstToscaMapElement(heatToscaJson, TypeUtils.ToscaTagNamesEnum.PARAMETERS);
         if (eitherHeatEnvProperties.isRight()) {
-            ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                                 .getResponseFormat(ActionStatus.CORRUPTED_FORMAT, "Heat Env");
-            errorWrapper.setInnerElement(responseFormat);
             log.debug("Invalid heat env format for file:{}", envArtifact.getArtifactName());
+            throw new ByActionStatusComponentException(ActionStatus.CORRUPTED_FORMAT, "Heat Env");
         }
-        else if (eitherHeatProperties.isRight()) {
-            ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                                 .getResponseFormat(ActionStatus.MISMATCH_HEAT_VS_HEAT_ENV, envArtifact
-                                                                         .getArtifactName(), heatArtifact.getArtifactName());
-            errorWrapper.setInnerElement(responseFormat);
-            log.debug("Validation of heat_env for artifact:{} vs heat artifact for artifact :{} failed", envArtifact.getArtifactName(), heatArtifact
-                    .getArtifactName());
+        Either<Map<String, Object>, ResultStatusEnum> eitherHeatProperties = ImportUtils.findFirstToscaMapElement(heatToscaJson, TypeUtils.ToscaTagNamesEnum.PARAMETERS);
+        if (eitherHeatProperties.isRight()) {
+            log.debug("Invalid heat format for file:{}", heatArtifact.getArtifactName());
+            throw new ByActionStatusComponentException(ActionStatus.CORRUPTED_FORMAT, "Heat");
         }
-        else {
-            Set<String> heatPropertiesKeys = eitherHeatProperties.left().value().keySet();
-            Set<String> heatEnvPropertiesKeys = eitherHeatEnvProperties.left().value().keySet();
-            heatEnvPropertiesKeys.removeAll(heatPropertiesKeys);
-            if (!heatEnvPropertiesKeys.isEmpty()) {
-                ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                                     .getResponseFormat(ActionStatus.MISMATCH_HEAT_VS_HEAT_ENV, envArtifact
-                                                                             .getArtifactName(), heatArtifact.getArtifactName());
-                errorWrapper.setInnerElement(responseFormat);
-            }
+        Set<String> heatPropertiesKeys = eitherHeatProperties.left().value().keySet();
+        Set<String> heatEnvPropertiesKeys = eitherHeatEnvProperties.left().value().keySet();
+        heatEnvPropertiesKeys.removeAll(heatPropertiesKeys);
+        if (!heatEnvPropertiesKeys.isEmpty()) {
+            log.debug("Validation of heat_env for artifact:{} vs heat artifact for artifact :{} failed", envArtifact.getArtifactName(), heatArtifact.getArtifactName());
+            throw new ByActionStatusComponentException(ActionStatus.MISMATCH_HEAT_VS_HEAT_ENV, envArtifact.getArtifactName(), heatArtifact.getArtifactName());
         }
     }
 
-    private void validateValidYaml(Wrapper<ResponseFormat> errorWrapper, ArtifactDefinition artifactInfo) {
-        YamlToObjectConverter yamlConvertor = new YamlToObjectConverter();
-        boolean isYamlValid = yamlConvertor.isValidYamlEncoded64(artifactInfo.getPayloadData());
+    private void validateYaml(ArtifactDefinition artifactInfo) {
+        YamlToObjectConverter yamlConverter = new YamlToObjectConverter();
+        boolean isYamlValid = yamlConverter.isValidYamlEncoded64(artifactInfo.getPayloadData());
         if (!isYamlValid) {
-            ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                                 .getResponseFormat(ActionStatus.INVALID_YAML, artifactInfo
-                                                                         .getArtifactType());
-            errorWrapper.setInnerElement(responseFormat);
             log.debug("Yaml is not valid for artifact : {}", artifactInfo.getArtifactName());
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_YAML, artifactInfo.getArtifactType());
         }
     }
 
@@ -2445,7 +2005,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         }
     }
 
-    private void validateSingleDeploymentArtifactName(Wrapper<ResponseFormat> errorWrapper, String artifactName, Component parentComponent, NodeTypeEnum parentType) {
+    private void validateSingleDeploymentArtifactName(String artifactName, Component parentComponent, NodeTypeEnum parentType) {
         boolean artifactNameFound = false;
         Iterator<ArtifactDefinition> parentDeploymentArtifactsItr = getDeploymentArtifacts(parentComponent, parentType, null)
                 .iterator();
@@ -2454,36 +2014,24 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             artifactNameFound = artifactName.equalsIgnoreCase(parentDeploymentArtifactsItr.next().getArtifactName());
         }
         if (artifactNameFound) {
-            String parentName = parentComponent.getName();
-            ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                                 .getResponseFormat(ActionStatus.DEPLOYMENT_ARTIFACT_NAME_ALREADY_EXISTS, parentType
-                                                                         .name(), parentName, artifactName);
-
-            errorWrapper.setInnerElement(responseFormat);
             log.debug("Can't upload artifact: {}, because another artifact with this name already exist.", artifactName);
-
+            throw new ByActionStatusComponentException(ActionStatus.DEPLOYMENT_ARTIFACT_NAME_ALREADY_EXISTS, parentType.name(),
+                    parentComponent.getName(), artifactName);
         }
     }
 
-    private void validateHeatExist(String componentId, String parentRiId, Wrapper<ResponseFormat> errorWrapper, Wrapper<ArtifactDefinition> heatArtifactMDWrapper, ArtifactDefinition heatEnvArtifact, NodeTypeEnum parentType,
+    private void validateHeatExist(String componentId, String parentRiId, Wrapper<ArtifactDefinition> heatArtifactMDWrapper, ArtifactDefinition heatEnvArtifact, NodeTypeEnum parentType,
                                    ComponentTypeEnum componentType) {
         Either<ArtifactDefinition, StorageOperationStatus> res = artifactToscaOperation.getHeatArtifactByHeatEnvId(parentRiId, heatEnvArtifact, parentType, componentId, componentType);
         if (res.isRight()) {
-            ResponseFormat responseFormat;
-            if (res.right().value() == StorageOperationStatus.NOT_FOUND) {
-                responseFormat = ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.MISSING_HEAT);
-            }
-            else {
-                responseFormat = ResponseFormatManager.getInstance().getResponseFormat(ActionStatus.MISSING_HEAT);
-            }
-            errorWrapper.setInnerElement(responseFormat);
-            return;
+            throw new ByActionStatusComponentException(ActionStatus.MISSING_HEAT);
+        } else {
+            heatArtifactMDWrapper.setInnerElement(res.left().value());
         }
-        ArtifactDefinition heatArtifact = res.left().value();
-        heatArtifactMDWrapper.setInnerElement(heatArtifact);
     }
 
-    private Either<Boolean, ResponseFormat> validateHeatDeploymentArtifact(boolean isCreate, ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifact) {
+    @VisibleForTesting
+    void validateHeatTimeoutValue(boolean isCreate, ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifact) {
         log.trace("Started HEAT pre-payload validation for artifact {}", artifactInfo.getArtifactLabel());
         // timeout > 0 for HEAT artifacts
         Integer timeout = artifactInfo.getTimeout();
@@ -2493,28 +2041,23 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             // HEAT artifact but timeout is invalid
         }
         else if (timeout < 1) {
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_INVALID_TIMEOUT));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_INVALID_TIMEOUT);
         }
-
         // US649856 - Allow several HEAT files on Resource
         log.trace("Ended HEAT validation for artifact {}", artifactInfo.getArtifactLabel());
-        return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateResourceType(ResourceTypeEnum resourceType, ArtifactDefinition artifactInfo, List<String> typeList) {
-        String listToString = (typeList != null) ? typeList.toString() : "";
-        ResponseFormat responseFormat = ResponseFormatManager.getInstance()
-                                                             .getResponseFormat(ActionStatus.MISMATCH_BETWEEN_ARTIFACT_TYPE_AND_COMPONENT_TYPE, artifactInfo
-                                                                     .getArtifactName(), listToString, resourceType.getValue());
-        Either<Boolean, ResponseFormat> either = Either.right(responseFormat);
-        String resourceTypeName = resourceType.name();
-        if (typeList != null && typeList.contains(resourceTypeName)) {
-            either = Either.left(true);
+    @VisibleForTesting
+    void validateResourceType(ResourceTypeEnum resourceType, ArtifactDefinition artifactInfo, List<String> typeList) {
+        if (typeList == null || !typeList.contains(resourceType.name())) {
+            String listToString = (typeList != null) ? typeList.toString() : "";
+            throw new ByActionStatusComponentException(MISMATCH_BETWEEN_ARTIFACT_TYPE_AND_COMPONENT_TYPE, artifactInfo.getArtifactName(),
+                    listToString, resourceType.getValue());
         }
-        return either;
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> validateAndConvertHeatParamers(ArtifactDefinition artifactInfo, String artifactType) {
+    @VisibleForTesting
+    Either<ArtifactDefinition, ResponseFormat> validateAndConvertHeatParameters(ArtifactDefinition artifactInfo, String artifactType) {
         if (artifactInfo.getHeatParameters() != null) {
             for (HeatParameterDefinition heatParam : artifactInfo.getListHeatParameters()) {
                 String parameterType = heatParam.getType();
@@ -2642,9 +2185,9 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     }
 
     private Either<ActionStatus, ResponseFormat> validateArtifactType(String userId, ArtifactDefinition artifactInfo, NodeTypeEnum parentType) {
-        if (Strings.isNullOrEmpty(artifactInfo.getArtifactType())) {
+        if (artifactInfo.getArtifactType() == null || artifactInfo.getArtifactType().isEmpty()) {
             BeEcompErrorManager.getInstance()
-                               .logBeMissingArtifactInformationError("Artifact Update / Upload", "artifactLabel");
+                    .logBeMissingArtifactInformationError("Artifact Update / Upload", "artifactLabel");
             log.debug("Missing artifact type for artifact {}", artifactInfo.getArtifactName());
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.MISSING_ARTIFACT_TYPE));
         }
@@ -2653,7 +2196,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Either<List<ArtifactType>, ActionStatus> allArtifactTypes = null;
         ArtifactGroupTypeEnum artifactGroupType = artifactInfo.getArtifactGroupType();
 
-        if ((artifactGroupType != null) && artifactGroupType.equals(ArtifactGroupTypeEnum.DEPLOYMENT)) {
+        if ((artifactGroupType != null) && artifactGroupType == ArtifactGroupTypeEnum.DEPLOYMENT) {
             allArtifactTypes = getDeploymentArtifactTypes(parentType);
         }
         else {
@@ -2662,12 +2205,12 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         }
         if (allArtifactTypes.isRight()) {
             BeEcompErrorManager.getInstance()
-                               .logBeInvalidConfigurationError("Artifact Upload / Update", "artifactTypes", allArtifactTypes
-                                       .right()
-                                       .value()
-                                       .name());
+                    .logBeInvalidConfigurationError("Artifact Upload / Update", "artifactTypes", allArtifactTypes
+                            .right()
+                            .value()
+                            .name());
             log.debug("Failed to retrieve list of suported artifact types. error: {}", allArtifactTypes.right()
-                                                                                                       .value());
+                    .value());
             return Either.right(componentsUtils.getResponseFormatByUserId(allArtifactTypes.right().value(), userId));
         }
 
@@ -2681,8 +2224,8 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
         if (!artifactTypeExist) {
             BeEcompErrorManager.getInstance()
-                               .logBeInvalidTypeError("Artifact Upload / Delete / Update - Not supported artifact type", artifactInfo
-                                       .getArtifactType(), "Artifact " + artifactInfo.getArtifactName());
+                    .logBeInvalidTypeError("Artifact Upload / Delete / Update - Not supported artifact type", artifactInfo
+                            .getArtifactType(), "Artifact " + artifactInfo.getArtifactName());
             log.debug("Not supported artifact type = {}", artifactInfo.getArtifactType());
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_TYPE_NOT_SUPPORTED, artifactInfo
                     .getArtifactType()));
@@ -2696,20 +2239,20 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Map<String, ArtifactTypeConfig> deploymentArtifacts ;
         List<ArtifactType> artifactTypes = new ArrayList<>();
 
-        if (parentType.equals(NodeTypeEnum.Service)) {
+        if (parentType == NodeTypeEnum.Service) {
             deploymentArtifacts = ConfigurationManager.getConfigurationManager()
-                                                      .getConfiguration()
-                                                      .getServiceDeploymentArtifacts();
+                    .getConfiguration()
+                    .getServiceDeploymentArtifacts();
         }
-        else if (parentType.equals(NodeTypeEnum.ResourceInstance)) {
+        else if (parentType == NodeTypeEnum.ResourceInstance) {
             deploymentArtifacts = ConfigurationManager.getConfigurationManager()
-                                                      .getConfiguration()
-                                                      .getResourceInstanceDeploymentArtifacts();
+                    .getConfiguration()
+                    .getResourceInstanceDeploymentArtifacts();
         }
         else {
             deploymentArtifacts = ConfigurationManager.getConfigurationManager()
-                                                      .getConfiguration()
-                                                      .getResourceDeploymentArtifacts();
+                    .getConfiguration()
+                    .getResourceDeploymentArtifacts();
         }
         if (deploymentArtifacts != null) {
             for (String artifactType : deploymentArtifacts.keySet()) {
@@ -2733,11 +2276,11 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    private Either<Boolean, ResponseFormat> validateAndSetArtifactname(ArtifactDefinition artifactInfo) {
+    @VisibleForTesting
+    Either<Boolean, ResponseFormat> validateAndSetArtifactName(ArtifactDefinition artifactInfo) {
         if (artifactInfo.getArtifactName() == null || artifactInfo.getArtifactName().isEmpty()) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.MISSING_ARTIFACT_NAME));
         }
-
         String normalizeFileName = ValidationUtils.normalizeFileName(artifactInfo.getArtifactName());
         if (normalizeFileName == null || normalizeFileName.isEmpty()) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.MISSING_ARTIFACT_NAME));
@@ -2751,29 +2294,29 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateArtifactTypeNotChanged(ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifact) {
-        if (artifactInfo.getArtifactType() == null || artifactInfo.getArtifactType().isEmpty()) {
+    private void validateArtifactTypeNotChanged(ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifact) {
+        if (StringUtils.isEmpty(artifactInfo.getArtifactType())) {
             log.info("artifact type is missing operation ignored");
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.MISSING_ARTIFACT_TYPE));
+            throw new ByActionStatusComponentException(ActionStatus.MISSING_ARTIFACT_TYPE);
         }
 
         if (!currentArtifact.getArtifactType().equalsIgnoreCase(artifactInfo.getArtifactType())) {
             log.info("artifact type cannot be changed operation ignored");
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
         }
-        return Either.left(true);
     }
 
     private Either<ArtifactDefinition, ResponseFormat> validateOrSetArtifactGroupType(ArtifactDefinition artifactInfo, ArtifactDefinition currentArtifact) {
-        if (artifactInfo.getArtifactGroupType() == null) {
-            artifactInfo.setArtifactGroupType(currentArtifact.getArtifactGroupType());
-        }
 
-        else if (!currentArtifact.getArtifactGroupType()
-                                 .getType()
-                                 .equalsIgnoreCase(artifactInfo.getArtifactGroupType().getType())) {
-            log.info("artifact group type cannot be changed. operation failed");
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+        if (Objects.nonNull(artifactInfo) && Objects.nonNull(currentArtifact)) {
+            if (artifactInfo.getArtifactGroupType() == null) {
+                artifactInfo.setArtifactGroupType(currentArtifact.getArtifactGroupType());
+            } else if (!currentArtifact.getArtifactGroupType()
+                    .getType()
+                    .equalsIgnoreCase(artifactInfo.getArtifactGroupType().getType())) {
+                log.info("artifact group type cannot be changed. operation failed");
+                return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            }
         }
         return Either.left(artifactInfo);
     }
@@ -2791,56 +2334,56 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         artifactInfo.setUniqueId(currentArtifact.getUniqueId());
 
         if (artifactInfo.getArtifactRef() != null && !currentArtifact.getArtifactRef()
-                                                                     .equals(artifactInfo.getArtifactRef())) {
+                .equals(artifactInfo.getArtifactRef())) {
             log.error("artifact ref cannot be set ignoring");
         }
         artifactInfo.setArtifactRef(currentArtifact.getArtifactRef());
 
         if (artifactInfo.getArtifactRepository() != null && !currentArtifact.getArtifactRepository()
-                                                                            .equals(artifactInfo.getArtifactRepository())) {
+                .equals(artifactInfo.getArtifactRepository())) {
             log.error("artifact repository cannot be set ignoring");
         }
         artifactInfo.setArtifactRepository(currentArtifact.getArtifactRepository());
 
         if (artifactInfo.getUserIdCreator() != null && !currentArtifact.getUserIdCreator()
-                                                                       .equals(artifactInfo.getUserIdCreator())) {
+                .equals(artifactInfo.getUserIdCreator())) {
             log.error("creator uuid cannot be set ignoring");
         }
         artifactInfo.setUserIdCreator(currentArtifact.getUserIdCreator());
 
         if (artifactInfo.getArtifactCreator() != null && !currentArtifact.getArtifactCreator()
-                                                                         .equals(artifactInfo.getArtifactCreator())) {
+                .equals(artifactInfo.getArtifactCreator())) {
             log.error("artifact creator cannot be set ignoring");
         }
         artifactInfo.setArtifactCreator(currentArtifact.getArtifactCreator());
 
         if (artifactInfo.getUserIdLastUpdater() != null && !currentArtifact.getUserIdLastUpdater()
-                                                                           .equals(artifactInfo.getUserIdLastUpdater())) {
+                .equals(artifactInfo.getUserIdLastUpdater())) {
             log.error("userId of last updater cannot be set ignoring");
         }
         artifactInfo.setUserIdLastUpdater(user.getUserId());
 
         if (artifactInfo.getCreatorFullName() != null && !currentArtifact.getCreatorFullName()
-                                                                         .equals(artifactInfo.getCreatorFullName())) {
+                .equals(artifactInfo.getCreatorFullName())) {
             log.error("creator Full name cannot be set ignoring");
         }
         artifactInfo.setCreatorFullName(currentArtifact.getCreatorFullName());
 
         if (artifactInfo.getUpdaterFullName() != null && !currentArtifact.getUpdaterFullName()
-                                                                         .equals(artifactInfo.getUpdaterFullName())) {
+                .equals(artifactInfo.getUpdaterFullName())) {
             log.error("updater Full name cannot be set ignoring");
         }
         String fullName = user.getFirstName() + " " + user.getLastName();
         artifactInfo.setUpdaterFullName(fullName);
 
         if (artifactInfo.getCreationDate() != null && !currentArtifact.getCreationDate()
-                                                                      .equals(artifactInfo.getCreationDate())) {
+                .equals(artifactInfo.getCreationDate())) {
             log.error("Creation Date cannot be set ignoring");
         }
         artifactInfo.setCreationDate(currentArtifact.getCreationDate());
 
         if (artifactInfo.getLastUpdateDate() != null && !currentArtifact.getLastUpdateDate()
-                                                                        .equals(artifactInfo.getLastUpdateDate())) {
+                .equals(artifactInfo.getLastUpdateDate())) {
             log.error("Last Update Date cannot be set ignoring");
         }
         long time = System.currentTimeMillis();
@@ -2852,19 +2395,18 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         artifactInfo.setEsId(currentArtifact.getUniqueId());
 
         if (artifactInfo.getArtifactDisplayName() != null && !currentArtifact.getArtifactDisplayName()
-                                                                             .equals(artifactInfo.getArtifactDisplayName())) {
+                .equals(artifactInfo.getArtifactDisplayName())) {
             log.error(" Artifact Display Name cannot be set ignoring");
         }
         artifactInfo.setArtifactDisplayName(currentArtifact.getArtifactDisplayName());
 
         if (artifactInfo.getServiceApi() != null && !currentArtifact.getServiceApi()
-                                                                    .equals(artifactInfo.getServiceApi())) {
+                .equals(artifactInfo.getServiceApi())) {
             log.debug("serviceApi cannot be set. ignoring.");
         }
         artifactInfo.setServiceApi(currentArtifact.getServiceApi());
 
-        if (artifactInfo.getArtifactGroupType() != null && !currentArtifact.getArtifactGroupType()
-                                                                           .equals(artifactInfo.getArtifactGroupType())) {
+        if (artifactInfo.getArtifactGroupType() != null && currentArtifact.getArtifactGroupType() != artifactInfo.getArtifactGroupType()) {
             log.debug("artifact group cannot be set. ignoring.");
         }
         artifactInfo.setArtifactGroupType(currentArtifact.getArtifactGroupType());
@@ -2872,8 +2414,8 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         artifactInfo.setArtifactVersion(currentArtifact.getArtifactVersion());
 
         if (artifactInfo.getArtifactUUID() != null && !artifactInfo.getArtifactUUID()
-                                                                   .isEmpty() && !currentArtifact.getArtifactUUID()
-                                                                                                 .equals(artifactInfo.getArtifactUUID())) {
+                .isEmpty() && !currentArtifact.getArtifactUUID()
+                .equals(artifactInfo.getArtifactUUID())) {
             log.debug("artifact UUID cannot be set. ignoring.");
         }
         artifactInfo.setArtifactUUID(currentArtifact.getArtifactUUID());
@@ -2898,7 +2440,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     parameter.setName(currentParam.getName());
                 }
                 if (parameter.getDefaultValue() != null && !parameter.getDefaultValue()
-                                                                     .equalsIgnoreCase(currentParam.getDefaultValue())) {
+                        .equalsIgnoreCase(currentParam.getDefaultValue())) {
                     log.debug("heat parameter defaultValue cannot be updated  ({}). ignoring.", parameter.getDefaultValue());
                     parameter.setDefaultValue(currentParam.getDefaultValue());
                 }
@@ -2907,7 +2449,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     parameter.setType(currentParam.getType());
                 }
                 if (parameter.getDescription() != null && !parameter.getDescription()
-                                                                    .equalsIgnoreCase(currentParam.getDescription())) {
+                        .equalsIgnoreCase(currentParam.getDescription())) {
                     log.debug("heat parameter description cannot be updated  ({}). ignoring.", parameter.getDescription());
                     parameter.setDescription(currentParam.getDescription());
                 }
@@ -2923,7 +2465,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
     private Map<String, HeatParameterDefinition> getMapOfParameters(List<HeatParameterDefinition> currentParameters) {
 
-        Map<String, HeatParameterDefinition> currentParamsMap = new HashMap<String, HeatParameterDefinition>();
+        Map<String, HeatParameterDefinition> currentParamsMap = new HashMap<>();
         for (HeatParameterDefinition param : currentParameters) {
             currentParamsMap.put(param.getUniqueId(), param);
         }
@@ -2968,136 +2510,75 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return Either.left(true);
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateArtifactFlow(org.openecomp.sdc.be.model.Component parent, String parentId, String artifactId, ArtifactDefinition artifactInfo, User user, byte[] decodedPayload,
-                                                                                             ComponentTypeEnum componentType, AuditingActionEnum auditingAction, String interfaceType, String operationUuid) {
-        ESArtifactData artifactData = createEsArtifactData(artifactInfo, decodedPayload);
-        String prevArtifactId = null;
+    private Either<ArtifactDefinition, Operation> updateArtifactFlow(Component parent, String parentId, String artifactId, ArtifactDefinition artifactInfo, byte[] decodedPayload,
+                                                                     ComponentTypeEnum componentType, AuditingActionEnum auditingAction, String interfaceType, String operationName) {
+        DAOArtifactData artifactData = createEsArtifactData(artifactInfo, decodedPayload);
+        if (artifactData == null) {
+            BeEcompErrorManager.getInstance().logBeDaoSystemError(UPDATE_ARTIFACT);
+            log.debug("Failed to create artifact object for ES.");
+            throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
+        }
+        String prevArtifactId;
         String currArtifactId = artifactId;
-
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        Either<ArtifactDefinition, Operation> insideEither = null;
-
-        log.trace("Try to update entry on graph");
-        String artifactUniqueId = null;
         ArtifactDefinition artifactDefinition = artifactInfo;
-        StorageOperationStatus error;
-
-        boolean isLeft;
-        if (interfaceType == null || operationUuid == null) {
-            log.debug("Entity on graph is updated. Update artifact in ES");
-            boolean res = true;
-            // Changing previous and current artifactId for auditing
-            prevArtifactId = currArtifactId;
-            currArtifactId = artifactDefinition.getUniqueId();
+        if (interfaceType != null && operationName != null) {
+            BeEcompErrorManager.getInstance().logBeDaoSystemError(UPDATE_ARTIFACT);
+            log.debug("Received both interface and operation for update artifact - something is wrong");
+            throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
+        }
+        log.debug("Entry on graph is updated. Update artifact in ES");
+        // Changing previous and current artifactId for auditing
+        prevArtifactId = currArtifactId;
+        currArtifactId = artifactDefinition.getUniqueId();
 
+        NodeTypeEnum parentType = convertParentType(componentType);
 
-            if (decodedPayload == null) {
-                if (!artifactDefinition.getMandatory() || artifactDefinition.getEsId() != null) {
-                    Either<ESArtifactData, CassandraOperationStatus> artifactFromCassandra = artifactCassandraDao.getArtifact(artifactDefinition
-                            .getEsId());
-                    if (artifactFromCassandra.isRight()) {
-                        log.debug("Failed to get artifact data from ES for artifact id  {}", artifactId);
-                        error = DaoStatusConverter.convertCassandraStatusToStorageStatus(artifactFromCassandra.right()
-                                .value());
-                        ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(error));
-                        handleAuditing(auditingAction, parent, parentId, user, artifactInfo, prevArtifactId, currArtifactId, responseFormat, componentType, null);
-                        resultOp = Either.right(responseFormat);
-                        return resultOp;
-                    }
-                    // clone data to new artifact
-                    artifactData.setData(artifactFromCassandra.left().value().getData());
-                    artifactData.setId(artifactFromCassandra.left().value().getId());
-                }
-            } else {
-                if (artifactDefinition.getEsId() == null) {
-                    artifactDefinition.setEsId(artifactDefinition.getUniqueId());
-                    artifactData.setId(artifactDefinition.getUniqueId());
-                }
-            }
-
-            NodeTypeEnum convertParentType = convertParentType(componentType);
-            Either<ArtifactDefinition, StorageOperationStatus> result = artifactToscaOperation.updateArtifactOnResource(artifactInfo, parent
-                    .getUniqueId(), artifactId, convertParentType, parentId);
-            isLeft = result.isLeft();
-            if (isLeft) {
-                artifactUniqueId = result.left().value().getUniqueId();
-                artifactDefinition = result.left().value();
-                String artifactType = artifactInfo.getArtifactType();
-                if (NodeTypeEnum.Resource == convertParentType
-                        && (ArtifactTypeEnum.HEAT.getType().equalsIgnoreCase(artifactType)
-                        || ArtifactTypeEnum.HEAT_VOL.getType().equalsIgnoreCase(artifactType)
-                        || ArtifactTypeEnum.HEAT_NET.getType().equalsIgnoreCase(artifactType))
-                        && !artifactUniqueId.equals(artifactId)) {
-                    // need to update the generated id in heat env
-                    Map<String, ArtifactDefinition> deploymentArtifacts = parent.getDeploymentArtifacts();
-                    Optional<Entry<String, ArtifactDefinition>> findFirst = deploymentArtifacts.entrySet()
-                            .stream()
-                            .filter(a -> a.getValue()
-                                    .getGeneratedFromId() != null && a
-                                    .getValue()
-                                    .getGeneratedFromId()
-                                    .equals(artifactId))
-                            .findFirst();
-                    if (findFirst.isPresent()) {
-                        ArtifactDefinition artifactEnvInfo = findFirst.get().getValue();
-                        artifactEnvInfo.setArtifactChecksum(null);
-                        artifactToscaOperation.updateHeatEnvArtifact(parent.getUniqueId(), artifactEnvInfo, artifactId, artifactUniqueId, convertParentType, parentId);
-                    }
-                }
-                error = generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentType);
-
-                insideEither = Either.left(result.left().value());
-                resultOp = Either.left(insideEither);
-                if (error != StorageOperationStatus.OK) {
-                    isLeft = false;
+        if (decodedPayload == null) {
+            if (!artifactDefinition.getMandatory() || artifactDefinition.getEsId() != null) {
+                Either<DAOArtifactData, CassandraOperationStatus> artifactFromCassandra = artifactCassandraDao.getArtifact(artifactDefinition.getEsId());
+                if (artifactFromCassandra.isRight()) {
+                    throw new StorageException(artifactFromCassandra.right().value());
                 }
-
-            } else {
-                error = result.right().value();
+                // clone data to new artifact
+                artifactData.setData(artifactFromCassandra.left().value().getData());
+                artifactData.setId(artifactFromCassandra.left().value().getId());
             }
-            if (isLeft) {
-
-                // create new entry in ES
-                res = true;
-                if (artifactData.getData() != null) {
-                    if (!artifactDefinition.getDuplicated() || artifactData.getId() == null) {
-                        artifactData.setId(artifactDefinition.getEsId());
-                    }
-                    res = saveArtifacts(artifactData, parentId);
+        } else if (artifactDefinition.getEsId() == null) {
+            artifactDefinition.setEsId(artifactDefinition.getUniqueId());
+            artifactData.setId(artifactDefinition.getUniqueId());
+        }
 
-                }
-            }
+        Either<ArtifactDefinition, StorageOperationStatus> result = artifactToscaOperation.updateArtifactOnResource(artifactInfo,
+                parent, artifactId, parentType, parentId, true);
+        if (result.isRight()) {
+            throw new StorageException(result.right().value());
+        }
+        artifactDefinition = result.left().value();
+        updateGeneratedIdInHeatEnv(parent, parentId, artifactId, artifactInfo, artifactDefinition, parentType);
 
-            if (res) {
-                log.debug(ARTIFACT_SAVED, artifactUniqueId);
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-                handleAuditing(auditingAction, parent, parentId, user, artifactInfo, prevArtifactId, currArtifactId, responseFormat, componentType, null);
-            } else {
-                BeEcompErrorManager.getInstance().logBeDaoSystemError(UPDATE_ARTIFACT);
-                log.debug(FAILED_SAVE_ARTIFACT);
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
-                handleAuditing(auditingAction, parent, parentId, user, artifactInfo, prevArtifactId, currArtifactId, responseFormat, componentType, null);
-                resultOp = Either.right(responseFormat);
+        StorageOperationStatus storageOperationStatus = generateCustomizationUUIDOnInstance(parent.getUniqueId(), parentId, componentType);
+        if (storageOperationStatus != StorageOperationStatus.OK) {
+            throw new StorageException(storageOperationStatus);
+        }
+        if (artifactData.getData() != null) {
+            if (!artifactDefinition.getDuplicated() || artifactData.getId() == null) {
+                artifactData.setId(artifactDefinition.getEsId());
             }
-        } else {
-            return updateArtifactsFlowForInterfaceOperations(parent, parentId, artifactId, artifactInfo, user,
-                    decodedPayload, componentType, auditingAction, interfaceType, operationUuid, artifactData, prevArtifactId,
-                    currArtifactId, artifactDefinition);
+            saveArtifactInCassandra(artifactData, parent, artifactInfo, currArtifactId, prevArtifactId, auditingAction, componentType);
         }
-
-        return resultOp;
+        return Either.left(artifactDefinition);
     }
 
     private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateArtifactsFlowForInterfaceOperations(
             Component parent, String parentId, String artifactId, ArtifactDefinition artifactInfo, User user,
             byte[] decodedPayload, ComponentTypeEnum componentType, AuditingActionEnum auditingAction, String interfaceType,
-            String operationUuid, ESArtifactData artifactData, String prevArtifactId, String currArtifactId,
+            String operationUuid, DAOArtifactData artifactData, String prevArtifactId, String currArtifactId,
             ArtifactDefinition artifactDefinition) {
         StorageOperationStatus error;
         Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp;
         if (decodedPayload == null) {
             if (!artifactDefinition.getMandatory() || artifactDefinition.getEsId() != null) {
-                Either<ESArtifactData, CassandraOperationStatus> artifactFromCassandra = artifactCassandraDao.getArtifact(artifactDefinition
+                Either<DAOArtifactData, CassandraOperationStatus> artifactFromCassandra = artifactCassandraDao.getArtifact(artifactDefinition
                         .getEsId());
                 if (artifactFromCassandra.isRight()) {
                     log.debug("Failed to get artifact data from ES for artifact id  {}", artifactId);
@@ -3127,7 +2608,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         artifactInfo.setArtifactDisplayName(artifactInfo.getArtifactName());
 
         Either<ArtifactDefinition, StorageOperationStatus> updateArtifactOnResourceEither =
-                artifactToscaOperation.updateArtifactOnResource(artifactInfo, parent.getUniqueId(), artifactId, convertParentType, parentId);
+                artifactToscaOperation.updateArtifactOnResource(artifactInfo, parent, artifactId, convertParentType, parentId, true);
         if(updateArtifactOnResourceEither.isRight()){
             log.debug("Failed to persist operation artifact {} in resource, error is {}",artifactInfo.getArtifactName(), updateArtifactOnResourceEither.right().value());
             ActionStatus convertedFromStorageResponse = componentsUtils.convertFromStorageResponse(updateArtifactOnResourceEither.right().value());
@@ -3151,6 +2632,45 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return Either.left(Either.left(updateOprEither.left().value()));
     }
 
+    private String updateGeneratedIdInHeatEnv(Component parent, String parentId, String artifactId, ArtifactDefinition artifactInfo, ArtifactDefinition artifactDefinition, NodeTypeEnum parentType) {
+        if (NodeTypeEnum.Resource == parentType) {
+            return updateGeneratedIdInHeatEnv(parent.getDeploymentArtifacts(), parent, parentId, artifactId, artifactInfo, artifactDefinition, parentType, false);
+        }
+        return artifactDefinition.getUniqueId();
+    }
+
+    private String updateGeneratedIdInHeatEnv(Map<String, ArtifactDefinition> deploymentArtifacts, Component parentComponent, String parentId, String artifactId, ArtifactDefinition artifactInfo, ArtifactDefinition artifactDefinition, NodeTypeEnum parentType, boolean isInstanceArtifact) {
+        String artifactUniqueId;
+        artifactUniqueId = artifactDefinition.getUniqueId();
+        String artifactType = artifactInfo.getArtifactType();
+        if ((ArtifactTypeEnum.HEAT.getType().equalsIgnoreCase(artifactType) ||
+                ArtifactTypeEnum.HEAT_VOL.getType().equalsIgnoreCase(artifactType) ||
+                ArtifactTypeEnum.HEAT_NET.getType().equalsIgnoreCase(artifactType))
+                && !artifactUniqueId.equals(artifactId)) {
+            // need to update the generated id in heat env
+            Optional<Entry<String, ArtifactDefinition>> findFirst = deploymentArtifacts.entrySet()
+                    .stream()
+                    .filter(a -> artifactId.equals(a.getValue().getGeneratedFromId()))
+                    .findFirst();
+            if (findFirst.isPresent()) {
+                ArtifactDefinition artifactEnvInfo = findFirst.get().getValue();
+                artifactEnvInfo.setIsFromCsar(artifactDefinition.getIsFromCsar());
+                artifactEnvInfo.setArtifactChecksum(null);
+                if (isInstanceArtifact) {
+                    artifactToscaOperation.updateHeatEnvArtifactOnInstance(parentComponent, artifactEnvInfo, artifactId, artifactUniqueId, parentType, parentId);
+                } else {
+                    artifactToscaOperation.updateHeatEnvArtifact(parentComponent, artifactEnvInfo, artifactId, artifactUniqueId, parentType, parentId);
+                }
+            }
+        }
+        return artifactUniqueId;
+    }
+
+    private String updateGeneratedIdInHeatEnvOnInstance(ComponentInstance parent, Component parentComponent, String artifactId, ArtifactDefinition artifactInfo, ArtifactDefinition artifactDefinition, NodeTypeEnum parentType) {
+        return updateGeneratedIdInHeatEnv(parent.getDeploymentArtifacts(), parentComponent, parent.getUniqueId(),artifactId, artifactInfo, artifactDefinition, parentType, true);
+    }
+
+    @VisibleForTesting
     private Either<byte[], ResponseFormat> handlePayload(ArtifactDefinition artifactInfo, boolean isArtifactMetadataUpdate) {
         log.trace("Starting payload handling");
         byte[] payload = artifactInfo.getPayloadData();
@@ -3205,6 +2725,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return Either.left(decodedPayload);
     }
 
+
     public Either<Operation, ResponseFormat> deleteArtifactByInterface(String resourceId, String userUserId, String artifactId,
                                                                        boolean inTransaction) {
         User user = new User();
@@ -3248,43 +2769,35 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     }
 
     // download by MSO
-    public Either<byte[], ResponseFormat> downloadRsrcArtifactByNames(String serviceName, String serviceVersion, String resourceName, String resourceVersion, String artifactName) {
+    public byte[] downloadRsrcArtifactByNames(String serviceName, String serviceVersion, String resourceName, String resourceVersion, String artifactName) {
 
         // General validation
         if (serviceName == null || serviceVersion == null || resourceName == null || resourceVersion == null || artifactName == null) {
             log.debug(NULL_PARAMETER);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
         }
 
         // Normalizing artifact name
         artifactName = ValidationUtils.normalizeFileName(artifactName);
 
         // Resource validation
-        Either<Resource, ResponseFormat> validateResourceNameAndVersion = validateResourceNameAndVersion(resourceName, resourceVersion);
-        if (validateResourceNameAndVersion.isRight()) {
-            return Either.right(validateResourceNameAndVersion.right().value());
-        }
-
-        Resource resource = validateResourceNameAndVersion.left().value();
+        Resource resource = validateResourceNameAndVersion(resourceName, resourceVersion);
         String resourceId = resource.getUniqueId();
 
         // Service validation
-        Either<Service, ResponseFormat> validateServiceNameAndVersion = validateServiceNameAndVersion(serviceName, serviceVersion);
-        if (validateServiceNameAndVersion.isRight()) {
-            return Either.right(validateServiceNameAndVersion.right().value());
-        }
+        Service validateServiceNameAndVersion = validateServiceNameAndVersion(serviceName, serviceVersion);
 
         Map<String, ArtifactDefinition> artifacts = resource.getDeploymentArtifacts();
         if (artifacts == null || artifacts.isEmpty()) {
             log.debug("Deployment artifacts of resource {} are not found", resourceId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, artifactName));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, artifactName);
         }
 
         ArtifactDefinition deploymentArtifact = null;
 
         for (ArtifactDefinition artifactDefinition : artifacts.values()) {
             if (artifactDefinition.getArtifactName() != null && artifactDefinition.getArtifactName()
-                                                                                  .equals(artifactName)) {
+                    .equals(artifactName)) {
                 log.debug(FOUND_DEPLOYMENT_ARTIFACT, artifactName);
                 deploymentArtifact = artifactDefinition;
                 break;
@@ -3293,100 +2806,91 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
         if (deploymentArtifact == null) {
             log.debug("No deployment artifact {} was found for resource {}", artifactName, resourceId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, artifactName));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, artifactName);
         }
 
         // Downloading the artifact
-        Either<ImmutablePair<String, byte[]>, ResponseFormat> downloadArtifactEither = downloadArtifact(deploymentArtifact);
-        if (downloadArtifactEither.isRight()) {
-            log.debug(FAILED_DOWNLOAD_ARTIFACT, artifactName);
-            return Either.right(downloadArtifactEither.right().value());
-        }
+        ImmutablePair<String, byte[]> downloadArtifactEither = downloadArtifact(deploymentArtifact);
         log.trace("Download of resource artifact succeeded, uniqueId {}", deploymentArtifact.getUniqueId());
-        return Either.left(downloadArtifactEither.left().value().getRight());
+        return downloadArtifactEither.getRight();
     }
 
     // download by MSO
-    public Either<byte[], ResponseFormat> downloadRsrcInstArtifactByNames(String serviceName, String serviceVersion, String resourceInstanceName, String artifactName) {
+    public byte[] downloadRsrcInstArtifactByNames(String serviceName, String serviceVersion, String resourceInstanceName, String artifactName) {
 
         // General validation
         if (serviceName == null || serviceVersion == null || resourceInstanceName == null || artifactName == null) {
             log.debug(NULL_PARAMETER);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
         }
 
         // Normalizing artifact name
         artifactName = ValidationUtils.normalizeFileName(artifactName);
 
         // Service validation
-        Either<Service, ResponseFormat> validateServiceNameAndVersion = validateServiceNameAndVersion(serviceName, serviceVersion);
-        if (validateServiceNameAndVersion.isRight()) {
-            return Either.right(validateServiceNameAndVersion.right().value());
-        }
-
-        Service service = validateServiceNameAndVersion.left().value();
+        Service service = validateServiceNameAndVersion(serviceName, serviceVersion);
 
         // ResourceInstance validation
-        Either<ComponentInstance, ResponseFormat> validateResourceInstance = validateResourceInstance(service, resourceInstanceName);
-        if (validateResourceInstance.isRight()) {
-            return Either.right(validateResourceInstance.right().value());
-        }
-
-        ComponentInstance resourceInstance = validateResourceInstance.left().value();
+        ComponentInstance resourceInstance = validateResourceInstance(service, resourceInstanceName);
 
         Map<String, ArtifactDefinition> artifacts = resourceInstance.getDeploymentArtifacts();
 
         final String finalArtifactName = artifactName;
         Predicate<ArtifactDefinition> filterArtifactByName = p -> p.getArtifactName().equals(finalArtifactName);
 
-        boolean hasDeploymentArtifacts = artifacts != null && artifacts.values()
-                                                                       .stream()
-                                                                       .anyMatch(filterArtifactByName);
-        ArtifactDefinition deployableArtifact;
+        ArtifactDefinition deployableArtifact = artifacts==null ? null :
+                artifacts.values().stream()
+                        .filter(filterArtifactByName)
+                        .findFirst()
+                        .orElse(null);
 
-        if (!hasDeploymentArtifacts) {
+        if (deployableArtifact == null) {
             log.debug("Deployment artifact with name {} not found", artifactName);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, artifactName));
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, artifactName));
         }
 
         log.debug(FOUND_DEPLOYMENT_ARTIFACT, artifactName);
-        deployableArtifact = artifacts.values().stream().filter(filterArtifactByName).findFirst().get();
-        // Downloading the artifact
-        Either<ImmutablePair<String, byte[]>, ResponseFormat> downloadArtifactEither = downloadArtifact(deployableArtifact);
+        ImmutablePair<String, byte[]> downloadArtifactEither = downloadArtifact(deployableArtifact);
 
-        if (downloadArtifactEither.isRight()) {
-            log.debug(FAILED_DOWNLOAD_ARTIFACT, artifactName);
-            return Either.right(downloadArtifactEither.right().value());
-        }
         log.trace("Download of resource artifact succeeded, uniqueId {}", deployableArtifact.getUniqueId());
-        return Either.left(downloadArtifactEither.left().value().getRight());
+        return downloadArtifactEither.getRight();
     }
 
-    private Either<ComponentInstance, ResponseFormat> validateResourceInstance(Service service, String resourceInstanceName) {
+    private ComponentInstance validateResourceInstance(Service service, String resourceInstanceName) {
 
         List<ComponentInstance> riList = service.getComponentInstances();
         for (ComponentInstance ri : riList) {
             if (ri.getNormalizedName().equals(resourceInstanceName)) {
-                return Either.left(ri);
+                return ri;
             }
         }
+        throw new ByActionStatusComponentException(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND, resourceInstanceName);
+    }
+
+    private ComponentInstance validateResourceInstanceById(Component component, String resourceInstanceId) {
 
-        return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND, resourceInstanceName));
+        List<ComponentInstance> riList = component.getComponentInstances();
+        for (ComponentInstance ri : riList) {
+            if (ri.getUniqueId().equals(resourceInstanceId)) {
+                return ri;
+            }
+        }
+        throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, resourceInstanceId);
     }
 
-    private Either<Service, ResponseFormat> validateServiceNameAndVersion(String serviceName, String serviceVersion) {
+    private Service validateServiceNameAndVersion(String serviceName, String serviceVersion) {
 
         Either<List<Service>, StorageOperationStatus> serviceListBySystemName = toscaOperationFacade.getBySystemName(ComponentTypeEnum.SERVICE, serviceName);
         if (serviceListBySystemName.isRight()) {
             log.debug("Couldn't fetch any service with name {}", serviceName);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceListBySystemName
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceListBySystemName
                     .right()
-                    .value(), ComponentTypeEnum.SERVICE), serviceName));
+                    .value(), ComponentTypeEnum.SERVICE), serviceName);
         }
         List<Service> serviceList = serviceListBySystemName.left().value();
         if (serviceList == null || serviceList.isEmpty()) {
             log.debug("Couldn't fetch any service with name {}", serviceName);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceName));
+            throw new ByActionStatusComponentException(ActionStatus.SERVICE_NOT_FOUND, serviceName);
         }
 
         Service foundService = null;
@@ -3400,13 +2904,25 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
         if (foundService == null) {
             log.debug("Couldn't find version {} for service {}", serviceVersion, serviceName);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_VERSION_NOT_FOUND, ComponentTypeEnum.SERVICE
-                    .getValue(), serviceVersion));
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_VERSION_NOT_FOUND, ComponentTypeEnum.SERVICE
+                    .getValue(), serviceVersion);
         }
-        return Either.left(foundService);
+        return foundService;
     }
 
-    private Either<Resource, ResponseFormat> validateResourceNameAndVersion(String resourceName, String resourceVersion) {
+    private Resource validateResourceNameAndVersion(String resourceName, String resourceVersion) {
+
+        Either<Resource, StorageOperationStatus> resourceListBySystemName = toscaOperationFacade.getComponentByNameAndVersion(ComponentTypeEnum.RESOURCE, resourceName, resourceVersion, JsonParseFlagEnum.ParseMetadata);
+        if (resourceListBySystemName.isRight()) {
+            log.debug("Couldn't fetch any resource with name {} and version {}. ", resourceName, resourceVersion);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(resourceListBySystemName
+                    .right()
+                    .value()), resourceName);
+        }
+        return resourceListBySystemName.left().value();
+    }
+
+    /*private Either<Resource, ResponseFormat> validateResourceNameAndVersion(String resourceName, String resourceVersion) {
 
         Either<Resource, StorageOperationStatus> resourceListBySystemName = toscaOperationFacade.getComponentByNameAndVersion(ComponentTypeEnum.RESOURCE, resourceName, resourceVersion, JsonParseFlagEnum.ParseMetadata);
         if (resourceListBySystemName.isRight()) {
@@ -3416,81 +2932,71 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     .value()), resourceName));
         }
         return Either.left(resourceListBySystemName.left().value());
-    }
+    }*/
 
-    public Either<byte[], ResponseFormat> downloadServiceArtifactByNames(String serviceName, String serviceVersion, String artifactName) {
+    public byte[] downloadServiceArtifactByNames(String serviceName, String serviceVersion, String artifactName) {
         // Validation
         log.trace("Starting download of service interface artifact, serviceName {}, serviceVersion {}, artifact name {}", serviceName, serviceVersion, artifactName);
         if (serviceName == null || serviceVersion == null || artifactName == null) {
             log.debug(NULL_PARAMETER);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
         }
 
         // Normalizing artifact name
         final String normalizedArtifactName = ValidationUtils.normalizeFileName(artifactName);
 
         // Service validation
-        Either<Service, ResponseFormat> validateServiceNameAndVersion = validateServiceNameAndVersion(serviceName, serviceVersion);
-        if (validateServiceNameAndVersion.isRight()) {
-            return Either.right(validateServiceNameAndVersion.right().value());
-        }
-
-        String serviceId = validateServiceNameAndVersion.left().value().getUniqueId();
-
+        Service service = validateServiceNameAndVersion(serviceName, serviceVersion);
         // Looking for deployment or tosca artifacts
-        Service service = validateServiceNameAndVersion.left().value();
+        String serviceId = service.getUniqueId();
 
         if (MapUtils.isEmpty(service.getDeploymentArtifacts()) && MapUtils.isEmpty(service.getToscaArtifacts())) {
             log.debug("Neither Deployment nor Tosca artifacts of service {} are found", serviceId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, normalizedArtifactName));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, normalizedArtifactName);
         }
 
-        Optional<ArtifactDefinition> foundArtifactOptl = null;
+        Optional<ArtifactDefinition> foundArtifactOptl = Optional.empty();
 
         if (!MapUtils.isEmpty(service.getDeploymentArtifacts())) {
             foundArtifactOptl = service.getDeploymentArtifacts().values().stream()
-                                       // filters artifact by name
-                                       .filter(a -> a.getArtifactName().equals(normalizedArtifactName)).findAny();
+                    // filters artifact by name
+                    .filter(a -> a.getArtifactName().equals(normalizedArtifactName)).findAny();
         }
-        if ((foundArtifactOptl == null || !foundArtifactOptl.isPresent()) && !MapUtils.isEmpty(service.getToscaArtifacts())) {
+        if ((!foundArtifactOptl.isPresent()) && !MapUtils.isEmpty(service.getToscaArtifacts())) {
             foundArtifactOptl = service.getToscaArtifacts().values().stream()
-                                       // filters TOSCA artifact by name
-                                       .filter(a -> a.getArtifactName().equals(normalizedArtifactName)).findAny();
+                    // filters TOSCA artifact by name
+                    .filter(a -> a.getArtifactName().equals(normalizedArtifactName)).findAny();
         }
         if (!foundArtifactOptl.isPresent()) {
             log.debug("The artifact {} was not found for service {}", normalizedArtifactName, serviceId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, normalizedArtifactName));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, normalizedArtifactName);
         }
         log.debug(FOUND_DEPLOYMENT_ARTIFACT, normalizedArtifactName);
         // Downloading the artifact
-        Either<ImmutablePair<String, byte[]>, ResponseFormat> downloadArtifactEither = downloadArtifact(foundArtifactOptl
+        ImmutablePair<String, byte[]> downloadArtifactEither = downloadArtifact(foundArtifactOptl
                 .get());
-        if (downloadArtifactEither.isRight()) {
-            log.debug(FAILED_DOWNLOAD_ARTIFACT, normalizedArtifactName);
-            return Either.right(downloadArtifactEither.right().value());
-        }
         log.trace("Download of service artifact succeeded, uniqueId {}", foundArtifactOptl.get().getUniqueId());
-        return Either.left(downloadArtifactEither.left().value().getRight());
+        return downloadArtifactEither.getRight();
     }
 
-    public Either<ImmutablePair<String, byte[]>, ResponseFormat> downloadArtifact(String parentId, String artifactUniqueId) {
+    public ImmutablePair<String, byte[]> downloadArtifact(String parentId, String artifactUniqueId) {
         log.trace("Starting download of artifact, uniqueId {}", artifactUniqueId);
         Either<ArtifactDefinition, StorageOperationStatus> artifactById = artifactToscaOperation.getArtifactById(parentId, artifactUniqueId);
         if (artifactById.isRight()) {
             ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(artifactById.right().value());
             log.debug("Error when getting artifact info by id{}, error: {}", artifactUniqueId, actionStatus);
-            return Either.right(componentsUtils.getResponseFormatByArtifactId(actionStatus, ""));
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatByArtifactId(actionStatus, ""));
         }
         ArtifactDefinition artifactDefinition = artifactById.left().value();
         if (artifactDefinition == null) {
             log.debug("Empty artifact definition returned from DB by artifact id {}", artifactUniqueId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ""));
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, ""));
         }
 
         return downloadArtifact(artifactDefinition);
     }
 
-    private boolean checkArtifactInComponent(org.openecomp.sdc.be.model.Component component, String artifactId) {
+    private boolean checkArtifactInComponent(Component component, String artifactId) {
         boolean found = false;
         Map<String, ArtifactDefinition> artifactsS = component.getArtifacts();
         if (artifactsS != null) {
@@ -3535,7 +3041,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 }
             }
         }
-
         switch (component.getComponentType()) {
             case RESOURCE:
                 break;
@@ -3593,41 +3098,41 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return found;
     }
 
-    private Either<? extends org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists(String componentId, AuditingActionEnum auditingAction, User user, String artifactId, ComponentTypeEnum componentType,
-                                                                                                           String containerComponentType) {
+    private Component validateComponentExists(String componentId, AuditingActionEnum auditingAction, User user, String artifactId, ComponentTypeEnum componentType,
+                                              String containerComponentType) {
 
         ComponentTypeEnum componentForAudit = null == containerComponentType ? componentType : ComponentTypeEnum.findByParamName(containerComponentType);
         componentForAudit.getNodeType();
 
-        Either<? extends org.openecomp.sdc.be.model.Component, StorageOperationStatus> componentResult = toscaOperationFacade
+        Either<? extends Component, StorageOperationStatus> componentResult = toscaOperationFacade
                 .getToscaFullElement(componentId);
 
         if (componentResult.isRight()) {
-            ActionStatus status = componentForAudit == ComponentTypeEnum.RESOURCE ? ActionStatus.RESOURCE_NOT_FOUND : componentType == ComponentTypeEnum.SERVICE ? ActionStatus.SERVICE_NOT_FOUND : ActionStatus.PRODUCT_NOT_FOUND;
+            ActionStatus status = componentForAudit == ComponentTypeEnum.RESOURCE ? ActionStatus.RESOURCE_NOT_FOUND : componentForAudit == ComponentTypeEnum.SERVICE ? ActionStatus.SERVICE_NOT_FOUND : ActionStatus.PRODUCT_NOT_FOUND;
             ResponseFormat responseFormat = componentsUtils.getResponseFormat(status, componentId);
             log.debug("Service not found, serviceId {}", componentId);
             handleAuditing(auditingAction, null, componentId, user, null, null, artifactId, responseFormat, componentForAudit, null);
-            return Either.right(responseFormat);
+            throw new ByActionStatusComponentException(status, componentId);
         }
-        return Either.left(componentResult.left().value());
+        return componentResult.left().value();
     }
 
-    private Either<Boolean, ResponseFormat> validateWorkOnComponent(Component component, String userId, AuditingActionEnum auditingAction, User user, String artifactId, ArtifactOperationInfo operation) {
+    private Boolean validateWorkOnComponent(Component component, String userId, AuditingActionEnum auditingAction, User user, String artifactId, ArtifactOperationInfo operation) {
         if (operation.getArtifactOperationEnum() != ArtifactOperationEnum.DOWNLOAD && !operation.ignoreLifecycleState()) {
-            Either<Boolean, ResponseFormat> canWork = validateCanWorkOnComponent(component, userId);
-            if (canWork.isRight()) {
+            try {
+                validateCanWorkOnComponent(component, userId);
+            }catch (ComponentException e) {
                 String uniqueId = component.getUniqueId();
                 log.debug("Service status isn't  CHECKOUT or user isn't owner, serviceId {}", uniqueId);
-                handleAuditing(auditingAction, component, uniqueId, user, null, null, artifactId, canWork.right()
-                                                                                                         .value(), component
-                        .getComponentType(), null);
-                return Either.right(canWork.right().value());
+                handleAuditing(auditingAction, component, uniqueId, user, null, null, artifactId, e.getResponseFormat(),
+                        component.getComponentType(), null);
+                throw e;
             }
         }
-        return Either.left(true);
+        return true;
     }
 
-    private Either<Boolean, ResponseFormat> validateUserRole(User user, AuditingActionEnum auditingAction, String componentId, String artifactId, ComponentTypeEnum componentType, ArtifactOperationInfo operation) {
+    private void validateUserRole(User user, AuditingActionEnum auditingAction, String componentId, String artifactId, ComponentTypeEnum componentType, ArtifactOperationInfo operation) {
 
         if (operation.getArtifactOperationEnum() != ArtifactOperationEnum.DOWNLOAD) {
             String role = user.getRole();
@@ -3635,16 +3140,15 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
                 log.debug("addArtifact - user isn't permitted to perform operation, userId {}, role {}", user.getUserId(), role);
                 handleAuditing(auditingAction, null, componentId, user, null, null, artifactId, responseFormat, componentType, null);
-                return Either.right(responseFormat);
+                throw new ByActionStatusComponentException(ActionStatus.RESTRICTED_OPERATION);
             }
         }
-        return Either.left(true);
     }
 
-    private Either<User, ResponseFormat> validateUserExists(String userId, AuditingActionEnum auditingAction, String componentId, String artifactId, ComponentTypeEnum componentType, boolean inTransaction) {
+    private User validateUserExists(String userId, AuditingActionEnum auditingAction, String componentId, String artifactId, ComponentTypeEnum componentType, boolean inTransaction) {
         User user;
         try{
-            user = validateUserExists(userId, auditingAction.getName(), inTransaction);
+            user = validateUserExists(userId);
         } catch(ByResponseFormatComponentException e){
             ResponseFormat responseFormat = e.getResponseFormat();
             handleComponentException(auditingAction, componentId, artifactId, responseFormat, componentType, userId);
@@ -3654,7 +3158,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             handleComponentException(auditingAction, componentId, artifactId, responseFormat, componentType, userId);
             throw e;
         }
-        return Either.left(user);
+        return user;
     }
 
     private void handleComponentException(AuditingActionEnum auditingAction, String componentId, String artifactId,
@@ -3685,75 +3189,62 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return auditingAction;
     }
 
-    private Either<ImmutablePair<String, byte[]>, ResponseFormat> downloadArtifact(ArtifactDefinition artifactDefinition) {
+    private ImmutablePair<String, byte[]> downloadArtifact(ArtifactDefinition artifactDefinition) {
         String esArtifactId = artifactDefinition.getEsId();
-        Either<ESArtifactData, CassandraOperationStatus> artifactfromES = artifactCassandraDao.getArtifact(esArtifactId);
+        Either<DAOArtifactData, CassandraOperationStatus> artifactfromES = artifactCassandraDao.getArtifact(esArtifactId);
         if (artifactfromES.isRight()) {
             CassandraOperationStatus resourceUploadStatus = artifactfromES.right().value();
             StorageOperationStatus storageResponse = DaoStatusConverter.convertCassandraStatusToStorageStatus(resourceUploadStatus);
             ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(storageResponse);
             log.debug("Error when getting artifact from ES, error: {}", actionStatus);
-            ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(actionStatus, artifactDefinition
-                    .getArtifactDisplayName());
-
-            return Either.right(responseFormat);
+            throw new ByActionStatusComponentException(actionStatus, artifactDefinition.getArtifactDisplayName());
         }
 
-        ESArtifactData esArtifactData = artifactfromES.left().value();
-        byte[] data = esArtifactData.getDataAsArray();
+        DAOArtifactData DAOArtifactData = artifactfromES.left().value();
+        byte[] data = DAOArtifactData.getDataAsArray();
         if (data == null) {
-            log.debug("Artifact data from ES is null");
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, artifactDefinition.getArtifactDisplayName()));
+            log.debug("Artifact data from cassandra is null");
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, artifactDefinition.getArtifactDisplayName());
         }
         String artifactName = artifactDefinition.getArtifactName();
         log.trace("Download of artifact succeeded, uniqueId {}, artifact file name {}", artifactDefinition.getUniqueId(), artifactName);
-        return Either.left(new ImmutablePair<String, byte[]>(artifactName, data));
+        return new ImmutablePair<>(artifactName, data);
     }
 
-    public ESArtifactData createEsArtifactData(ArtifactDataDefinition artifactInfo, byte[] artifactPayload) {
-        return new ESArtifactData(artifactInfo.getEsId(), artifactPayload);
+    public DAOArtifactData createEsArtifactData(ArtifactDataDefinition artifactInfo, byte[] artifactPayload) {
+        return new DAOArtifactData(artifactInfo.getEsId(), artifactPayload);
     }
 
-    private boolean saveArtifacts(ESArtifactData artifactData, String resourceId) {
+    private void saveArtifactInCassandra(DAOArtifactData artifactData, Component parent, ArtifactDefinition artifactInfo,
+                                         String currArtifactId, String prevArtifactId, AuditingActionEnum auditingAction, ComponentTypeEnum componentType) {
         CassandraOperationStatus resourceUploadStatus = artifactCassandraDao.saveArtifact(artifactData);
 
-        if (resourceUploadStatus.equals(CassandraOperationStatus.OK)) {
-            log.debug("Artifact {} was saved in component .", artifactData.getId(), resourceId);
+        if (resourceUploadStatus == CassandraOperationStatus.OK) {
+            log.debug("Artifact {} was saved in component {}.", artifactData.getId(), parent.getUniqueId());
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
+            handleAuditing(auditingAction, parent, parent.getUniqueId(), null, artifactInfo, prevArtifactId,
+                    currArtifactId, responseFormat, componentType, null);
         }
         else {
-            log.info("Failed to save artifact {}.", artifactData.getId());
-            return false;
+            BeEcompErrorManager.getInstance().logBeDaoSystemError(UPDATE_ARTIFACT);
+            log.info(FAILED_SAVE_ARTIFACT);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
+            handleAuditing(auditingAction, parent, parent.getUniqueId(), null, artifactInfo, prevArtifactId, currArtifactId, responseFormat, componentType, null);
+            throw new StorageException(resourceUploadStatus);
         }
-        return true;
     }
 
     private boolean isArtifactMetadataUpdate(AuditingActionEnum auditingActionEnum) {
-        return auditingActionEnum.equals(AuditingActionEnum.ARTIFACT_METADATA_UPDATE);
+        return auditingActionEnum == AuditingActionEnum.ARTIFACT_METADATA_UPDATE;
     }
 
     private boolean isDeploymentArtifact(ArtifactDefinition artifactInfo) {
-        return ArtifactGroupTypeEnum.DEPLOYMENT.equals(artifactInfo.getArtifactGroupType());
+        return ArtifactGroupTypeEnum.DEPLOYMENT == artifactInfo.getArtifactGroupType();
     }
 
-    public Either<ArtifactDefinition, ResponseFormat> createArtifactPlaceHolderInfo(String resourceId, String logicalName, Map<String, Object> artifactInfoMap, String userUserId, ArtifactGroupTypeEnum groupType, boolean inTransaction) {
-        Either<User, ActionStatus> user = userAdminManager.getUser(userUserId, inTransaction);
-        if (user.isRight()) {
-            ResponseFormat responseFormat;
-            if (user.right().value().equals(ActionStatus.USER_NOT_FOUND)) {
-                log.debug("create artifact placeholder - not authorized user, userId {}", userUserId);
-                responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
-            }
-            else {
-                log.debug("create artifact placeholder - failed to authorize user, userId {}", userUserId);
-                responseFormat = componentsUtils.getResponseFormat(user.right().value());
-            }
-            return Either.right(responseFormat);
-        }
-
-        ArtifactDefinition artifactDefinition = createArtifactPlaceHolderInfo(resourceId, logicalName, artifactInfoMap, user
-                .left()
-                .value(), groupType);
-        return Either.left(artifactDefinition);
+    public ArtifactDefinition createArtifactPlaceHolderInfo(String resourceId, String logicalName, Map<String, Object> artifactInfoMap, String userUserId, ArtifactGroupTypeEnum groupType, boolean inTransaction) {
+        User user = userBusinessLogic.getUser(userUserId, inTransaction);
+        return createArtifactPlaceHolderInfo(resourceId, logicalName, artifactInfoMap, user, groupType);
     }
 
     public ArtifactDefinition createArtifactPlaceHolderInfo(String resourceId, String logicalName, Map<String, Object> artifactInfoMap, User user, ArtifactGroupTypeEnum groupType) {
@@ -3780,7 +3271,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
         if (resourceId != null) {
             uniqueId = UniqueIdBuilder.buildPropertyUniqueId(resourceId.toLowerCase(), artifactInfo.getArtifactLabel()
-                                                                                                   .toLowerCase());
+                    .toLowerCase());
             artifactInfo.setUniqueId(uniqueId);
         }
         artifactInfo.setUserIdCreator(user.getUserId());
@@ -3802,15 +3293,15 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return artifactToscaOperation.getArtifacts(parentId, parentType, groupType, instanceId);
     }
 
-    public Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact(ArtifactDefinition artifactHeatEnv, ArtifactDefinition artifact, String componentId, NodeTypeEnum parentType, String instanceId) {
-        return artifactToscaOperation.addHeatEnvArtifact(artifactHeatEnv, artifact, componentId, parentType, true, instanceId);
+    public Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact(ArtifactDefinition artifactHeatEnv, ArtifactDefinition artifact, Component component, NodeTypeEnum parentType, String instanceId) {
+        return artifactToscaOperation.addHeatEnvArtifact(artifactHeatEnv, artifact, component, parentType, true, instanceId);
     }
 
-    private Either<ESArtifactData, ResponseFormat> createEsHeatEnvArtifactDataFromString(ArtifactDefinition artifactDefinition, String payloadStr) {
+    private Either<DAOArtifactData, ResponseFormat> createEsHeatEnvArtifactDataFromString(ArtifactDefinition artifactDefinition, String payloadStr) {
 
         byte[] payload = payloadStr.getBytes();
 
-        ESArtifactData artifactData = createEsArtifactData(artifactDefinition, payload);
+        DAOArtifactData artifactData = createEsArtifactData(artifactDefinition, payload);
         return Either.left(artifactData);
     }
 
@@ -3818,34 +3309,35 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param artifactDefinition
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> generateHeatEnvArtifact(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName, User modifier,
+    public Either<ArtifactDefinition, ResponseFormat> generateHeatEnvArtifact(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, Component component, String resourceInstanceName, User modifier,
                                                                               String instanceId, boolean shouldLock, boolean inTransaction) {
         String payload = generateHeatEnvPayload(artifactDefinition);
         String prevUUID = artifactDefinition.getArtifactUUID();
         ArtifactDefinition clonedBeforeGenerate = new ArtifactDefinition(artifactDefinition);
         return generateAndSaveHeatEnvArtifact(artifactDefinition, payload, componentType, component, resourceInstanceName, modifier, instanceId, shouldLock, inTransaction)
                 .left()
-                .bind(artifactDef -> updateArtifactOnGroupInstance(componentType, component, instanceId, prevUUID, clonedBeforeGenerate, artifactDef));
+                .bind(artifactDef -> updateArtifactOnGroupInstance(component, instanceId, prevUUID, clonedBeforeGenerate, artifactDef));
     }
 
-    public Either<ArtifactDefinition, ResponseFormat> forceGenerateHeatEnvArtifact(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName, User modifier,
+    public Either<ArtifactDefinition, ResponseFormat> forceGenerateHeatEnvArtifact(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, Component component, String resourceInstanceName, User modifier,
                                                                                    boolean shouldLock, boolean inTransaction, String instanceId) {
         String payload = generateHeatEnvPayload(artifactDefinition);
         String prevUUID = artifactDefinition.getArtifactUUID();
         ArtifactDefinition clonedBeforeGenerate = new ArtifactDefinition(artifactDefinition);
         return forceGenerateAndSaveHeatEnvArtifact(artifactDefinition, payload, componentType, component, resourceInstanceName, modifier, instanceId, shouldLock, inTransaction)
                 .left()
-                .bind(artifactDef -> updateArtifactOnGroupInstance(componentType, component, instanceId, prevUUID, clonedBeforeGenerate, artifactDef));
+                .bind(artifactDef -> updateArtifactOnGroupInstance(component, instanceId, prevUUID, clonedBeforeGenerate, artifactDef));
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> updateArtifactOnGroupInstance(ComponentTypeEnum componentType, Component component, String instanceId, String prevUUID, ArtifactDefinition clonedBeforeGenerate, ArtifactDefinition updatedArtDef) {
+    @VisibleForTesting
+    Either<ArtifactDefinition, ResponseFormat> updateArtifactOnGroupInstance(Component component, String instanceId, String prevUUID, ArtifactDefinition clonedBeforeGenerate, ArtifactDefinition updatedArtDef) {
         if (prevUUID == null || !prevUUID.equals(updatedArtDef.getArtifactUUID())) {
             List<ComponentInstance> componentInstances = component.getComponentInstances();
             if (componentInstances != null) {
                 Optional<ComponentInstance> findFirst = componentInstances.stream()
-                                                                          .filter(ci -> ci.getUniqueId()
-                                                                                          .equals(instanceId))
-                                                                          .findFirst();
+                        .filter(ci -> ci.getUniqueId()
+                                .equals(instanceId))
+                        .findFirst();
                 if (findFirst.isPresent()) {
                     ComponentInstance relevantInst = findFirst.get();
                     List<GroupInstance> updatedGroupInstances = getUpdatedGroupInstances(updatedArtDef.getUniqueId(), clonedBeforeGenerate, relevantInst
@@ -3861,7 +3353,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                             log.debug(FAILED_UPDATE_GROUPS, component.getUniqueId());
                             ResponseFormat responseFormat = componentsUtils.getResponseFormatByArtifactId(componentsUtils
                                     .convertFromStorageResponse(status.right()
-                                                                      .value()), clonedBeforeGenerate.getArtifactDisplayName());
+                                            .value()), clonedBeforeGenerate.getArtifactDisplayName());
                             return Either.right(responseFormat);
                         }
                     }
@@ -3877,7 +3369,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         sb.append(ConfigurationManager.getConfigurationManager().getConfiguration().getHeatEnvArtifactHeader());
         sb.append("parameters:\n");
         if (heatParameters != null) {
-            heatParameters.sort(Comparator.comparing(e -> e.getName()));
+            heatParameters.sort(Comparator.comparing(HeatParameterDataDefinition::getName));
 
             List<HeatParameterDefinition> empltyHeatValues = new ArrayList<>();
 
@@ -3896,28 +3388,28 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     switch (type) {
                         case BOOLEAN:
                             sb.append("  ")
-                              .append(heatParameterDefinition.getName())
-                              .append(":")
-                              .append(" ")
-                              .append(Boolean.parseBoolean(heatValue))
-                              .append("\n");
+                                    .append(heatParameterDefinition.getName())
+                                    .append(":")
+                                    .append(" ")
+                                    .append(Boolean.parseBoolean(heatValue))
+                                    .append("\n");
                             break;
                         case NUMBER:
                             sb.append("  ")
-                              .append(heatParameterDefinition.getName())
-                              .append(":")
-                              .append(" ")
-                              .append(new BigDecimal(heatValue).toPlainString())
-                              .append("\n");
+                                    .append(heatParameterDefinition.getName())
+                                    .append(":")
+                                    .append(" ")
+                                    .append(new BigDecimal(heatValue).toPlainString())
+                                    .append("\n");
                             break;
                         case COMMA_DELIMITED_LIST:
                         case JSON:
                             sb.append("  ")
-                              .append(heatParameterDefinition.getName())
-                              .append(":")
-                              .append(" ")
-                              .append(heatValue)
-                              .append("\n");
+                                    .append(heatParameterDefinition.getName())
+                                    .append(":")
+                                    .append(" ")
+                                    .append(heatValue)
+                                    .append("\n");
                             break;
                         default:
                             String value = heatValue;
@@ -3931,10 +3423,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                                 }
                             }
                             sb.append("  ")
-                              .append(heatParameterDefinition.getName())
-                              .append(":")
-                              .append(" ")
-                              .append(value);
+                                    .append(heatParameterDefinition.getName())
+                                    .append(":")
+                                    .append(" ")
+                                    .append(value);
                             sb.append("\n");
                             break;
 
@@ -3942,7 +3434,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 }
             }
             if (!empltyHeatValues.isEmpty()) {
-                empltyHeatValues.sort(Comparator.comparing(e -> e.getName()));
+                empltyHeatValues.sort(Comparator.comparing(HeatParameterDataDefinition::getName));
                 empltyHeatValues.forEach(hv -> {
                     sb.append("  ").append(hv.getName()).append(":");
                     HeatParameterType type = HeatParameterType.isValidType(hv.getType());
@@ -3967,23 +3459,22 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param payload
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> generateAndSaveHeatEnvArtifact(ArtifactDefinition artifactDefinition, String payload, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName,
+    public Either<ArtifactDefinition, ResponseFormat> generateAndSaveHeatEnvArtifact(ArtifactDefinition artifactDefinition, String payload, ComponentTypeEnum componentType, Component component, String resourceInstanceName,
                                                                                      User modifier, String instanceId, boolean shouldLock, boolean inTransaction) {
-        return generateArtifactPayload(artifactDefinition, componentType, component, resourceInstanceName, modifier, shouldLock, inTransaction, () -> artifactDefinition
-                        .getHeatParamsUpdateDate(),
+        return generateArtifactPayload(artifactDefinition, componentType, component, resourceInstanceName, modifier, shouldLock, inTransaction, artifactDefinition::getHeatParamsUpdateDate,
                 () -> createEsHeatEnvArtifactDataFromString(artifactDefinition, payload), instanceId);
 
     }
 
-    public Either<ArtifactDefinition, ResponseFormat> forceGenerateAndSaveHeatEnvArtifact(ArtifactDefinition artifactDefinition, String payload, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName,
+    public Either<ArtifactDefinition, ResponseFormat> forceGenerateAndSaveHeatEnvArtifact(ArtifactDefinition artifactDefinition, String payload, ComponentTypeEnum componentType, Component component, String resourceInstanceName,
                                                                                           User modifier, String instanceId, boolean shouldLock, boolean inTransaction) {
         return generateArtifactPayload(artifactDefinition, componentType, component, resourceInstanceName, modifier, shouldLock, inTransaction, System::currentTimeMillis,
                 () -> createEsHeatEnvArtifactDataFromString(artifactDefinition, payload), instanceId);
 
     }
 
-    protected Either<ArtifactDefinition, ResponseFormat> generateArtifactPayload(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, org.openecomp.sdc.be.model.Component component, String resourceInstanceName, User modifier,
-                                                                                 boolean shouldLock, boolean inTransaction, Supplier<Long> payloadUpdateDateGen, Supplier<Either<ESArtifactData, ResponseFormat>> esDataCreator, String instanceId) {
+    protected Either<ArtifactDefinition, ResponseFormat> generateArtifactPayload(ArtifactDefinition artifactDefinition, ComponentTypeEnum componentType, Component component, String resourceInstanceName, User modifier,
+                                                                                 boolean shouldLock, boolean inTransaction, Supplier<Long> payloadUpdateDateGen, Supplier<Either<DAOArtifactData, ResponseFormat>> esDataCreator, String instanceId) {
 
         log.trace("Start generating payload for {} artifact {}", artifactDefinition.getArtifactType(), artifactDefinition
                 .getEsId());
@@ -3991,8 +3482,8 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 .getPayloadUpdateDate() <= payloadUpdateDateGen.get()) {
 
             log.trace("Generating payload for {} artifact {}", artifactDefinition.getArtifactType(), artifactDefinition.getEsId());
-            Either<ESArtifactData, ResponseFormat> artifactDataRes = esDataCreator.get();
-            ESArtifactData artifactData = null;
+            Either<DAOArtifactData, ResponseFormat> artifactDataRes = esDataCreator.get();
+            DAOArtifactData artifactData = null;
 
             if (artifactDataRes.isLeft()) {
                 artifactData = artifactDataRes.left().value();
@@ -4008,8 +3499,8 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             String newCheckSum = GeneralUtility.calculateMD5Base64EncodedByByteArray(artifactData.getDataAsArray());
             String oldCheckSum;
             String esArtifactId = artifactDefinition.getEsId();
-            Either<ESArtifactData, CassandraOperationStatus> artifactfromES;
-            ESArtifactData esArtifactData;
+            Either<DAOArtifactData, CassandraOperationStatus> artifactfromES;
+            DAOArtifactData DAOArtifactData;
             if (esArtifactId != null && !esArtifactId.isEmpty() && artifactDefinition.getPayloadData() == null) {
                 log.debug("Try to fetch artifact from cassandra with id : {}", esArtifactId);
                 artifactfromES = artifactCassandraDao.getArtifact(esArtifactId);
@@ -4020,8 +3511,8 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     log.debug("Error when getting artifact from ES, error: {} esid : {}", actionStatus, esArtifactId);
                     return Either.right(componentsUtils.getResponseFormatByArtifactId(actionStatus, artifactDefinition.getArtifactDisplayName()));
                 }
-                esArtifactData = artifactfromES.left().value();
-                oldCheckSum = GeneralUtility.calculateMD5Base64EncodedByByteArray(esArtifactData.getDataAsArray());
+                DAOArtifactData = artifactfromES.left().value();
+                oldCheckSum = GeneralUtility.calculateMD5Base64EncodedByByteArray(DAOArtifactData.getDataAsArray());
             }
             else {
                 oldCheckSum = artifactDefinition.getArtifactChecksum();
@@ -4030,11 +3521,12 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             Either<ArtifactDefinition, StorageOperationStatus> updateArifactDefinitionStatus = null;
 
             if (shouldLock) {
-                Either<Boolean, ResponseFormat> lockComponent = lockComponent(component, "Update Artifact - lock resource: ");
-                if (lockComponent.isRight()) {
+                try {
+                    lockComponent(component, "Update Artifact - lock resource: ");
+                }catch (ComponentException e){
                     handleAuditing(AuditingActionEnum.ARTIFACT_METADATA_UPDATE, component, component.getUniqueId(), modifier, null, null, artifactDefinition
-                            .getUniqueId(), lockComponent.right().value(), component.getComponentType(), null);
-                    return Either.right(lockComponent.right().value());
+                            .getUniqueId(), e.getResponseFormat(), component.getComponentType(), null);
+                    throw e;
                 }
             }
             try {
@@ -4042,7 +3534,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
 
                     artifactDefinition.setPayloadUpdateDate(payloadUpdateDateGen.get());
                     updateArifactDefinitionStatus = artifactToscaOperation.updateArtifactOnResource(artifactDefinition, component
-                            .getUniqueId(), artifactDefinition.getUniqueId(), componentType.getNodeType(), instanceId);
+                            ,artifactDefinition.getUniqueId(), componentType.getNodeType(), instanceId, true);
                     log.trace("No real update done in payload for {} artifact, updating payloadUpdateDate {}", artifactDefinition
                             .getArtifactType(), artifactDefinition.getEsId());
                     if (updateArifactDefinitionStatus.isRight()) {
@@ -4058,28 +3550,27 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     }
                 }
                 else {
-
-                    oldCheckSum = artifactDefinition.getArtifactChecksum();
+                    artifactDefinition.getArtifactChecksum();
                     artifactDefinition.setArtifactChecksum(newCheckSum);
                     artifactDefinition.setEsId(artifactDefinition.getUniqueId());
                     log.trace("No real update done in payload for {} artifact, updating payloadUpdateDate {}", artifactDefinition
                             .getArtifactType(), artifactDefinition.getEsId());
-                    updateArifactDefinitionStatus = artifactToscaOperation.updateArtifactOnResource(artifactDefinition, component
-                            .getUniqueId(), artifactDefinition.getUniqueId(), componentType.getNodeType(), instanceId);
+                    updateArifactDefinitionStatus = artifactToscaOperation.updateArtifactOnResource(artifactDefinition, component,
+                            artifactDefinition.getUniqueId(), componentType.getNodeType(), instanceId, true);
 
-                    log.trace("Update Payload  ", artifactDefinition.getEsId());
+                    log.trace("Update Payload {}", artifactDefinition.getEsId());
                 }
-                if (updateArifactDefinitionStatus != null && updateArifactDefinitionStatus.isLeft()) {
+                if (updateArifactDefinitionStatus.isLeft()) {
 
                     artifactDefinition = updateArifactDefinitionStatus.left().value();
                     artifactData.setId(artifactDefinition.getUniqueId());
                     CassandraOperationStatus saveArtifactStatus = artifactCassandraDao.saveArtifact(artifactData);
 
-                    if (saveArtifactStatus.equals(CassandraOperationStatus.OK)) {
+                    if (saveArtifactStatus == CassandraOperationStatus.OK) {
                         if (!inTransaction) {
                             janusGraphDao.commit();
                         }
-                        log.debug("Artifact Saved In ES {}", artifactData.getId());
+                        log.debug("Artifact Saved In cassandra {}", artifactData.getId());
                         ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
                         handleAuditing(AuditingActionEnum.ARTIFACT_PAYLOAD_UPDATE, component, component.getUniqueId(), modifier, artifactDefinition, artifactDefinition
                                         .getUniqueId(), artifactDefinition.getUniqueId(), responseFormat,
@@ -4115,7 +3606,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             finally {
                 if (shouldLock) {
                     graphLockOperation.unlockComponent(component.getUniqueId(), component.getComponentType()
-                                                                                         .getNodeType());
+                            .getNodeType());
                 }
             }
         }
@@ -4153,259 +3644,208 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         json.put(Constants.ARTIFACT_GROUP_TYPE, artifactGroupType.getType());
         json.put(Constants.REQUIRED_ARTIFACTS, (updatedRequiredArtifacts == null || updatedRequiredArtifacts.isEmpty()) ? new ArrayList<>()
                 : updatedRequiredArtifacts.stream()
-                                          .filter(e -> e.getType().equals(ArtifactTypeEnum.HEAT_ARTIFACT.getType()) || e
-                                                  .getType()
-                                                  .equals(ArtifactTypeEnum.HEAT_NESTED.getType()))
-                                          .map(e -> e.getFileName())
-                                          .collect(Collectors.toList()));
+                .filter(e -> e.getType().equals(ArtifactTypeEnum.HEAT_ARTIFACT.getType()) || e
+                        .getType()
+                        .equals(ArtifactTypeEnum.HEAT_NESTED.getType()))
+                .map(ArtifactTemplateInfo::getFileName)
+                .collect(Collectors.toList()));
         json.put(Constants.ARTIFACT_HEAT_PARAMS, (heatParameters == null || heatParameters.isEmpty()) ? new ArrayList<>()
                 : heatParameters);
         return json;
     }
 
-    public Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateResourceInstanceArtifactNoContent(String resourceId, Component containerComponent, User user, Map<String, Object> json, ArtifactOperationInfo operation, ArtifactDefinition artifactInfo) {
+    public Either<ArtifactDefinition, Operation> updateResourceInstanceArtifactNoContent(String resourceId, Component containerComponent, User user, Map<String, Object> json, ArtifactOperationInfo operation, ArtifactDefinition artifactInfo) {
 
         String jsonStr = gson.toJson(json);
-        ArtifactDefinition artifactDefinitionFromJson = artifactInfo == null ? RepresentationUtils.convertJsonToArtifactDefinition(jsonStr, ArtifactDefinition.class) : artifactInfo;
+        ArtifactDefinition artifactDefinitionFromJson = artifactInfo == null ? RepresentationUtils.convertJsonToArtifactDefinition(jsonStr, ArtifactDefinition.class, false) : artifactInfo;
         String artifactUniqueId = artifactDefinitionFromJson == null ? null : artifactDefinitionFromJson.getUniqueId();
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> uploadArtifactToService = validateAndHandleArtifact(resourceId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, artifactUniqueId,
+        Either<ArtifactDefinition, Operation> uploadArtifactToService = validateAndHandleArtifact(resourceId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, artifactUniqueId,
                 artifactDefinitionFromJson, null, jsonStr, null, null, user, containerComponent, false, false, true);
-        if (uploadArtifactToService.isRight()) {
-            return Either.right(uploadArtifactToService.right().value());
-        }
 
         return Either.left(uploadArtifactToService.left().value());
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> handleUpdateHeatEnv(String componentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, String artifactId, User user, ComponentTypeEnum componentType,
-                                                                                              org.openecomp.sdc.be.model.Component parent, String originData, String origMd5, ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction) {
-        convertParentType(componentType);
-        String parentId = parent.getUniqueId();
-        ArtifactDefinition currArtifact = artifactInfo;
-
+    private Either<ArtifactDefinition, Operation> handleUpdateHeatEnvAndHeatMeta(String componentId, ArtifactDefinition artifactInfo, AuditingActionEnum auditingAction, String artifactId, User user, ComponentTypeEnum componentType,
+                                                                                 Component parent, String originData, String origMd5, ArtifactOperationInfo operation) {
         if (origMd5 != null) {
-            Either<Boolean, ResponseFormat> validateMd5 = validateMd5(origMd5, originData, artifactInfo.getPayloadData(), operation);
-            if (validateMd5.isRight()) {
-                ResponseFormat responseFormat = validateMd5.right().value();
-                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                return Either.right(responseFormat);
-            }
-
-            if (artifactInfo.getPayloadData() != null && artifactInfo.getPayloadData().length != 0) {
-                Either<Boolean, ResponseFormat> deploymentValidationResult = validateDeploymentArtifact(parent, componentId, false, artifactInfo, currArtifact, NodeTypeEnum.ResourceInstance);
-                if (deploymentValidationResult.isRight()) {
-                    ResponseFormat responseFormat = deploymentValidationResult.right().value();
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    return Either.right(responseFormat);
-                }
-
-                Either<byte[], ResponseFormat> payloadEither = handlePayload(artifactInfo, isArtifactMetadataUpdate(auditingAction));
-                if (payloadEither.isRight()) {
-                    ResponseFormat responseFormat = payloadEither.right().value();
-                    handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                    return Either.right(responseFormat);
-                }
-            }
-            else { // duplicate
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.MISSING_DATA, ARTIFACT_PAYLOAD);
-                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, responseFormat, componentType, null);
-                return Either.right(responseFormat);
+            validateMd5(origMd5, originData, artifactInfo.getPayloadData(), operation);
+            if (ArrayUtils.isNotEmpty(artifactInfo.getPayloadData())) {
+                validateDeploymentArtifact(parent, componentId, false, artifactInfo, artifactInfo, NodeTypeEnum.ResourceInstance);
+                handlePayload(artifactInfo, isArtifactMetadataUpdate(auditingAction));
+            } else { // duplicate
+                throw new ByActionStatusComponentException(ActionStatus.MISSING_DATA, ARTIFACT_PAYLOAD);
             }
         }
-
-        // lock resource
-        if (shouldLock) {
-            Either<Boolean, ResponseFormat> lockComponent = lockComponent(parent, UPDATE_ARTIFACT_LOCK);
-            if (lockComponent.isRight()) {
-                handleAuditing(auditingAction, parent, parentId, user, null, null, artifactId, lockComponent.right()
-                                                                                                            .value(), componentType, null);
-                return Either.right(lockComponent.right().value());
-            }
-        }
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        try {
-            resultOp = updateHeatEnvParams(componentId, artifactId, artifactInfo, user, auditingAction, parent, componentType, origMd5);
-            return resultOp;
-
-        }
-        finally {
-            // unlock resource
-            if (resultOp == null || resultOp.isRight()) {
-                log.debug(ROLLBACK);
-                if (!inTransaction) {
-                    janusGraphDao.rollback();
-                }
-            }
-            else {
-                log.debug(COMMIT);
-                if (!inTransaction) {
-                    janusGraphDao.commit();
-                }
-            }
-            if (shouldLock) {
-                componentType = parent.getComponentType();
-            }
-            NodeTypeEnum nodeType = componentType.getNodeType();
-            graphLockOperation.unlockComponent(parent.getUniqueId(), nodeType);
-        }
+        return updateHeatEnvParamsAndMetadata(componentId, artifactId, artifactInfo, user, auditingAction, parent, componentType, origMd5);
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateHeatEnvParams(String componentId, String artifactId, ArtifactDefinition artifactInfo, User user, AuditingActionEnum auditingAction, Component parent,
-                                                                                              ComponentTypeEnum componentType, String origMd5) {
-
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp = null;
-        Either<ArtifactDefinition, Operation> insideEither = null;
+    private Either<ArtifactDefinition, Operation> updateHeatEnvParamsAndMetadata(String componentId, String artifactId, ArtifactDefinition artifactInfo, User user, AuditingActionEnum auditingAction, Component parent,
+                                                                                 ComponentTypeEnum componentType, String origMd5) {
         Either<ComponentInstance, ResponseFormat> getRI = getRIFromComponent(parent, componentId, artifactId, auditingAction, user);
         if (getRI.isRight()) {
-            return Either.right(getRI.right().value());
+            throw new ByResponseFormatComponentException(getRI.right().value());
         }
         ComponentInstance ri = getRI.left().value();
         Either<ArtifactDefinition, ResponseFormat> getArtifactRes = getArtifactFromRI(parent, ri, componentId, artifactId, auditingAction, user);
         if (getArtifactRes.isRight()) {
-            return Either.right(getArtifactRes.right().value());
+            throw new ByResponseFormatComponentException(getArtifactRes.right().value());
         }
         ArtifactDefinition currArtifact = getArtifactRes.left().value();
 
-        if (currArtifact.getArtifactType().equals(ArtifactTypeEnum.HEAT.getType()) || currArtifact.getArtifactType()
-                                                                                                  .equals(ArtifactTypeEnum.HEAT_VOL
-                                                                                                          .getType()) || currArtifact
-                .getArtifactType()
-                .equals(ArtifactTypeEnum.HEAT_NET.getType())) {
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION);
-            handleAuditing(auditingAction, parent, parent.getUniqueId(), user, artifactInfo, null, artifactId, responseFormat, componentType, ri
-                    .getName());
-            return Either.right(responseFormat);
+        if (currArtifact.getArtifactType().equals(ArtifactTypeEnum.HEAT.getType()) ||
+                currArtifact.getArtifactType().equals(ArtifactTypeEnum.HEAT_VOL.getType()) ||
+                currArtifact.getArtifactType().equals(ArtifactTypeEnum.HEAT_NET.getType())) {
+            throw new ByActionStatusComponentException(ActionStatus.RESTRICTED_OPERATION);
         }
         List<HeatParameterDefinition> currentHeatEnvParams = currArtifact.getListHeatParameters();
         List<HeatParameterDefinition> updatedHeatEnvParams = artifactInfo.getListHeatParameters();
-        new ArrayList<HeatParameterDefinition>();
 
         // upload
         if (origMd5 != null) {
-            Either<List<HeatParameterDefinition>, ResponseFormat> uploadParamsValidationResult = validateUploadParamsFromEnvFile(auditingAction, parent, user, artifactInfo, artifactId, componentType, ri
-                            .getName(), currentHeatEnvParams,
-                    updatedHeatEnvParams, currArtifact.getArtifactName());
+            Either<List<HeatParameterDefinition>, ResponseFormat> uploadParamsValidationResult = validateUploadParamsFromEnvFile(auditingAction, parent, user, artifactInfo,
+                    artifactId, componentType, ri.getName(), currentHeatEnvParams, updatedHeatEnvParams, currArtifact.getArtifactName());
             if (uploadParamsValidationResult.isRight()) {
-                ResponseFormat responseFormat = uploadParamsValidationResult.right().value();
-                handleAuditing(auditingAction, parent, parent.getUniqueId(), user, artifactInfo, null, artifactId, responseFormat, componentType, ri
-                        .getName());
-                return Either.right(responseFormat);
+                throw new ByResponseFormatComponentException(uploadParamsValidationResult.right().value());
             }
             artifactInfo.setListHeatParameters(updatedHeatEnvParams);
         }
 
-        Either<ArtifactDefinition, ResponseFormat> validateAndConvertHeatParamers = validateAndConvertHeatParamers(artifactInfo, ArtifactTypeEnum.HEAT_ENV
-                .getType());
+        Either<ArtifactDefinition, ResponseFormat> validateAndConvertHeatParamers = validateAndConvertHeatParameters(artifactInfo, ArtifactTypeEnum.HEAT_ENV.getType());
         if (validateAndConvertHeatParamers.isRight()) {
-            ResponseFormat responseFormat = validateAndConvertHeatParamers.right().value();
-            handleAuditing(auditingAction, parent, parent.getUniqueId(), user, artifactInfo, null, artifactId, responseFormat, componentType, ri
-                    .getName());
-            return Either.right(responseFormat);
+            throw new ByResponseFormatComponentException(validateAndConvertHeatParamers.right().value());
         }
 
         if (updatedHeatEnvParams != null && !updatedHeatEnvParams.isEmpty()) {
             // fill reduced heat env parameters List for updating
-            replaceCurrHeatValueWithUpdatedValue(currentHeatEnvParams, updatedHeatEnvParams);
-            currArtifact.setHeatParamsUpdateDate(System.currentTimeMillis());
-            currArtifact.setListHeatParameters(currentHeatEnvParams);
-
-            Either<ArtifactDefinition, StorageOperationStatus> updateArifactRes = artifactToscaOperation.updateArtifactOnResource(currArtifact, parent
-                    .getUniqueId(), currArtifact.getUniqueId(), componentType.getNodeType(), componentId);
-            if (updateArifactRes.isRight()) {
-                log.debug("Failed to update artifact on graph  - {}", artifactId);
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(updateArifactRes
-                        .right()
-                        .value()));
-                handleAuditing(auditingAction, parent, parent.getUniqueId(), user, artifactInfo, null, artifactId, responseFormat, componentType, ri
-                        .getName());
-                return Either.right(responseFormat);
-            }
-            StorageOperationStatus error = generateCustomizationUUIDOnInstance(parent.getUniqueId(), ri.getUniqueId(), componentType);
-            if (error != StorageOperationStatus.OK) {
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(error));
-                handleAuditing(auditingAction, parent, parent.getUniqueId(), user, artifactInfo, null, artifactId, responseFormat, componentType, ri
-                        .getName());
-                return Either.right(responseFormat);
+            boolean updateRequired = replaceCurrHeatValueWithUpdatedValue(currentHeatEnvParams, updatedHeatEnvParams);
+            if (updateRequired) {
+                currArtifact.setHeatParamsUpdateDate(System.currentTimeMillis());
+                currArtifact.setListHeatParameters(currentHeatEnvParams);
+                Either<ArtifactDefinition, StorageOperationStatus> updateArtifactRes = artifactToscaOperation.updateArtifactOnResource(
+                        currArtifact, parent, currArtifact.getUniqueId(), componentType.getNodeType(), componentId, true);
+                if (updateArtifactRes.isRight()) {
+                    log.debug("Failed to update artifact on graph  - {}", artifactId);
+                    throw new StorageException(updateArtifactRes.right().value());
+                }
+                StorageOperationStatus error = generateCustomizationUUIDOnGroupInstance(ri, updateArtifactRes.left().value().getUniqueId(), parent.getUniqueId());
+                if (error != StorageOperationStatus.OK) {
+                    throw new StorageException(error);
+                }
             }
+        }
+        updateHeatMetaDataIfNeeded(componentId,user,auditingAction,componentType, parent,ri,artifactInfo);
+        StorageOperationStatus error = generateCustomizationUUIDOnInstance(parent.getUniqueId(), ri.getUniqueId(), componentType);
+        if (error != StorageOperationStatus.OK) {
+            throw new StorageException(error);
+        }
 
-            error = generateCustomizationUUIDOnGroupInstance(ri, updateArifactRes.left()
-                                                                                 .value()
-                                                                                 .getUniqueId(), parent.getUniqueId());
+        return Either.left(currArtifact);
+    }
+
+    private void
+    updateHeatMetaDataIfNeeded(String componentId, User user, AuditingActionEnum auditingAction, ComponentTypeEnum componentType, Component parent, ComponentInstance resourceInstance, ArtifactDefinition updatedHeatEnvArtifact) {
+        String heatArtifactId = updatedHeatEnvArtifact.getGeneratedFromId();
+        Either<ArtifactDefinition, ResponseFormat> getArtifactRes = getArtifactFromRI(parent, resourceInstance, componentId, heatArtifactId, auditingAction, user);
+        if (getArtifactRes.isRight()) {
+            throw new ByResponseFormatComponentException(getArtifactRes.right().value());
+        }
+        ArtifactDefinition heatArtifactToUpdate = getArtifactRes.left().value();
+        if (isUpdateHeatMetaDataNeeded(updatedHeatEnvArtifact, heatArtifactToUpdate)) {
+            validateHeatMetaData(updatedHeatEnvArtifact);
+            updateHeatMetadataFromHeatEnv(updatedHeatEnvArtifact, heatArtifactToUpdate);
+            Either<ArtifactDefinition, StorageOperationStatus> updateArtifactRes = artifactToscaOperation.updateArtifactOnResource(heatArtifactToUpdate, parent,
+                    heatArtifactToUpdate.getUniqueId(), componentType.getNodeType(), componentId, false);
+
+            if (updateArtifactRes.isRight()) {
+                log.debug("Failed to update artifact on graph  - {}", heatArtifactId);
+                throw new StorageException(updateArtifactRes.right().value());
+            }
+            ArtifactDefinition artifactDefinition = updateArtifactRes.left().value();
+            updateGeneratedIdInHeatEnvOnInstance(resourceInstance, parent, heatArtifactId, heatArtifactToUpdate, artifactDefinition, componentType.getNodeType());
+            StorageOperationStatus error = generateCustomizationUUIDOnGroupInstance(resourceInstance, artifactDefinition.getUniqueId(), parent.getUniqueId());
             if (error != StorageOperationStatus.OK) {
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(error));
-                handleAuditing(auditingAction, parent, parent.getUniqueId(), user, artifactInfo, null, artifactId, responseFormat, componentType, ri
-                        .getName());
-                return Either.right(responseFormat);
+                throw new StorageException(error);
             }
+        }
+    }
 
+    private void validateHeatMetaData(ArtifactDefinition updatedHeatEnv) {
+        Integer maxMinutes = ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout().getMaxMinutes();
+        Integer minMinutes = ConfigurationManager.getConfigurationManager().getConfiguration().getHeatArtifactDeploymentTimeout().getMinMinutes();
+        Integer updateTimeout = updatedHeatEnv.getTimeout();
+        if (updateTimeout > maxMinutes || updateTimeout < minMinutes) {
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_INVALID_TIMEOUT);
         }
-        insideEither = Either.left(currArtifact);
-        resultOp = Either.left(insideEither);
-        ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-        handleAuditing(auditingAction, parent, parent.getUniqueId(), user, currArtifact, null, artifactId, responseFormat, componentType, ri
-                .getName());
-        return resultOp;
     }
 
-    private void replaceCurrHeatValueWithUpdatedValue(List<HeatParameterDefinition> currentHeatEnvParams, List<HeatParameterDefinition> updatedHeatEnvParams) {
+    private boolean isUpdateHeatMetaDataNeeded(ArtifactDefinition updatedHeatEnv, ArtifactDefinition origHeat) {
+        // currently only timeout metadata can be updated
+        return !origHeat.getTimeout().equals(updatedHeatEnv.getTimeout());
+    }
+
+    private void updateHeatMetadataFromHeatEnv(ArtifactDefinition updatedHeatEnv, ArtifactDefinition origHeat) {
+        // currently only timeout metadata can be updated
+        origHeat.setTimeout(updatedHeatEnv.getTimeout());
+    }
+
+    private boolean replaceCurrHeatValueWithUpdatedValue(List<HeatParameterDefinition> currentHeatEnvParams, List<HeatParameterDefinition> updatedHeatEnvParams) {
+        boolean isUpdate = false;
+        List<String> currentParamsNames = currentHeatEnvParams.stream().map(x -> x.getName()).collect(Collectors.toList());
         for (HeatParameterDefinition heatEnvParam : updatedHeatEnvParams) {
             String paramName = heatEnvParam.getName();
+            validateParamName(paramName, currentParamsNames);
             for (HeatParameterDefinition currHeatParam : currentHeatEnvParams) {
                 if (paramName.equalsIgnoreCase(currHeatParam.getName())) {
                     String updatedParamValue = heatEnvParam.getCurrentValue();
-                    currHeatParam.setCurrentValue(updatedParamValue);
+                    if (!Objects.equals(updatedParamValue, currHeatParam.getCurrentValue())) {
+                        currHeatParam.setCurrentValue(updatedParamValue);
+                        isUpdate = true;
+                    }
                 }
             }
         }
+        return isUpdate;
     }
 
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> updateHeatParams(String componentId, String artifactId, ArtifactDefinition artifactEnvInfo, User user, AuditingActionEnum auditingAction, Component parent,
-                                                                                           ComponentTypeEnum componentType, ArtifactDefinition currHeatArtifact, boolean needToUpdateGroup) {
+    private void validateParamName(String paramName, List<String> heatParamsNames) {
+        if (!heatParamsNames.contains(paramName)) {
+            throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, paramName);
+        }
+    }
 
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> resultOp;
+    private Either<ArtifactDefinition, Operation> updateHeatParams(String componentId, ArtifactDefinition artifactEnvInfo, AuditingActionEnum auditingAction, Component parent,
+                                                                   ComponentTypeEnum componentType, ArtifactDefinition currHeatArtifact, boolean needToUpdateGroup) {
         Either<ArtifactDefinition, Operation> insideEither = null;
         String currentHeatId = currHeatArtifact.getUniqueId();
 
         String esArtifactId = currHeatArtifact.getEsId();
-        Either<ESArtifactData, CassandraOperationStatus> artifactFromES = artifactCassandraDao.getArtifact(esArtifactId);
+        Either<DAOArtifactData, CassandraOperationStatus> artifactFromES = artifactCassandraDao.getArtifact(esArtifactId);
         if (artifactFromES.isRight()) {
-            CassandraOperationStatus resourceUploadStatus = artifactFromES.right().value();
-            StorageOperationStatus storageResponse = DaoStatusConverter.convertCassandraStatusToStorageStatus(resourceUploadStatus);
-            ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(storageResponse);
-            log.debug("Error when getting artifact from ES, error: {}", actionStatus);
-            return Either.right(componentsUtils.getResponseFormatByArtifactId(actionStatus, currHeatArtifact.getArtifactDisplayName()));
+            StorageOperationStatus storageResponse = DaoStatusConverter.convertCassandraStatusToStorageStatus(artifactFromES.right().value());
+            throw new StorageException(storageResponse, currHeatArtifact.getArtifactDisplayName());
         }
 
-        ESArtifactData esArtifactData = artifactFromES.left().value();
-
+        DAOArtifactData DAOArtifactData = artifactFromES.left().value();
         ArtifactDefinition updatedHeatArt = currHeatArtifact;
-
         List<HeatParameterDefinition> updatedHeatEnvParams = artifactEnvInfo.getListHeatParameters();
         List<HeatParameterDefinition> currentHeatEnvParams = currHeatArtifact.getListHeatParameters();
-        List<HeatParameterDefinition> newHeatEnvParams = new ArrayList<HeatParameterDefinition>();
-
-        if (updatedHeatEnvParams != null && !updatedHeatEnvParams.isEmpty() && currentHeatEnvParams != null && !currentHeatEnvParams
-                .isEmpty()) {
+        List<HeatParameterDefinition> newHeatEnvParams = new ArrayList<>();
 
+        if (CollectionUtils.isNotEmpty(updatedHeatEnvParams) && CollectionUtils.isNotEmpty(currentHeatEnvParams)) {
+            //TODO: improve complexity - currently N^2
             String paramName;
             for (HeatParameterDefinition heatEnvParam : updatedHeatEnvParams) {
-
                 paramName = heatEnvParam.getName();
                 for (HeatParameterDefinition currHeatParam : currentHeatEnvParams) {
                     if (paramName.equalsIgnoreCase(currHeatParam.getName())) {
-
                         String updatedParamValue = heatEnvParam.getCurrentValue();
                         if (updatedParamValue == null) {
                             updatedParamValue = heatEnvParam.getDefaultValue();
                         }
                         HeatParameterType paramType = HeatParameterType.isValidType(currHeatParam.getType());
                         if (!paramType.getValidator().isValid(updatedParamValue, null)) {
-                            ActionStatus status = ActionStatus.INVALID_HEAT_PARAMETER_VALUE;
-                            ResponseFormat responseFormat = componentsUtils.getResponseFormat(status, ArtifactTypeEnum.HEAT_ENV
-                                    .getType(), paramType.getType(), paramName);
-                            handleAuditing(auditingAction, parent, parent.getUniqueId(), user, artifactEnvInfo, null, artifactId, responseFormat, componentType, "");
-                            return Either.right(responseFormat);
-
+                            throw new ByActionStatusComponentException(ActionStatus.INVALID_HEAT_PARAMETER_VALUE,
+                                    ArtifactTypeEnum.HEAT_ENV.getType(), paramType.getType(), paramName);
                         }
                         currHeatParam.setCurrentValue(paramType.getConverter().convert(updatedParamValue, null, null));
                         newHeatEnvParams.add(currHeatParam);
@@ -4415,78 +3855,45 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
             }
             if (!newHeatEnvParams.isEmpty()) {
                 currHeatArtifact.setListHeatParameters(currentHeatEnvParams);
-                Either<ArtifactDefinition, StorageOperationStatus> operationStatus = artifactToscaOperation.updateArtifactOnResource(currHeatArtifact, parent
-                        .getUniqueId(), currHeatArtifact.getUniqueId(), componentType.getNodeType(), componentId);
+                Either<ArtifactDefinition, StorageOperationStatus> operationStatus = artifactToscaOperation.updateArtifactOnResource(
+                        currHeatArtifact, parent, currHeatArtifact.getUniqueId(), componentType.getNodeType(), componentId, true);
 
                 if (operationStatus.isRight()) {
                     log.debug("Failed to update artifact on graph  - {}", currHeatArtifact.getUniqueId());
-
-                    ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(operationStatus
-                            .right()
-                            .value()));
-                    return Either.right(responseFormat);
-
+                    throw new StorageException(operationStatus.right().value());
                 }
                 updatedHeatArt = operationStatus.left().value();
-                boolean res = true;
-                if (!updatedHeatArt.getDuplicated() || esArtifactData.getId() == null) {
-                    esArtifactData.setId(updatedHeatArt.getEsId());
-                }
-                res = saveArtifacts(esArtifactData, parent.getUniqueId());
-
-                if (res) {
-                    log.debug(ARTIFACT_SAVED, updatedHeatArt.getUniqueId());
-                    ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-                    handleAuditing(auditingAction, parent, parent.getUniqueId(), user, updatedHeatArt, currentHeatId, updatedHeatArt
-                            .getUniqueId(), responseFormat, componentType, null);
+                if (!updatedHeatArt.getDuplicated() || DAOArtifactData.getId() == null) {
+                    DAOArtifactData.setId(updatedHeatArt.getEsId());
                 }
-                else {
-                    BeEcompErrorManager.getInstance().logBeDaoSystemError(UPDATE_ARTIFACT);
-                    log.debug(FAILED_SAVE_ARTIFACT);
-                    ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
-                    handleAuditing(auditingAction, parent, parent.getUniqueId(), user, updatedHeatArt, currentHeatId, updatedHeatArt
-                            .getUniqueId(), responseFormat, componentType, null);
-                    resultOp = Either.right(responseFormat);
-                }
-
+                saveArtifactInCassandra(DAOArtifactData, parent, artifactEnvInfo, currentHeatId, updatedHeatArt
+                        .getUniqueId(), auditingAction, componentType);
                 insideEither = Either.left(updatedHeatArt);
             }
         }
         Either<ArtifactDefinition, StorageOperationStatus> updateHeatEnvArtifact;
         if (!currentHeatId.equals(updatedHeatArt.getUniqueId())) {
             artifactEnvInfo.setArtifactChecksum(null);
-            updateHeatEnvArtifact = artifactToscaOperation.updateHeatEnvArtifact(parent.getUniqueId(), artifactEnvInfo, currentHeatId, updatedHeatArt
+            updateHeatEnvArtifact = artifactToscaOperation.updateHeatEnvArtifact(parent, artifactEnvInfo, currentHeatId, updatedHeatArt
                     .getUniqueId(), componentType.getNodeType(), componentId);
         }
         else {
-            updateHeatEnvArtifact = artifactToscaOperation.updateHeatEnvPlaceholder(artifactEnvInfo, componentId, componentType
+            //TODO Andrey check if componentId = parent.getUniqeId
+            updateHeatEnvArtifact = artifactToscaOperation.updateHeatEnvPlaceholder(artifactEnvInfo, parent, componentType
                     .getNodeType());
 
         }
         if (needToUpdateGroup && updateHeatEnvArtifact.isLeft()) {
-            ActionStatus result = updateGroupForHeat(currHeatArtifact, updatedHeatArt, artifactEnvInfo, updateHeatEnvArtifact
-                    .left()
-                    .value(), parent, componentType);
+            ActionStatus result = updateGroupForHeat(currHeatArtifact, updatedHeatArt, artifactEnvInfo,
+                    updateHeatEnvArtifact.left().value(), parent);
             if (result != ActionStatus.OK) {
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(result);
-                return Either.right(responseFormat);
+                throw new ByActionStatusComponentException(result);
             }
         }
-
         if (updatedHeatEnvParams.isEmpty()) {
-            return getResponseAndAuditInvalidEmptyHeatEnvFile(auditingAction, parent, user, currHeatArtifact, artifactId, componentType);
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_YAML, currHeatArtifact.getArtifactName());
         }
-        resultOp = Either.left(insideEither);
-        ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.OK);
-        handleAuditing(auditingAction, parent, parent.getUniqueId(), user, currHeatArtifact, null, artifactId, responseFormat, componentType, "");
-        return resultOp;
-
-    }
-
-    private Either<Either<ArtifactDefinition, Operation>, ResponseFormat> getResponseAndAuditInvalidEmptyHeatEnvFile(AuditingActionEnum auditingAction, Component parent, User user, ArtifactDefinition currHeatArtifact, String artifactId, ComponentTypeEnum componentType) {
-        ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_YAML, currHeatArtifact.getArtifactName());
-        handleAuditing(auditingAction, parent, parent.getUniqueId(), user, currHeatArtifact, null, artifactId, responseFormat, componentType, "");
-        return Either.right(responseFormat);
+        return insideEither;
     }
 
 
@@ -4497,10 +3904,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         List<String> groupInstancesId = null;
         if (groupsInstances != null && !groupsInstances.isEmpty()) {
             groupInstancesId = groupsInstances.stream()
-                                              .filter(p -> p.getGroupInstanceArtifacts() != null && p.getGroupInstanceArtifacts()
-                                                                                                     .contains(artifactId))
-                                              .map(GroupInstanceDataDefinition::getUniqueId)
-                                              .collect(Collectors.toList());
+                    .filter(p -> p.getGroupInstanceArtifacts() != null && p.getGroupInstanceArtifacts()
+                            .contains(artifactId))
+                    .map(GroupInstanceDataDefinition::getUniqueId)
+                    .collect(Collectors.toList());
         }
         if (groupInstancesId != null && !groupInstancesId.isEmpty()) {
             toscaOperationFacade.generateCustomizationUUIDOnInstanceGroup(componentId, ri.getUniqueId(), groupInstancesId);
@@ -4581,31 +3988,10 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return ret;
     }
 
-    /**
-     * downloads artifact of component by UUIDs
-     *
-     * @param componentType
-     * @param componentUuid
-     * @param artifactUUID
-     * @param resourceCommonInfo
-     * @return
-     */
-    public Either<byte[], ResponseFormat> downloadComponentArtifactByUUIDs(ComponentTypeEnum componentType, String componentUuid, String artifactUUID, ResourceCommonInfo resourceCommonInfo) {
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<byte[], ResponseFormat> result;
-        byte[] downloadedArtifact = null;
-        Component component = getComponentByUuid(componentType, componentUuid, errorWrapper);
-        if (errorWrapper.isEmpty() && component != null) {
-            resourceCommonInfo.setResourceName(component.getName());
-            downloadedArtifact = downloadArtifact(component.getAllArtifacts(), artifactUUID, errorWrapper, component.getName());
-        }
-        if (errorWrapper.isEmpty()) {
-            result = Either.left(downloadedArtifact);
-        }
-        else {
-            result = Either.right(errorWrapper.getInnerElement());
-        }
-        return result;
+    public byte[] downloadComponentArtifactByUUIDs(ComponentTypeEnum componentType, String componentUuid, String artifactUUID, ResourceCommonInfo resourceCommonInfo) {
+        Component component = getComponentByUuid(componentType, componentUuid);
+        resourceCommonInfo.setResourceName(component.getName());
+        return downloadArtifact(component.getAllArtifacts(), artifactUUID, component.getName());
     }
 
     /**
@@ -4617,22 +4003,11 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param artifactUUID
      * @return
      */
-    public Either<byte[], ResponseFormat> downloadResourceInstanceArtifactByUUIDs(ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName, String artifactUUID) {
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<byte[], ResponseFormat> result;
-        byte[] downloadedArtifact = null;
-        ComponentInstance resourceInstance = getRelatedComponentInstance(componentType, componentUuid, resourceInstanceName, errorWrapper);
-        if (errorWrapper.isEmpty()) {
-            downloadedArtifact = downloadArtifact(resourceInstance.getDeploymentArtifacts(), artifactUUID, errorWrapper, resourceInstance
-                    .getName());
-        }
-        if (errorWrapper.isEmpty()) {
-            result = Either.left(downloadedArtifact);
-        }
-        else {
-            result = Either.right(errorWrapper.getInnerElement());
-        }
-        return result;
+    public byte[] downloadResourceInstanceArtifactByUUIDs(ComponentTypeEnum componentType, String componentUuid,
+                                                          String resourceInstanceName, String artifactUUID) {
+        ComponentInstance resourceInstance = getRelatedComponentInstance(componentType, componentUuid, resourceInstanceName);
+        return downloadArtifact(resourceInstance == null ? null : resourceInstance.getDeploymentArtifacts(),
+                artifactUUID, resourceInstance.getName());
     }
 
     /**
@@ -4646,50 +4021,43 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param operation
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> uploadArtifactToComponentByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, ResourceCommonInfo resourceCommonInfo,ArtifactOperationInfo operation) {
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> actionResult = null;
-        Component component = null;
-        String componentId = null;
-        ArtifactDefinition artifactInfo = RepresentationUtils.convertJsonToArtifactDefinition(data, ArtifactDefinition.class);
+    public ArtifactDefinition uploadArtifactToComponentByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType,
+                                                              String componentUuid, ResourceCommonInfo resourceCommonInfo,                                                                                      ArtifactOperationInfo operation) {
+        Either<ArtifactDefinition, Operation> actionResult;
+        Component component;
+        String componentId;
+        ArtifactDefinition artifactInfo = RepresentationUtils.convertJsonToArtifactDefinition(data, ArtifactDefinition.class, false);
         String origMd5 = request.getHeader(Constants.MD5_HEADER);
         String userId = request.getHeader(Constants.USER_ID_HEADER);
 
-        Either<ComponentMetadataData, StorageOperationStatus> getComponentRes = toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
+        Either<ComponentMetadataData, StorageOperationStatus> getComponentRes =
+                toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
             log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status, componentType), componentUuid));
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status, componentType), componentUuid);
         }
-        if (errorWrapper.isEmpty()) {
-            componentId = getComponentRes.left().value().getMetadataDataDefinition().getUniqueId();
-            String componentName = getComponentRes.left().value().getMetadataDataDefinition().getName();
 
-            if (!getComponentRes.left()
-                    .value()
-                    .getMetadataDataDefinition()
-                    .getState()
-                    .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
-                component = checkoutParentComponent(componentType, componentId, userId, errorWrapper);
-                if (component != null) {
-                    componentId = component.getUniqueId();
-                    componentName = component.getName();
-                }
-            }
-            resourceCommonInfo.setResourceName(componentName);
-        }
-        if (errorWrapper.isEmpty()) {
-            actionResult = handleArtifactRequest(componentId, userId, componentType, operation, null, artifactInfo, origMd5, data, null, null, null, null);
-            if (actionResult.isRight()) {
-                log.debug(FAILED_UPLOAD_ARTIFACT_TO_COMPONENT, componentType, componentUuid, actionResult
-                        .right()
-                        .value());
-                return Either.right(actionResult.right().value());
+        ComponentMetadataDataDefinition componentMetadataDataDefinition = getComponentRes.left().value().getMetadataDataDefinition();
+        componentId = componentMetadataDataDefinition.getUniqueId();
+        String componentName = componentMetadataDataDefinition.getName();
+
+        if (!componentMetadataDataDefinition
+                .getState()
+                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+            component = checkoutParentComponent(componentType, componentId, userId);
+            if (component != null) {
+                componentId = component.getUniqueId();
+                componentName = component.getName();
             }
-            return Either.left(actionResult.left().value().left().value());
         }
-        return Either.right(errorWrapper.getInnerElement());
+        resourceCommonInfo.setResourceName(componentName);
+
+        actionResult = handleArtifactRequest(componentId, userId, componentType, operation, null, artifactInfo,
+                origMd5, data, null, null, null, null);
+        return actionResult.left().value();
     }
+
     /**
      * upload an artifact to a resource instance by UUID
      *
@@ -4701,12 +4069,9 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param operation
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> uploadArtifactToRiByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName,
-                                                                                ArtifactOperationInfo operation) {
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<ArtifactDefinition, ResponseFormat> uploadArtifactResult;
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> actionResult = null;
-        ArtifactDefinition uploadArtifact = null;
+    public ArtifactDefinition uploadArtifactToRiByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName,
+                                                       ArtifactOperationInfo operation) {
+        Either<ArtifactDefinition, Operation> actionResult;
         Component component = null;
         String componentInstanceId;
         String componentId;
@@ -4717,49 +4082,34 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Either<ComponentMetadataData, StorageOperationStatus> getComponentRes = toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
-            log.debug("Could not fetch component with type {} and uuid {}. Status is {}. ", componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status, componentType), resourceInstanceName));
+            log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status, componentType), resourceInstanceName);
         }
-        if (errorWrapper.isEmpty() && !getComponentRes.left()
-                                                      .value()
-                                                      .getMetadataDataDefinition()
-                                                      .getState()
-                                                      .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+        if (!getComponentRes.left()
+                .value()
+                .getMetadataDataDefinition()
+                .getState()
+                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
             component = checkoutParentComponent(componentType, getComponentRes.left()
-                                                                              .value()
-                                                                              .getMetadataDataDefinition()
-                                                                              .getUniqueId(), userId, errorWrapper);
-        }
-        if (errorWrapper.isEmpty()) {
-            if (component == null) {
-                componentRiPair = getRelatedComponentComponentInstance(componentType, componentUuid, resourceInstanceName, errorWrapper);
-            }
-            else {
-                componentRiPair = getRelatedComponentComponentInstance(component, resourceInstanceName, errorWrapper);
-            }
-        }
-        if (errorWrapper.isEmpty()) {
-            componentInstanceId = componentRiPair.getRight().getUniqueId();
-            componentId = componentRiPair.getLeft().getUniqueId();
-            ArtifactDefinition artifactInfo = RepresentationUtils.convertJsonToArtifactDefinition(data, ArtifactDefinition.class);
-
-            actionResult = handleArtifactRequest(componentInstanceId, userId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, null, artifactInfo, origMd5, data, null, null, componentId, ComponentTypeEnum
-                    .findParamByType(componentType));
-            if (actionResult.isRight()) {
-                log.debug(FAILED_UPLOAD_ARTIFACT_TO_INSTANCE, resourceInstanceName, componentType, componentUuid, actionResult
-                        .right()
-                        .value());
-                errorWrapper.setInnerElement(actionResult.right().value());
-            }
+                    .value()
+                    .getMetadataDataDefinition()
+                    .getUniqueId(), userId);
         }
-        if (errorWrapper.isEmpty()) {
-            uploadArtifact = actionResult.left().value().left().value();
-            uploadArtifactResult = Either.left(uploadArtifact);
+        if (component == null) {
+            componentRiPair = getRelatedComponentComponentInstance(componentType, componentUuid, resourceInstanceName);
         }
         else {
-            uploadArtifactResult = Either.right(errorWrapper.getInnerElement());
+            componentRiPair = getRelatedComponentComponentInstance(component, resourceInstanceName);
         }
-        return uploadArtifactResult;
+        componentInstanceId = componentRiPair.getRight().getUniqueId();
+        componentId = componentRiPair.getLeft().getUniqueId();
+        ArtifactDefinition artifactInfo = RepresentationUtils.convertJsonToArtifactDefinition(data, ArtifactDefinition.class, false);
+
+        actionResult = handleArtifactRequest(componentInstanceId, userId, ComponentTypeEnum.RESOURCE_INSTANCE,
+                operation, null, artifactInfo, origMd5, data, null, null,
+                componentId, ComponentTypeEnum.findParamByType(componentType));
+
+        return actionResult.left().value();
     }
 
     /**
@@ -4770,18 +4120,16 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param componentType
      * @param componentUuid
      * @param artifactUUID
-     * @param operation
+     * @param resourceCommonInfo
+     * @param operation        TODO
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> updateArtifactOnComponentByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String artifactUUID,
-                                                                                      ResourceCommonInfo resourceCommonInfo, ArtifactOperationInfo operation) {
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<ArtifactDefinition, ResponseFormat> updateArtifactResult;
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> actionResult = null;
-        ArtifactDefinition updateArtifact = null;
-        Component component = null;
-        String componentId = null;
-        String artifactId = null;
+    public ArtifactDefinition updateArtifactOnComponentByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String artifactUUID,
+                                                              ResourceCommonInfo resourceCommonInfo, ArtifactOperationInfo operation) {
+        Either<ArtifactDefinition, Operation> actionResult;
+        Component component;
+        String componentId;
+        String artifactId ;
         ArtifactDefinition artifactInfo = RepresentationUtils.convertJsonToArtifactDefinitionForUpdate(data, ArtifactDefinition.class);
         String origMd5 = request.getHeader(Constants.MD5_HEADER);
         String userId = request.getHeader(Constants.USER_ID_HEADER);
@@ -4789,47 +4137,34 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Either<ComponentMetadataData, StorageOperationStatus> getComponentRes = toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
-            log.debug("Could not fetch component with type {} and uuid {}. Status is {}. ", componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status)));
-        }
-        if (errorWrapper.isEmpty()) {
-            componentId = getComponentRes.left().value().getMetadataDataDefinition().getUniqueId();
-            String componentName = getComponentRes.left().value().getMetadataDataDefinition().getName();
-
-            if (!getComponentRes.left()
-                                .value()
-                                .getMetadataDataDefinition()
-                                .getState()
-                                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
-                component = checkoutParentComponent(componentType, componentId, userId, errorWrapper);
-                if (component != null) {
-                    componentId = component.getUniqueId();
-                    componentName = component.getName();
-                }
-            }
-            resourceCommonInfo.setResourceName(componentName);
-        }
-        if (errorWrapper.isEmpty()) {
-            artifactId = getLatestParentArtifactDataIdByArtifactUUID(artifactUUID, errorWrapper, componentId, componentType);
-        }
-        if (errorWrapper.isEmpty()) {
-            actionResult = handleArtifactRequest(componentId, userId, componentType, operation, artifactId, artifactInfo, origMd5, data, null, null, null, null);
-            if (actionResult.isRight()) {
-                log.debug(FAILED_UPLOAD_ARTIFACT_TO_COMPONENT, componentType, componentUuid, actionResult
-                        .right()
-                        .value());
-                errorWrapper.setInnerElement(actionResult.right().value());
-            }
+            log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status));
+        }
+        componentId = getComponentRes.left().value().getMetadataDataDefinition().getUniqueId();
+        String componentName = getComponentRes.left().value().getMetadataDataDefinition().getName();
+
+        if (!getComponentRes.left()
+                .value()
+                .getMetadataDataDefinition()
+                .getState()
+                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+            component = checkoutParentComponent(componentType, componentId, userId);
+            if (component != null) {
+                componentId = component.getUniqueId();
+                componentName = component.getName();
+            }
+        }
+        resourceCommonInfo.setResourceName(componentName);
+        artifactId = getLatestParentArtifactDataIdByArtifactUUID(artifactUUID, componentId, componentType);
+        actionResult = handleArtifactRequest(componentId, userId, componentType, operation, artifactId, artifactInfo,
+                origMd5, data, null, null, null, null);
+        if (actionResult.isRight()) {
+            log.debug(FAILED_UPLOAD_ARTIFACT_TO_COMPONENT, componentType, componentUuid, actionResult
+                    .right()
+                    .value());
         }
-        if (errorWrapper.isEmpty()) {
-            updateArtifact = actionResult.left().value().left().value();
-            updateArtifactResult = Either.left(updateArtifact);
 
-        }
-        else {
-            updateArtifactResult = Either.right(errorWrapper.getInnerElement());
-        }
-        return updateArtifactResult;
+        return actionResult.left().value();
     }
 
     /**
@@ -4844,17 +4179,14 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param operation            TODO
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> updateArtifactOnRiByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName, String artifactUUID,
-                                                                                ArtifactOperationInfo operation) {
+    public ArtifactDefinition updateArtifactOnRiByUUID(String data, HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName, String artifactUUID,
+                                                       ArtifactOperationInfo operation) {
 
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<ArtifactDefinition, ResponseFormat> updateArtifactResult;
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> actionResult = null;
-        ArtifactDefinition updateArtifact = null;
+        Either<ArtifactDefinition, Operation> actionResult;
         Component component = null;
-        String componentInstanceId = null;
-        String componentId = null;
-        String artifactId = null;
+        String componentInstanceId;
+        String componentId;
+        String artifactId;
         String origMd5 = request.getHeader(Constants.MD5_HEADER);
         String userId = request.getHeader(Constants.USER_ID_HEADER);
 
@@ -4862,52 +4194,33 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         Either<ComponentMetadataData, StorageOperationStatus> getComponentRes = toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
-            log.debug("Could not fetch component with type {} and uuid {}. Status is {}. ", componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status)));
+            log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status));
         }
-        if (errorWrapper.isEmpty() && !getComponentRes.left()
-                                                      .value()
-                                                      .getMetadataDataDefinition()
-                                                      .getState()
-                                                      .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+        if (!getComponentRes.left()
+                .value()
+                .getMetadataDataDefinition()
+                .getState()
+                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
             component = checkoutParentComponent(componentType, getComponentRes.left()
-                                                                              .value()
-                                                                              .getMetadataDataDefinition()
-                                                                              .getUniqueId(), userId, errorWrapper);
-        }
-        if (errorWrapper.isEmpty()) {
-            if (component == null) {
-                componentRiPair = getRelatedComponentComponentInstance(componentType, componentUuid, resourceInstanceName, errorWrapper);
-            }
-            else {
-                componentRiPair = getRelatedComponentComponentInstance(component, resourceInstanceName, errorWrapper);
-            }
-        }
-        if (errorWrapper.isEmpty()) {
-            componentInstanceId = componentRiPair.getRight().getUniqueId();
-            componentId = componentRiPair.getLeft().getUniqueId();
-            artifactId = findArtifactId(componentRiPair.getRight(), artifactUUID, errorWrapper);
-        }
-        if (errorWrapper.isEmpty()) {
-            ArtifactDefinition artifactInfo = RepresentationUtils.convertJsonToArtifactDefinition(data, ArtifactDefinition.class);
-
-            actionResult = handleArtifactRequest(componentInstanceId, userId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, artifactId, artifactInfo, origMd5, data, null, null, componentId, ComponentTypeEnum
-                    .findParamByType(componentType));
-            if (actionResult.isRight()) {
-                log.debug(FAILED_UPLOAD_ARTIFACT_TO_INSTANCE, resourceInstanceName, componentType, componentUuid, actionResult
-                        .right()
-                        .value());
-                errorWrapper.setInnerElement(actionResult.right().value());
-            }
+                    .value()
+                    .getMetadataDataDefinition()
+                    .getUniqueId(), userId);
         }
-        if (errorWrapper.isEmpty()) {
-            updateArtifact = actionResult.left().value().left().value();
-            updateArtifactResult = Either.left(updateArtifact);
+        if (component == null) {
+            componentRiPair = getRelatedComponentComponentInstance(componentType, componentUuid, resourceInstanceName);
         }
         else {
-            updateArtifactResult = Either.right(errorWrapper.getInnerElement());
+            componentRiPair = getRelatedComponentComponentInstance(component, resourceInstanceName);
         }
-        return updateArtifactResult;
+        componentInstanceId = componentRiPair.getRight().getUniqueId();
+        componentId = componentRiPair.getLeft().getUniqueId();
+        artifactId = findArtifactId(componentRiPair.getRight(), artifactUUID);
+        ArtifactDefinition artifactInfo = RepresentationUtils.convertJsonToArtifactDefinition(data, ArtifactDefinition.class, false);
+
+        actionResult = handleArtifactRequest(componentInstanceId, userId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, artifactId, artifactInfo, origMd5, data, null, null, componentId, ComponentTypeEnum
+                .findParamByType(componentType));
+        return actionResult.left().value();
     }
 
     private Either<ArtifactDefinition, ResponseFormat> updateOperationArtifact(String componentId, String interfaceType, String operationUuid, ArtifactDefinition artifactInfo){
@@ -4929,9 +4242,9 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         InterfaceDefinition gotInterface = optionalInterface.get();
         Map<String, Operation> operationsMap = gotInterface.getOperationsMap();
         Optional<Operation> optionalOperation = operationsMap.values()
-                                                        .stream()
-                                                        .filter(o -> o.getUniqueId().equals(operationUuid))
-                                                        .findFirst();
+                .stream()
+                .filter(o -> o.getUniqueId().equals(operationUuid))
+                .findFirst();
         if (!optionalOperation.isPresent()) {
             log.debug("Failed to get resource interface operation for resource Id {} and operationId {}", componentId, operationUuid);
             ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INTERFACE_OPERATION_NOT_FOUND, componentId);
@@ -4962,6 +4275,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return Either.left(artifactInfo);
     }
 
+
     /**
      * updates an artifact on a component by UUID
      *
@@ -5003,7 +4317,7 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                     .getMetadataDataDefinition()
                     .getState()
                     .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
-                Component component = checkoutParentComponent(componentType, componentId, userId, errorWrapper);
+                Component component = checkoutParentComponent(componentType, componentId, userId);
                 if (component != null) {
                     componentId = component.getUniqueId();
                     componentName = component.getName();
@@ -5047,14 +4361,12 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         }
 
         if (errorWrapper.isEmpty()) {
-            actionResult = handleArtifactRequest(componentId, userId, componentType, operation,
-                    artifactUUID, artifactInfo, origMd5, data, interfaceName,
-                    operationUUID, null, null);
-            if (actionResult.isRight()) {
-                log.debug(FAILED_UPLOAD_ARTIFACT_TO_COMPONENT, componentType, componentUuid, actionResult
-                                                                                                     .right()
-                                                                                                     .value());
-                errorWrapper.setInnerElement(actionResult.right().value());
+                try {
+                    actionResult = Either.left(handleArtifactRequest(componentId, userId, componentType, operation,
+                            artifactUUID, artifactInfo, origMd5, data, interfaceName,
+                            operationUUID, null, null));
+                }catch (ComponentException e){
+                    errorWrapper.setInnerElement(e.getResponseFormat());
             }
         }
 
@@ -5086,7 +4398,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return Either.left(optionalInterface.get().getType());
     }
 
-
     /**
      * deletes an artifact on a component by UUID
      *
@@ -5098,61 +4409,39 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param operation        TODO
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> deleteArtifactOnComponentByUUID(HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String artifactUUID, ResourceCommonInfo resourceCommonInfo,
-                                                                                      ArtifactOperationInfo operation) {
+    public ArtifactDefinition deleteArtifactOnComponentByUUID(HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String artifactUUID, ResourceCommonInfo resourceCommonInfo,
+                                                              ArtifactOperationInfo operation) {
 
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<ArtifactDefinition, ResponseFormat> deleteArtifactResult;
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> actionResult = null;
-        ArtifactDefinition deleteArtifact = null;
-        Component component = null;
-        String componentId = null;
-        String artifactId = null;
+        Either<ArtifactDefinition, Operation> actionResult;
+        Component component;
+        String componentId ;
+        String artifactId;
         String origMd5 = request.getHeader(Constants.MD5_HEADER);
         String userId = request.getHeader(Constants.USER_ID_HEADER);
 
         Either<ComponentMetadataData, StorageOperationStatus> getComponentRes = toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
-            log.debug("Could not fetch component with type {} and uuid {}. Status is {}. ", componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status, componentType), componentUuid));
-        }
-        if (errorWrapper.isEmpty()) {
-            componentId = getComponentRes.left().value().getMetadataDataDefinition().getUniqueId();
-            String componentName = getComponentRes.left().value().getMetadataDataDefinition().getName();
-            if (!getComponentRes.left()
-                                .value()
-                                .getMetadataDataDefinition()
-                                .getState()
-                                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
-                component = checkoutParentComponent(componentType, componentId, userId, errorWrapper);
-                if (component != null) {
-                    componentId = component.getUniqueId();
-                    componentName = component.getName();
-                }
-            }
-            resourceCommonInfo.setResourceName(componentName);
-        }
-        if (errorWrapper.isEmpty()) {
-            artifactId = getLatestParentArtifactDataIdByArtifactUUID(artifactUUID, errorWrapper, componentId, componentType);
+            log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status, componentType), componentUuid);
         }
-        if (errorWrapper.isEmpty()) {
-            actionResult = handleArtifactRequest(componentId, userId, componentType, operation, artifactId, null, origMd5, null, null, null, null, null);
-            if (actionResult.isRight()) {
-                log.debug(FAILED_UPLOAD_ARTIFACT_TO_COMPONENT, componentType, componentUuid, actionResult
-                        .right()
-                        .value());
-                errorWrapper.setInnerElement(actionResult.right().value());
+        componentId = getComponentRes.left().value().getMetadataDataDefinition().getUniqueId();
+        String componentName = getComponentRes.left().value().getMetadataDataDefinition().getName();
+        if (!getComponentRes.left()
+                .value()
+                .getMetadataDataDefinition()
+                .getState()
+                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+            component = checkoutParentComponent(componentType, componentId, userId);
+            if (component != null) {
+                componentId = component.getUniqueId();
+                componentName = component.getName();
             }
         }
-        if (errorWrapper.isEmpty()) {
-            deleteArtifact = actionResult.left().value().left().value();
-            deleteArtifactResult = Either.left(deleteArtifact);
-        }
-        else {
-            deleteArtifactResult = Either.right(errorWrapper.getInnerElement());
-        }
-        return deleteArtifactResult;
+        resourceCommonInfo.setResourceName(componentName);
+        artifactId = getLatestParentArtifactDataIdByArtifactUUID(artifactUUID, componentId, componentType);
+        actionResult = handleArtifactRequest(componentId, userId, componentType, operation, artifactId, null, origMd5, null, null, null, null, null);
+        return actionResult.left().value();
     }
 
     /**
@@ -5166,95 +4455,74 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
      * @param operation            TODO
      * @return
      */
-    public Either<ArtifactDefinition, ResponseFormat> deleteArtifactOnRiByUUID(HttpServletRequest request, ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName, String artifactUUID,
-                                                                               ArtifactOperationInfo operation) {
+    public ArtifactDefinition deleteArtifactOnRiByUUID(HttpServletRequest request, ComponentTypeEnum componentType,
+                                                       String componentUuid, String resourceInstanceName,
+                                                       String artifactUUID, ArtifactOperationInfo operation) {
 
-        Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<ArtifactDefinition, ResponseFormat> deleteArtifactResult;
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> actionResult = null;
-        ArtifactDefinition deleteArtifact = null;
+        Either<ArtifactDefinition, Operation> actionResult;
         Component component = null;
-        String componentInstanceId = null;
-        String componentId = null;
-        String artifactId = null;
+        String componentInstanceId;
+        String componentId;
+        String artifactId;
         String origMd5 = request.getHeader(Constants.MD5_HEADER);
         String userId = request.getHeader(Constants.USER_ID_HEADER);
         ImmutablePair<Component, ComponentInstance> componentRiPair = null;
-        Either<ComponentMetadataData, StorageOperationStatus> getComponentRes = toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
+        Either<ComponentMetadataData, StorageOperationStatus> getComponentRes =
+                toscaOperationFacade.getLatestComponentMetadataByUuid(componentUuid, JsonParseFlagEnum.ParseMetadata, true);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
-            log.debug("Could not fetch component with type {} and uuid {}. Status is {}. ", componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status)));
+            log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status));
         }
-        if (errorWrapper.isEmpty() && !getComponentRes.left()
-                                                      .value()
-                                                      .getMetadataDataDefinition()
-                                                      .getState()
-                                                      .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
+        if (!getComponentRes.left()
+                .value()
+                .getMetadataDataDefinition()
+                .getState()
+                .equals(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT.name())) {
             component = checkoutParentComponent(componentType, getComponentRes.left()
-                                                                              .value()
-                                                                              .getMetadataDataDefinition()
-                                                                              .getUniqueId(), userId, errorWrapper);
-        }
-        if (errorWrapper.isEmpty()) {
-            if (component == null) {
-                componentRiPair = getRelatedComponentComponentInstance(componentType, componentUuid, resourceInstanceName, errorWrapper);
-            }
-            else {
-                componentRiPair = getRelatedComponentComponentInstance(component, resourceInstanceName, errorWrapper);
-            }
-        }
-        if (errorWrapper.isEmpty()) {
-            componentInstanceId = componentRiPair.getRight().getUniqueId();
-            componentId = componentRiPair.getLeft().getUniqueId();
-            artifactId = findArtifactId(componentRiPair.getRight(), artifactUUID, errorWrapper);
-        }
-        if (errorWrapper.isEmpty()) {
-
-            actionResult = handleArtifactRequest(componentInstanceId, userId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, artifactId, null, origMd5, null, null, null, componentId, ComponentTypeEnum
-                    .findParamByType(componentType));
-
-            if (actionResult.isRight()) {
-                log.debug(FAILED_UPLOAD_ARTIFACT_TO_INSTANCE, resourceInstanceName, componentType, componentUuid, actionResult
-                        .right()
-                        .value());
-                errorWrapper.setInnerElement(actionResult.right().value());
-            }
+                    .value()
+                    .getMetadataDataDefinition()
+                    .getUniqueId(), userId);
         }
-        if (errorWrapper.isEmpty()) {
-            deleteArtifact = actionResult.left().value().left().value();
-            deleteArtifactResult = Either.left(deleteArtifact);
+        if (component == null) {
+            componentRiPair = getRelatedComponentComponentInstance(componentType, componentUuid, resourceInstanceName);
         }
         else {
-            deleteArtifactResult = Either.right(errorWrapper.getInnerElement());
+            componentRiPair = getRelatedComponentComponentInstance(component, resourceInstanceName);
         }
-        return deleteArtifactResult;
+        componentInstanceId = componentRiPair.getRight().getUniqueId();
+        componentId = componentRiPair.getLeft().getUniqueId();
+        artifactId = findArtifactId(componentRiPair.getRight(), artifactUUID);
+
+        actionResult = handleArtifactRequest(componentInstanceId, userId, ComponentTypeEnum.RESOURCE_INSTANCE, operation, artifactId, null, origMd5, null, null, null, componentId, ComponentTypeEnum
+                .findParamByType(componentType));
+        return actionResult.left().value();
     }
 
-    private String findArtifactId(ComponentInstance instance, String artifactUUID, Wrapper<ResponseFormat> errorWrapper) {
+    private String findArtifactId(ComponentInstance instance, String artifactUUID) {
         String artifactId = null;
         ArtifactDefinition foundArtifact = null;
         if (instance.getDeploymentArtifacts() != null) {
             foundArtifact = instance.getDeploymentArtifacts()
-                                    .values()
-                                    .stream()
-                                    .filter(e -> e.getArtifactUUID() != null && e.getArtifactUUID()
-                                                                                 .equals(artifactUUID))
-                                    .findFirst()
-                                    .orElse(null);
+                    .values()
+                    .stream()
+                    .filter(e -> e.getArtifactUUID() != null && e.getArtifactUUID()
+                            .equals(artifactUUID))
+                    .findFirst()
+                    .orElse(null);
         }
         if (foundArtifact == null && instance.getArtifacts() != null) {
             foundArtifact = instance.getArtifacts()
-                                    .values()
-                                    .stream()
-                                    .filter(e -> e.getArtifactUUID() != null && e.getArtifactUUID()
-                                                                                 .equals(artifactUUID))
-                                    .findFirst()
-                                    .orElse(null);
+                    .values()
+                    .stream()
+                    .filter(e -> e.getArtifactUUID() != null && e.getArtifactUUID()
+                            .equals(artifactUUID))
+                    .findFirst()
+                    .orElse(null);
         }
         if (foundArtifact == null) {
             log.debug("The artifact {} was not found on instance {}. ", artifactUUID, instance.getUniqueId());
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, artifactUUID));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, artifactUUID);
         }
         else {
             artifactId = foundArtifact.getUniqueId();
@@ -5263,63 +4531,64 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     }
 
     @SuppressWarnings("unchecked")
-    public Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder(ArtifactDefinition heatArtifact, String envType, String parentId, NodeTypeEnum parentType, String parentName, User user, Component component,
-                                                                               Map<String, String> existingEnvVersions) {
+    public ArtifactDefinition createHeatEnvPlaceHolder(List<ArtifactDefinition> createdArtifacts, ArtifactDefinition heatArtifact,
+                                                       String envType, String parentId, NodeTypeEnum parentType,
+                                                       String parentName, User user, Component component,
+                                                       Map<String, String> existingEnvVersions) {
         Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager()
-                                                                              .getConfiguration()
-                                                                              .getDeploymentResourceInstanceArtifacts();
+                .getConfiguration()
+                .getDeploymentResourceInstanceArtifacts();
         if (deploymentResourceArtifacts == null) {
             log.debug("no deployment artifacts are configured for generated artifacts");
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+            throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
         }
         Map<String, Object> placeHolderData = (Map<String, Object>) deploymentResourceArtifacts.get(envType);
         if (placeHolderData == null) {
             log.debug("no env type {} are configured for generated artifacts", envType);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+            throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
         }
 
         String envLabel = (heatArtifact.getArtifactLabel() + HEAT_ENV_SUFFIX).toLowerCase();
-        Either<ArtifactDefinition, ResponseFormat> createArtifactPlaceHolder = createArtifactPlaceHolderInfo(parentId, envLabel, placeHolderData, user
+        ArtifactDefinition createArtifactPlaceHolder = createArtifactPlaceHolderInfo(parentId, envLabel, placeHolderData, user
                 .getUserId(), ArtifactGroupTypeEnum.DEPLOYMENT, true);
-        if (createArtifactPlaceHolder.isRight()) {
-            return Either.right(createArtifactPlaceHolder.right().value());
-        }
-        ArtifactDefinition artifactHeatEnv = createArtifactPlaceHolder.left().value();
+        ArtifactDefinition artifactHeatEnv = createArtifactPlaceHolder;
         artifactHeatEnv.setGeneratedFromId(heatArtifact.getUniqueId());
         artifactHeatEnv.setHeatParamsUpdateDate(System.currentTimeMillis());
         artifactHeatEnv.setTimeout(0);
+        artifactHeatEnv.setIsFromCsar(heatArtifact.getIsFromCsar());
         buildHeatEnvFileName(heatArtifact, artifactHeatEnv, placeHolderData);
         // rbetzer - keep env artifactVersion - changeComponentInstanceVersion flow
         handleEnvArtifactVersion(artifactHeatEnv, existingEnvVersions);
         ArtifactDefinition heatEnvPlaceholder;
         // Evg : for resource instance artifact will be added later as block with other env artifacts from BL
         if (parentType != NodeTypeEnum.ResourceInstance) {
-            Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact = addHeatEnvArtifact(artifactHeatEnv, heatArtifact, component
-                    .getUniqueId(), parentType, parentId);
+            String checkSum = artifactToscaOperation.sortAndCalculateChecksumForHeatParameters(heatArtifact.getHeatParameters());
+            artifactHeatEnv.setArtifactChecksum(checkSum);
+            Either<ArtifactDefinition, StorageOperationStatus> addHeatEnvArtifact = addHeatEnvArtifact(artifactHeatEnv, heatArtifact, component, parentType, parentId);
             if (addHeatEnvArtifact.isRight()) {
                 log.debug("failed to create heat env artifact on resource instance");
-                return Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(addHeatEnvArtifact
+                throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(addHeatEnvArtifact
                         .right()
                         .value(), false), "", null));
             }
-            heatEnvPlaceholder = createArtifactPlaceHolder.left().value();
+            heatEnvPlaceholder = createArtifactPlaceHolder;
         }
         else {
             heatEnvPlaceholder = artifactHeatEnv;
             artifactToscaOperation.generateUUID(heatEnvPlaceholder, heatEnvPlaceholder.getArtifactVersion());
             setHeatCurrentValuesOnHeatEnvDefaultValues(heatArtifact, heatEnvPlaceholder);
         }
-
         ComponentTypeEnum componentType = component.getComponentType();
         if (parentType == NodeTypeEnum.ResourceInstance) {
             componentType = ComponentTypeEnum.RESOURCE_INSTANCE;
         }
+        createdArtifacts.add(heatEnvPlaceholder);
         componentsUtils.auditComponent(componentsUtils.getResponseFormat(ActionStatus.OK), user, component, AuditingActionEnum.ARTIFACT_UPLOAD,
                 new ResourceCommonInfo(parentName, componentType.getValue()),
                 ResourceVersionInfo.newBuilder().build(),
                 ResourceVersionInfo.newBuilder().artifactUuid(heatEnvPlaceholder.getUniqueId()).build(),
                 null, heatEnvPlaceholder, null);
-        return Either.left(heatEnvPlaceholder);
+        return heatEnvPlaceholder;
     }
 
     private void setHeatCurrentValuesOnHeatEnvDefaultValues(ArtifactDefinition artifact, ArtifactDefinition artifactDefinition) {
@@ -5360,26 +4629,75 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         }
     }
 
-    /**
-     * Handles Artifacts Request For Inner Component
-     *
-     * @param artifactsToHandle
-     * @param component
-     * @param user
-     * @param vfcsNewCreatedArtifacts
-     * @param operation
-     * @param shouldLock
-     * @param inTransaction
-     * @return
-     */
-    public Either<List<ArtifactDefinition>, ResponseFormat> handleArtifactsRequestForInnerVfcComponent(List<ArtifactDefinition> artifactsToHandle, Resource component, User user, List<ArtifactDefinition> vfcsNewCreatedArtifacts,
-                                                                                                       ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction) {
-
-        Either<List<ArtifactDefinition>, ResponseFormat> handleArtifactsResult = null;
+    public List<ArtifactDefinition> handleArtifactsForInnerVfcComponent(List<ArtifactDefinition> artifactsToHandle, Resource component, User user, List<ArtifactDefinition> vfcsNewCreatedArtifacts,
+                                                                        ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction) {
         ComponentTypeEnum componentType = component.getComponentType();
         List<ArtifactDefinition> uploadedArtifacts = new ArrayList<>();
+        Either<ArtifactDefinition, Operation> result;
+        try {
+            for (ArtifactDefinition artifactDefinition : artifactsToHandle) {
+                result = handleLoadedArtifact(component, user, operation, shouldLock, inTransaction, componentType, artifactDefinition);
+                uploadedArtifacts.add(result.left().value());
+            }
+        } catch (ComponentException e) {
+            log.debug(FAILED_UPLOAD_ARTIFACT_TO_COMPONENT, componentType, component
+                    .getName(), e.getResponseFormat());
+            if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
+                vfcsNewCreatedArtifacts.addAll(uploadedArtifacts);
+            }
+            throw e;
+        }
+        return uploadedArtifacts;
+    }
+
+    public Either<ArtifactDefinition, Operation> handleLoadedArtifact(Resource component, User user, ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction,
+                                                                      ComponentTypeEnum componentType, ArtifactDefinition artifactDefinition) {
+        AuditingActionEnum auditingAction = detectAuditingType(operation, "");
+        String componentId = component.getUniqueId();
+        String artifactId = artifactDefinition.getUniqueId();
+        Either<ArtifactDefinition, Operation> result;
         Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
-        Either<Either<ArtifactDefinition, Operation>, ResponseFormat> actionResult;
+        //artifact validation
+        artifactDefinition = validateArtifact(componentId, componentType, operation,
+                artifactId, artifactDefinition, auditingAction, user,
+                component, shouldLock, inTransaction);
+        switch (operation.getArtifactOperationEnum()) {
+            case CREATE:
+                byte[] validPayload = getValidPayload(componentId, artifactDefinition, operation, auditingAction, artifactId, user, componentType, component, null, null);
+                result = createArtifact(component, componentId, artifactDefinition, validPayload,
+                        componentType, auditingAction, null, null);
+                break;
+            case UPDATE:
+                validPayload = getValidPayload(componentId, artifactDefinition, operation, auditingAction, artifactId, user, componentType, component, null, null);
+                result = handleUpdate(componentId, componentType, operation, artifactId, artifactDefinition, validPayload, null, null, null, null,
+                        auditingAction, user, component, true);
+                break;
+            case DELETE:
+                result = Either.left(handleDeleteInternal(componentId, artifactId, componentType, component));
+                break;
+            case DOWNLOAD:
+                if (artifactGenerationRequired(component, artifactDefinition)) {
+                    result = Either.left(generateNotSavedArtifact(component, artifactDefinition));
+                } else {
+                    result = Either.left(handleDownload(componentId, artifactId, componentType, component));
+                }
+                break;
+            case LINK:
+                result = Either.left(handleLink(componentId, artifactDefinition, componentType, component));
+                break;
+            default:
+                throw new UnsupportedOperationException("In ArtifactsBusinessLogic received illegal operation: " + operation.getArtifactOperationEnum());
+        }
+        return result;
+    }
+
+    public List<ArtifactDefinition> handleArtifactsRequestForInnerVfcComponent(List<ArtifactDefinition> artifactsToHandle, Resource component, User user, List<ArtifactDefinition> vfcsNewCreatedArtifacts,
+                                                                               ArtifactOperationInfo operation, boolean shouldLock, boolean inTransaction) {
+
+        List<ArtifactDefinition> handleArtifactsResult;
+        ComponentTypeEnum componentType = component.getComponentType();
+        List<ArtifactDefinition> uploadedArtifacts = new ArrayList<>();
+        Either<ArtifactDefinition, Operation> actionResult;
         String originData;
         String origMd5;
         try {
@@ -5388,68 +4706,50 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
                 origMd5 = GeneralUtility.calculateMD5Base64EncodedByString(originData);
                 actionResult = handleArtifactRequest(component.getUniqueId(), user.getUserId(), componentType, operation, artifact
                         .getUniqueId(), artifact, origMd5, originData, null, null, null, null, shouldLock, inTransaction);
-                if (actionResult.isRight()) {
-                    log.debug("Failed to upload artifact to component with type {} and name {}. Status is {}. ", componentType, component
-                            .getName(), actionResult.right().value());
-                    errorWrapper.setInnerElement(actionResult.right().value());
-                    if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
-                        vfcsNewCreatedArtifacts.addAll(uploadedArtifacts);
-                    }
-                    break;
-                }
-                uploadedArtifacts.add(actionResult.left().value().left().value());
-            }
-            if (errorWrapper.isEmpty()) {
-                handleArtifactsResult = Either.left(uploadedArtifacts);
+                uploadedArtifacts.add(actionResult.left().value());
             }
-            else {
-                handleArtifactsResult = Either.right(errorWrapper.getInnerElement());
+            handleArtifactsResult = uploadedArtifacts;
+        }catch (ComponentException e){
+            if (ArtifactOperationEnum.isCreateOrLink(operation.getArtifactOperationEnum())) {
+                vfcsNewCreatedArtifacts.addAll(uploadedArtifacts);
             }
-        }
-        catch (Exception e) {
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
-            handleArtifactsResult = Either.right(responseFormat);
-            log.debug("Exception occured when handleArtifactsRequestForInnerVfcComponent, error is:{}", e.getMessage(), e);
+            throw e;
         }
         return handleArtifactsResult;
     }
 
-    private ComponentInstance getRelatedComponentInstance(ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName, Wrapper<ResponseFormat> errorWrapper) {
-        ComponentInstance componentInstance = null;
+    private ComponentInstance getRelatedComponentInstance(ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName) {
+        ComponentInstance componentInstance;
         String normalizedName = ValidationUtils.normalizeComponentInstanceName(resourceInstanceName);
-        Component component = getComponentByUuid(componentType, componentUuid, errorWrapper);
-        if (errorWrapper.isEmpty()) {
-            componentInstance = component.getComponentInstances()
-                                         .stream()
-                                         .filter(ci -> ValidationUtils.normalizeComponentInstanceName(ci.getName())
-                                                                      .equals(normalizedName))
-                                         .findFirst()
-                                         .orElse(null);
-            if (componentInstance == null) {
-                errorWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, resourceInstanceName, RESOURCE_INSTANCE, component
-                        .getComponentType()
-                        .getValue(), component.getName()));
-                log.debug(COMPONENT_INSTANCE_NOT_FOUND, resourceInstanceName, component.getName());
-            }
+        Component component = getComponentByUuid(componentType, componentUuid);
+        componentInstance = (component == null) ? null : component.getComponentInstances()
+                .stream()
+                .filter(ci -> ValidationUtils.normalizeComponentInstanceName(ci.getName())
+                        .equals(normalizedName))
+                .findFirst()
+                .orElse(null);
+        if (componentInstance == null) {
+            log.debug(COMPONENT_INSTANCE_NOT_FOUND, resourceInstanceName, component.getName());
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, resourceInstanceName,
+                    RESOURCE_INSTANCE, component.getComponentType().getValue(), component.getName());
         }
         return componentInstance;
     }
 
-    private ImmutablePair<Component, ComponentInstance> getRelatedComponentComponentInstance(Component component, String resourceInstanceName, Wrapper<ResponseFormat> errorWrapper) {
+    private ImmutablePair<Component, ComponentInstance> getRelatedComponentComponentInstance(Component component, String resourceInstanceName) {
 
         ImmutablePair<Component, ComponentInstance> relatedComponentComponentInstancePair = null;
         String normalizedName = ValidationUtils.normalizeComponentInstanceName(resourceInstanceName);
         ComponentInstance componentInstance = component.getComponentInstances()
-                                                       .stream()
-                                                       .filter(ci -> ValidationUtils.normalizeComponentInstanceName(ci.getName())
-                                                                                    .equals(normalizedName))
-                                                       .findFirst()
-                                                       .orElse(null);
+                .stream()
+                .filter(ci -> ValidationUtils.normalizeComponentInstanceName(ci.getName())
+                        .equals(normalizedName))
+                .findFirst()
+                .orElse(null);
         if (componentInstance == null) {
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, resourceInstanceName, RESOURCE_INSTANCE, component
-                    .getComponentType()
-                    .getValue(), component.getName()));
             log.debug(COMPONENT_INSTANCE_NOT_FOUND, resourceInstanceName, component.getName());
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, resourceInstanceName,
+                    RESOURCE_INSTANCE, component.getComponentType().getValue(), component.getName());
         }
         else {
             relatedComponentComponentInstancePair = new ImmutablePair<>(component, componentInstance);
@@ -5457,68 +4757,57 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return relatedComponentComponentInstancePair;
     }
 
-    private ImmutablePair<Component, ComponentInstance> getRelatedComponentComponentInstance(ComponentTypeEnum componentType, String componentUuid, String resourceInstanceName, Wrapper<ResponseFormat> errorWrapper) {
+    private ImmutablePair<Component, ComponentInstance> getRelatedComponentComponentInstance(ComponentTypeEnum componentType,
+                                                                                             String componentUuid, String resourceInstanceName) {
         ComponentInstance componentInstance;
-        ImmutablePair<Component, ComponentInstance> relatedComponentComponentInstancePair = null;
-        Component component = getLatestComponentByUuid(componentType, componentUuid, errorWrapper);
-        if (errorWrapper.isEmpty()) {
-            componentInstance = component.getComponentInstances()
-                                         .stream()
-                                         .filter(ci -> ci.getNormalizedName().equals(resourceInstanceName))
-                                         .findFirst()
-                                         .orElse(null);
-            if (componentInstance == null) {
-                errorWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, resourceInstanceName, RESOURCE_INSTANCE, component
-                        .getComponentType()
-                        .getValue(), component.getName()));
-                log.debug(COMPONENT_INSTANCE_NOT_FOUND, resourceInstanceName, component.getName());
-            }
-            else {
-                relatedComponentComponentInstancePair = new ImmutablePair<>(component, componentInstance);
-            }
+        ImmutablePair<Component, ComponentInstance> relatedComponentComponentInstancePair;
+        Component component = getLatestComponentByUuid(componentType, componentUuid);
+        componentInstance = component.getComponentInstances()
+                .stream()
+                .filter(ci -> ci.getNormalizedName().equals(resourceInstanceName))
+                .findFirst()
+                .orElse(null);
+        if (componentInstance == null) {
+            log.debug(COMPONENT_INSTANCE_NOT_FOUND, resourceInstanceName, component.getName());
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
+                    resourceInstanceName, RESOURCE_INSTANCE, component
+                    .getComponentType().getValue(), component.getName());
+        }
+        else {
+            relatedComponentComponentInstancePair = new ImmutablePair<>(component, componentInstance);
         }
         return relatedComponentComponentInstancePair;
     }
 
-    private byte[] downloadArtifact(Map<String, ArtifactDefinition> artifacts, String artifactUUID, Wrapper<ResponseFormat> errorWrapper, String componentName) {
+    private byte[] downloadArtifact(Map<String, ArtifactDefinition> artifacts, String artifactUUID, String componentName) {
 
-        byte[] downloadedArtifact = null;
-        Either<ImmutablePair<String, byte[]>, ResponseFormat> downloadArtifactEither = null;
+        ImmutablePair<String, byte[]> downloadArtifact;
         List<ArtifactDefinition> artifactsList = null;
-        ArtifactDefinition deploymentArtifact = null;
+        ArtifactDefinition deploymentArtifact;
         if (artifacts != null && !artifacts.isEmpty()) {
             artifactsList = artifacts.values()
-                                     .stream()
-                                     .filter(art -> art.getArtifactUUID() != null && art.getArtifactUUID()
-                                                                                        .equals(artifactUUID))
-                                     .collect(Collectors.toList());
+                    .stream()
+                    .filter(art -> art.getArtifactUUID() != null && art.getArtifactUUID()
+                            .equals(artifactUUID))
+                    .collect(Collectors.toList());
         }
         if (artifactsList == null || artifactsList.isEmpty()) {
             log.debug("Deployment artifact with uuid {} was not found for component {}", artifactUUID, componentName);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.ARTIFACT_NOT_FOUND, artifactUUID));
+            throw new ByActionStatusComponentException(ActionStatus.ARTIFACT_NOT_FOUND, artifactUUID);
         }
-        if (errorWrapper.isEmpty()) {
-            deploymentArtifact = artifactsList.get(0);
-            downloadArtifactEither = downloadArtifact(deploymentArtifact);
-            if (downloadArtifactEither.isRight()) {
-                log.debug("Failed to download artifact {}. ", deploymentArtifact.getArtifactName());
-                errorWrapper.setInnerElement(downloadArtifactEither.right().value());
-            }
-        }
-        if (errorWrapper.isEmpty()) {
-            log.trace("Succeeded to download artifact with uniqueId {}", deploymentArtifact.getUniqueId());
-            downloadedArtifact = downloadArtifactEither.left().value().getRight();
-        }
-        return downloadedArtifact;
+        deploymentArtifact = artifactsList.get(0);
+        downloadArtifact = downloadArtifact(deploymentArtifact);
+        log.trace("Succeeded to download artifact with uniqueId {}", deploymentArtifact.getUniqueId());
+        return downloadArtifact.getRight();
     }
 
-    private Component getLatestComponentByUuid(ComponentTypeEnum componentType, String componentUuid, Wrapper<ResponseFormat> errorWrapper) {
-        Component component = null;
+    private Component getLatestComponentByUuid(ComponentTypeEnum componentType, String componentUuid) {
+        Component component;
         Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getLatestComponentByUuid(componentUuid);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
-            log.debug("Could not fetch component with type {} and uuid {}. Status is {}. ", componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status)));
+            log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status));
         }
         else {
             component = getComponentRes.left().value();
@@ -5526,20 +4815,20 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return component;
     }
 
-    private Component getComponentByUuid(ComponentTypeEnum componentType, String componentUuid, Wrapper<ResponseFormat> errorWrapper) {
-        Component component = null;
+    private Component getComponentByUuid(ComponentTypeEnum componentType, String componentUuid) {
+        Component component;
         Either<List<Component>, StorageOperationStatus> getComponentRes = toscaOperationFacade.getComponentListByUuid(componentUuid, null);
         if (getComponentRes.isRight()) {
             StorageOperationStatus status = getComponentRes.right().value();
-            log.debug("Could not fetch component with type {} and uuid {}. Status is {}. ", componentType, componentUuid, status);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(status)));
+            log.debug(FAILED_FETCH_COMPONENT, componentType, componentUuid, status);
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(status));
         }
         else {
             List<Component> value = getComponentRes.left().value();
             if (value.isEmpty()) {
                 log.debug("Could not fetch component with type {} and uuid {}.", componentType, componentUuid);
                 ActionStatus status = componentType == ComponentTypeEnum.RESOURCE ? ActionStatus.RESOURCE_NOT_FOUND : ActionStatus.SERVICE_NOT_FOUND;
-                errorWrapper.setInnerElement(componentsUtils.getResponseFormat(status));
+                throw new ByActionStatusComponentException(status);
             }
             else {
                 component = value.get(0);
@@ -5548,78 +4837,58 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
         return component;
     }
 
-    private String getLatestParentArtifactDataIdByArtifactUUID(String artifactUUID, Wrapper<ResponseFormat> errorWrapper, String parentId, ComponentTypeEnum componentType) {
-        String artifactId = null;
+    private String getLatestParentArtifactDataIdByArtifactUUID(String artifactUUID, String parentId, ComponentTypeEnum componentType) {
         ActionStatus actionStatus = ActionStatus.ARTIFACT_NOT_FOUND;
         StorageOperationStatus storageStatus;
-        ArtifactDefinition latestArtifact = null;
-        List<ArtifactDefinition> artifacts = null;
+        ArtifactDefinition latestArtifact;
+        List<ArtifactDefinition> artifacts;
         Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getArtifactsRes = artifactToscaOperation.getArtifacts(parentId);
         if (getArtifactsRes.isRight()) {
             storageStatus = getArtifactsRes.right().value();
             log.debug("Couldn't fetch artifacts data for parent component {} with uid {}, error: {}", componentType, parentId, storageStatus);
-            if (!storageStatus.equals(StorageOperationStatus.NOT_FOUND)) {
+            if (storageStatus != StorageOperationStatus.NOT_FOUND) {
                 actionStatus = componentsUtils.convertFromStorageResponse(storageStatus);
             }
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(actionStatus, artifactUUID));
+            throw new ByActionStatusComponentException(actionStatus, artifactUUID);
         }
-        if (errorWrapper.isEmpty()) {
-            artifacts = getArtifactsRes.left()
-                                       .value()
-                                       .values()
-                                       .stream()
-                                       .filter(a -> a.getArtifactUUID() != null && a.getArtifactUUID()
-                                                                                    .equals(artifactUUID))
-                                       .collect(Collectors.toList());
-            if (artifacts == null || artifacts.isEmpty()) {
-                log.debug("Couldn't fetch artifact with UUID {} data for parent component {} with uid {}, error: {}", artifactUUID, componentType, parentId, actionStatus);
-                errorWrapper.setInnerElement(componentsUtils.getResponseFormat(actionStatus, artifactUUID));
-            }
+        artifacts = getArtifactsRes.left()
+                .value()
+                .values()
+                .stream()
+                .filter(a -> a.getArtifactUUID() != null && a.getArtifactUUID()
+                        .equals(artifactUUID))
+                .collect(Collectors.toList());
+        if (artifacts == null || artifacts.isEmpty()) {
+            log.debug("Couldn't fetch artifact with UUID {} data for parent component {} with uid {}, error: {}", artifactUUID, componentType, parentId, actionStatus);
+            throw new ByActionStatusComponentException(actionStatus, artifactUUID);
         }
-        if (errorWrapper.isEmpty()) {
-            latestArtifact = artifacts.stream().max((a1, a2) -> {
-                int compareRes = Double.compare(Double.parseDouble(a1.getArtifactVersion()), Double.parseDouble(a2.getArtifactVersion()));
-                if (compareRes == 0) {
-                    compareRes = Long.compare(a1.getLastUpdateDate() == null ? 0 : a1.getLastUpdateDate(), a2.getLastUpdateDate() == null ? 0 : a2
-                            .getLastUpdateDate());
-                }
-                return compareRes;
-            }).get();
-            if (latestArtifact == null) {
-                log.debug("Couldn't fetch latest artifact with UUID {} data for parent component {} with uid {}, error: {}", artifactUUID, componentType, parentId, actionStatus);
-                errorWrapper.setInnerElement(componentsUtils.getResponseFormat(actionStatus, artifactUUID));
+        latestArtifact = artifacts.stream().max((a1, a2) -> {
+            int compareRes = Double.compare(Double.parseDouble(a1.getArtifactVersion()), Double.parseDouble(a2.getArtifactVersion()));
+            if (compareRes == 0) {
+                compareRes = Long.compare(a1.getLastUpdateDate() == null ? 0 : a1.getLastUpdateDate(), a2.getLastUpdateDate() == null ? 0 : a2
+                        .getLastUpdateDate());
             }
+            return compareRes;
+        }).get();
+        if (latestArtifact == null) {
+            log.debug("Couldn't fetch latest artifact with UUID {} data for parent component {} with uid {}, error: {}", artifactUUID, componentType, parentId, actionStatus);
+            throw new ByActionStatusComponentException(actionStatus, artifactUUID);
         }
-        if (errorWrapper.isEmpty()) {
-            artifactId = latestArtifact.getUniqueId();
-        }
-        return artifactId;
+        return latestArtifact.getUniqueId();
     }
 
-    private Component checkoutParentComponent(ComponentTypeEnum componentType, String parentId, String userId, Wrapper<ResponseFormat> errorWrapper) {
+    private Component checkoutParentComponent(ComponentTypeEnum componentType, String parentId, String userId) {
 
         Component component = null;
-        Either<User, ActionStatus> getUserRes = userBusinessLogic.getUser(userId, false);
-        if (getUserRes.isRight()) {
-            log.debug("Could not fetch User of component {} with uid {} to checked out. Status is {}. ", componentType.getNodeType(), parentId, getUserRes
-                    .right()
-                    .value());
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(getUserRes.right().value()));
+        User modifier = userBusinessLogic.getUser(userId, false);
+        LifecycleChangeInfoWithAction changeInfo = new LifecycleChangeInfoWithAction("External API checkout", LifecycleChanceActionEnum.UPDATE_FROM_EXTERNAL_API);
+        Either<? extends Component, ResponseFormat> checkoutRes = lifecycleBusinessLogic.changeComponentState(componentType, parentId, modifier, LifeCycleTransitionEnum.CHECKOUT, changeInfo, false, true);
+        if (checkoutRes.isRight()) {
+            log.debug("Could not change state of component {} with uid {} to checked out. Status is {}. ", componentType
+                    .getNodeType(), parentId, checkoutRes.right().value().getStatus());
+            throw new ByResponseFormatComponentException(checkoutRes.right().value());
         }
-        if (errorWrapper.isEmpty()) {
-            User modifier = getUserRes.left().value();
-            LifecycleChangeInfoWithAction changeInfo = new LifecycleChangeInfoWithAction("External API checkout", LifecycleChanceActionEnum.UPDATE_FROM_EXTERNAL_API);
-            Either<? extends Component, ResponseFormat> checkoutRes = lifecycleBusinessLogic.changeComponentState(componentType, parentId, modifier, LifeCycleTransitionEnum.CHECKOUT, changeInfo, false, true);
-            if (checkoutRes.isRight()) {
-                log.debug("Could not change state of component {} with uid {} to checked out. Status is {}. ", componentType
-                        .getNodeType(), parentId, checkoutRes.right().value().getStatus());
-                errorWrapper.setInnerElement(checkoutRes.right().value());
-            }
-            else {
-                component = checkoutRes.left().value();
-            }
-        }
-        return component;
+        return checkoutRes.left().value();
     }
 
     private String buildJsonStringForCsarVfcArtifact(ArtifactDefinition artifact) {
@@ -5639,4 +4908,6 @@ public class ArtifactsBusinessLogic extends BaseBusinessLogic {
     void setNodeTemplateOperation(NodeTemplateOperation nodeTemplateOperation) {
         this.nodeTemplateOperation = nodeTemplateOperation;
     }
+
 }
+