Catalog alignment
[sdc.git] / catalog-be / src / main / java / org / openecomp / sdc / be / components / impl / ComponentInstanceBusinessLogic.java
index 040c460..51eb22d 100644 (file)
@@ -26,6 +26,9 @@ import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang3.tuple.ImmutablePair;
+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.impl.instance.ComponentInstanceChangeOperationOrchestrator;
 import org.openecomp.sdc.be.components.impl.utils.DirectivesUtils;
 import org.openecomp.sdc.be.components.merge.instance.ComponentInstanceMergeDataBusinessLogic;
@@ -34,23 +37,24 @@ import org.openecomp.sdc.be.components.utils.PropertiesUtils;
 import org.openecomp.sdc.be.components.validation.ComponentValidations;
 import org.openecomp.sdc.be.config.BeEcompErrorManager;
 import org.openecomp.sdc.be.config.BeEcompErrorManager.ErrorSeverity;
+import org.openecomp.sdc.be.config.ConfigurationManager;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
 import org.openecomp.sdc.be.dao.neo4j.GraphPropertiesDictionary;
-import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
-import org.openecomp.sdc.be.datamodel.utils.PropertyValueConstraintValidationUtil;
+import org.openecomp.sdc.be.datamodel.utils.ContainerInstanceTypesData;
 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.NodeTypeEnum;
 import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
 import org.openecomp.sdc.be.impl.ForwardingPathUtils;
 import org.openecomp.sdc.be.impl.ServiceFilterUtils;
 import org.openecomp.sdc.be.info.CreateAndAssotiateInfo;
@@ -69,7 +73,6 @@ import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.LifecycleStateEnum;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
-import org.openecomp.sdc.be.model.PropertyDefinition.PropertyNames;
 import org.openecomp.sdc.be.model.RelationshipInfo;
 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
 import org.openecomp.sdc.be.model.RequirementDefinition;
@@ -82,12 +85,13 @@ import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.NodeFilterOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
-import org.openecomp.sdc.be.model.operations.api.IComponentInstanceOperation;
+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.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.ComponentInstanceOperation;
 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;
@@ -142,12 +146,12 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     private static final String FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS = "Failed to copy the component instance to the canvas";
     private static final String COPY_COMPONENT_INSTANCE_OK = "Copy component instance OK";
 
-    private final IComponentInstanceOperation componentInstanceOperation;
-    private final ArtifactsBusinessLogic artifactBusinessLogic;
-    private final ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL;
-    private final ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator;
-    private final ForwardingPathOperation forwardingPathOperation;
-    private final NodeFilterOperation serviceFilterOperation;
+    private ComponentInstanceOperation componentInstanceOperation;
+    private ArtifactsBusinessLogic artifactBusinessLogic;
+    private ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL;
+    private ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator;
+    private ForwardingPathOperation forwardingPathOperation;
+    private NodeFilterOperation serviceFilterOperation;
 
     @Autowired
     public ComponentInstanceBusinessLogic(IElementOperation elementDao,
@@ -156,7 +160,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         IGroupTypeOperation groupTypeOperation,
         InterfaceOperation interfaceOperation,
         InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
-        IComponentInstanceOperation componentInstanceOperation, ArtifactsBusinessLogic artifactBusinessLogic,
+        ComponentInstanceOperation componentInstanceOperation, ArtifactsBusinessLogic artifactBusinessLogic,
         ComponentInstanceMergeDataBusinessLogic compInstMergeDataBL,
         ComponentInstanceChangeOperationOrchestrator onChangeInstanceOperationOrchestrator,
         ForwardingPathOperation forwardingPathOperation, NodeFilterOperation serviceFilterOperation,
@@ -171,10 +175,14 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         this.serviceFilterOperation = serviceFilterOperation;
     }
 
-    public Either<ComponentInstance, ResponseFormat> createComponentInstance(String containerComponentParam,
-                                                                             String containerComponentId, String userId, ComponentInstance resourceInstance) {
-        return createComponentInstance(containerComponentParam, containerComponentId, userId, resourceInstance, false,
-                true);
+    @Autowired
+    private CompositionBusinessLogic compositionBusinessLogic;
+
+    @Autowired
+    private ContainerInstanceTypesData containerInstanceTypesData;
+
+    public ComponentInstance createComponentInstance(String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance) {
+        return createComponentInstance(containerComponentParam, containerComponentId, userId, resourceInstance, false, true);
     }
 
     public List<ComponentInstanceProperty> getComponentInstancePropertiesByInputId(org.openecomp.sdc.be.model.Component component, String inputId){
@@ -191,23 +199,27 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                     if (ciPropList != null && !ciPropList.isEmpty()) {
                         for(ComponentInstanceProperty prop: ciPropList){
                             List<GetInputValueDataDefinition> inputsValues = prop.getGetInputValues();
-                            if(inputsValues != null && !inputsValues.isEmpty()){
-                                for(GetInputValueDataDefinition inputData: inputsValues){
-                                    if(isGetInputValueForInput(inputData, inputId)){
-                                        prop.setComponentInstanceId(s);
-                                        prop.setComponentInstanceName(ciName);
-                                        resList.add(prop);
-                                        break;
-                                    }
-                                }
-                            }
-
+                            addCompInstanceProperty(s, ciName, prop, inputsValues, inputId, resList);
                         }
                     }
                 }
             });
         }
         return resList;
+
+    }
+
+    private void addCompInstanceProperty(String s, String ciName, ComponentInstanceProperty prop, List<GetInputValueDataDefinition> inputsValues, String inputId, List<ComponentInstanceProperty> resList) {
+        if(inputsValues != null && !inputsValues.isEmpty()){
+            for(GetInputValueDataDefinition inputData: inputsValues){
+                if(isGetInputValueForInput(inputData, inputId)){
+                    prop.setComponentInstanceId(s);
+                    prop.setComponentInstanceName(ciName);
+                    resList.add(prop);
+                    break;
+                }
+            }
+        }
     }
 
     public Optional<ComponentInstanceProperty> getComponentInstancePropertyByPolicyId(Component component,
@@ -286,16 +298,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                     if (ciPropList != null && !ciPropList.isEmpty()) {
                         for(ComponentInstanceInput prop: ciPropList){
                             List<GetInputValueDataDefinition> inputsValues = prop.getGetInputValues();
-                            if(inputsValues != null && !inputsValues.isEmpty()){
-                                for(GetInputValueDataDefinition inputData: inputsValues){
-                                    if(isGetInputValueForInput(inputData, inputId)){
-                                        prop.setComponentInstanceId(s);
-                                        prop.setComponentInstanceName(ciName);
-                                        resList.add(prop);
-                                        break;
-                                    }
-                                }
-                            }
+                            addCompInstanceInput(s, ciName, prop, inputsValues, inputId, resList);
 
                         }
                     }
@@ -303,90 +306,190 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             });
         }
         return resList;
+
+    }
+
+    private void addCompInstanceInput(String s, String ciName, ComponentInstanceInput prop, List<GetInputValueDataDefinition> inputsValues, String inputId, List<ComponentInstanceInput> resList) {
+        if(inputsValues != null && !inputsValues.isEmpty()){
+            for(GetInputValueDataDefinition inputData: inputsValues){
+                if(isGetInputValueForInput(inputData, inputId)){
+                    prop.setComponentInstanceId(s);
+                    prop.setComponentInstanceName(ciName);
+                    resList.add(prop);
+                    break;
+                }
+            }
+        }
     }
 
-    public Either<ComponentInstance, ResponseFormat> createComponentInstance(
-            String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance, boolean inTransaction, boolean needLock) {
+    public ComponentInstance createComponentInstance(String containerComponentParam, String containerComponentId, String userId, ComponentInstance resourceInstance, boolean inTransaction, boolean needLock) {
 
         Component origComponent = null;
-        Either<ComponentInstance, ResponseFormat> resultOp = null;
-        User user = null;
+        User user;
         org.openecomp.sdc.be.model.Component containerComponent = null;
         ComponentTypeEnum containerComponentType;
-
         try {
-            user = validateUserExists(userId, "create Component Instance", inTransaction);
-
-            Either<Boolean, ResponseFormat> validateValidJson = validateJsonBody(resourceInstance, ComponentInstance.class);
-            if (validateValidJson.isRight()) {
-                return Either.right(validateValidJson.right().value());
-            }
-
-            Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-            if (validateComponentType.isRight()) {
-                return Either.right(validateComponentType.right().value());
-            } else {
-                containerComponentType = validateComponentType.left().value();
-            }
-
-            Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(containerComponentId, containerComponentType, null);
-            if (validateComponentExists.isRight()) {
-                return Either.right(validateComponentExists.right().value());
-            } else {
-                containerComponent = validateComponentExists.left().value();
-            }
+            user = validateUserExists(userId);
+            validateUserNotEmpty(user, "Create component instance");
+            validateJsonBody(resourceInstance, ComponentInstance.class);
+            containerComponentType = validateComponentType(containerComponentParam);
+            containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
 
             if (ModelConverter.isAtomicComponent(containerComponent)) {
                 log.debug("Cannot attach resource instances to container resource of type {}", containerComponent.assetType());
-                return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType()));
+                throw new ByActionStatusComponentException(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType());
             }
 
-            Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-            if (validateCanWorkOnComponent.isRight()) {
-                return Either.right(validateCanWorkOnComponent.right().value());
-            }
+            validateCanWorkOnComponent(containerComponent, userId);
 
             if (resourceInstance != null && containerComponentType != null) {
                 OriginTypeEnum originType = resourceInstance.getOriginType();
+                validateInstanceName(resourceInstance);
                 if (originType == OriginTypeEnum.ServiceProxy) {
+
                     Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName("serviceProxy");
-                    if (serviceProxyOrigin.isRight()) {
-                        log.debug("Failed to fetch normative service proxy resource by tosca name, error {}", serviceProxyOrigin.right().value());
-                        return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value())));
+                    if (isServiceProxyOrigin(serviceProxyOrigin)) {
+                        throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
                     }
                     origComponent = serviceProxyOrigin.left().value();
 
                     StorageOperationStatus fillProxyRes = fillProxyInstanceData(resourceInstance, origComponent);
-                    if (fillProxyRes != StorageOperationStatus.OK) {
-                        log.debug("Failed to fill service proxy resource data with data from service, error {}", fillProxyRes);
-                        return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(fillProxyRes)));
-
-                    }
-
-                } else {
-                    Either<Component, ResponseFormat> getOriginComponentRes = getAndValidateOriginComponentOfComponentInstance(containerComponentType, resourceInstance);
-
-                    if (getOriginComponentRes.isRight()) {
-                        return Either.right(getOriginComponentRes.right().value());
-                    } else {
-                        origComponent = getOriginComponentRes.left().value();
+                    if (isFillProxyRes(fillProxyRes)) {
+                        throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
                     }
                 }
-            }
-            if (needLock) {
-                Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "createComponentInstance");
-                if (lockComponent.isRight()) {
-                    return Either.right(lockComponent.right().value());
+                else {
+                    origComponent = getAndValidateOriginComponentOfComponentInstance(containerComponent, resourceInstance);
                 }
+                validateOriginAndResourceInstanceTypes(containerComponent, origComponent, originType);
+                validateResourceInstanceState(containerComponent, origComponent);
+                overrideFields(origComponent, resourceInstance);
+                compositionBusinessLogic.validateAndSetDefaultCoordinates(resourceInstance);
             }
-            log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
-            resultOp = createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
-            return resultOp;
+            return createComponent(needLock, containerComponent,origComponent, resourceInstance, user);
 
-        } finally {
+        }catch (ComponentException e){
+            throw e;
+        }
+    }
+
+    private ComponentInstance createComponent(boolean needLock, Component containerComponent, Component origComponent, ComponentInstance resourceInstance, User user) {
+
+        boolean failed = false;
+        try {
+
+            ComponentInstance lockComponent = isNeedLock(needLock, containerComponent);
+            if (lockComponent != null) {
+                return lockComponent;
+            }
+            log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
+            return createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
             if (needLock)
-                unlockComponent(resultOp, containerComponent);
+                unlockComponent(failed, containerComponent);
+        }
+    }
+
+    private void overrideFields(Component origComponent, ComponentInstance resourceInstance) {
+        resourceInstance.setComponentVersion(origComponent.getVersion());
+        resourceInstance.setIcon(origComponent.getIcon());
+    }
+
+    private void validateInstanceName(ComponentInstance resourceInstance) {
+
+        String resourceInstanceName = resourceInstance.getName();
+        if (StringUtils.isEmpty(resourceInstanceName)) {
+            log.debug("ComponentInstance name is empty");
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
+        }
+
+        if (!ValidationUtils.validateComponentNameLength(resourceInstanceName)) {
+            log.debug("ComponentInstance name exceeds max length {} ", ValidationUtils.COMPONENT_NAME_MAX_LENGTH);
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
+        }
+
+        if (!ValidationUtils.validateComponentNamePattern(resourceInstanceName)) {
+            log.debug("ComponentInstance name {} has invalid format", resourceInstanceName);
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_COMPONENT_NAME, resourceInstance.getName());
+        }
+    }
+
+    private void validateResourceInstanceState(Component containerComponent, Component origComponent) {
+        if (origComponent.getLifecycleState() == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT){
+            throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
+                    containerComponent.getComponentType().getValue(), origComponent.getLifecycleState().toString());
+        }
+    }
+
+    private void validateOriginAndResourceInstanceTypes(Component containerComponent, Component origComponent, OriginTypeEnum originType) {
+        ResourceTypeEnum resourceType = null;
+        ResourceTypeEnum convertedOriginType;
+        resourceType = getResourceTypeEnumFromOriginComponent(origComponent, resourceType);
+        validateOriginType(originType, resourceType);
+        validateOriginComponentIsValidForContainer(containerComponent, resourceType);
+    }
+
+    private void validateOriginComponentIsValidForContainer(Component containerComponent, ResourceTypeEnum resourceType) {
+        switch (containerComponent.getComponentType()) {
+            case SERVICE:
+                if (!containerInstanceTypesData.getServiceContainerList().contains((resourceType))) {
+                    throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
+                            containerComponent.getComponentType().toString(), resourceType.name());
+                }
+                break;
+            case RESOURCE:
+                if (!containerInstanceTypesData.getValidInstanceTypesInResourceContainer().get(((Resource) containerComponent).getResourceType()).contains(resourceType)) {
+                    throw new ByActionStatusComponentException(ActionStatus.CONTAINER_CANNOT_CONTAIN_INSTANCE,
+                            containerComponent.getComponentType().toString(), resourceType.name());
+                }
+                break;
+            default:
+                throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
+        }
+    }
+
+    private void validateOriginType(OriginTypeEnum originType, ResourceTypeEnum resourceType) {
+        ResourceTypeEnum convertedOriginType;
+        try {
+            convertedOriginType = ResourceTypeEnum.getTypeIgnoreCase(originType.name());
+        }
+        catch (Exception e){
+            throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
+        }
+
+        if (resourceType != convertedOriginType)  throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
+    }
+
+    private ResourceTypeEnum getResourceTypeEnumFromOriginComponent(Component origComponent, ResourceTypeEnum resourceType) {
+        switch (origComponent.getComponentType()) {
+            case SERVICE:
+                resourceType = ResourceTypeEnum.ServiceProxy;
+                break;
+            case RESOURCE:
+                resourceType = ((Resource) origComponent).getResourceType();
+                break;
+            default:
+                throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT);
         }
+        return resourceType;
+    }
+
+    private ComponentInstance isNeedLock(boolean needLock, Component containerComponent) {
+        if (needLock) {
+            lockComponent(containerComponent, "createComponentInstance");
+        }
+        return null;
+    }
+
+    private boolean isServiceProxyOrigin(Either<Component, StorageOperationStatus> serviceProxyOrigin) {
+        if (serviceProxyOrigin.isRight()) {
+            log.debug("Failed to fetch normative service proxy resource by tosca name, error {}", serviceProxyOrigin.right().value());
+            return true;
+        }
+        return false;
     }
 
     private StorageOperationStatus fillProxyInstanceData(ComponentInstance resourceInstance, Component proxyTemplate) {
@@ -409,7 +512,6 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         resourceInstance.setCapabilities(capabilities);
         Map<String, List<RequirementDefinition>> req = service.getRequirements();
         resourceInstance.setRequirements(req);
-
         Map<String, InterfaceDefinition> serviceInterfaces = service.getInterfaces();
         if(MapUtils.isNotEmpty(serviceInterfaces)) {
             serviceInterfaces.forEach(resourceInstance::addInterface);
@@ -421,7 +523,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         List<InputDefinition> serviceInputs = service.getInputs();
         resourceInstance.setInputs(serviceInputs);
 
-        String name = service.getNormalizedName() + ToscaOperationFacade.PROXY_SUFFIX;
+        String name = ValidationUtils.normalizeComponentInstanceName(service.getName()) + ToscaOperationFacade.PROXY_SUFFIX;
         String toscaResourceName = ((Resource) proxyTemplate).getToscaResourceName();
         int lastIndexOf = toscaResourceName.lastIndexOf('.');
         if (lastIndexOf != -1) {
@@ -447,64 +549,34 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         ComponentInstance resourceInstance = createAndAssotiateInfo.getNode();
         RequirementCapabilityRelDef associationInfo = createAndAssotiateInfo.getAssociate();
 
-        User user = validateUserExists(userId, "create And Associate RI To RI", false);
+        User user = validateUserExists(userId);
 
-        Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-        if (validateComponentType.isRight()) {
-            return Either.right(validateComponentType.right().value());
-        }
+        final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
 
-        final ComponentTypeEnum containerComponentType = validateComponentType.left().value();
-
-        Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(containerComponentId, containerComponentType, null);
-        if (validateComponentExists.isRight()) {
-            return Either.right(validateComponentExists.right().value());
-        }
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists.left().value();
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
 
         if (ModelConverter.isAtomicComponent(containerComponent)) {
             log.debug("Cannot attach resource instances to container resource of type {}", containerComponent.assetType());
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_CANNOT_CONTAIN_RESOURCE_INSTANCES, containerComponent.assetType()));
         }
 
-        Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-        if (validateCanWorkOnComponent.isRight()) {
-            return Either.right(validateCanWorkOnComponent.right().value());
-        }
-
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "createAndAssociateRIToRI");
-        if (lockComponent.isRight()) {
-            return Either.right(lockComponent.right().value());
-        }
+        validateCanWorkOnComponent(containerComponent, userId);
 
+        boolean failed = false;
         try {
+            lockComponent(containerComponent, "createAndAssociateRIToRI");
             log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
-            Either<Component, ResponseFormat> eitherResourceName = getOriginComponentFromComponentInstance(resourceInstance);
-
-            if (eitherResourceName.isRight()) {
-                resultOp = Either.right(eitherResourceName.right().value());
-                return resultOp;
-            }
-            Component origComponent = eitherResourceName.left().value();
-
-            Either<ComponentInstance, ResponseFormat> result = createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
-            if (result.isRight()) {
-                log.debug("Failed to create resource instance {}", containerComponentId);
-                resultOp = Either.right(result.right().value());
-                return resultOp;
-
-            }
+            Component origComponent = getOriginComponentFromComponentInstance(resourceInstance);
 
             log.debug(ENTITY_ON_GRAPH_IS_CREATED);
-            ComponentInstance resResourceInfo = result.left().value();
+            ComponentInstance resResourceInfo = createComponentInstanceOnGraph(containerComponent, origComponent, resourceInstance, user);
             if (associationInfo.getFromNode() == null || associationInfo.getFromNode().isEmpty()) {
                 associationInfo.setFromNode(resResourceInfo.getUniqueId());
             } else {
                 associationInfo.setToNode(resResourceInfo.getUniqueId());
             }
 
-            RequirementCapabilityRelDef requirementCapabilityRelDef = associationInfo;
-            Either<RequirementCapabilityRelDef, StorageOperationStatus> resultReqCapDef = toscaOperationFacade.associateResourceInstances(containerComponentId, requirementCapabilityRelDef);
+            Either<RequirementCapabilityRelDef, StorageOperationStatus> resultReqCapDef = toscaOperationFacade.associateResourceInstances(containerComponent, containerComponentId, associationInfo);
             if (resultReqCapDef.isLeft()) {
                 log.debug(ENTITY_ON_GRAPH_IS_CREATED);
                 RequirementCapabilityRelDef resReqCapabilityRelDef = resultReqCapDef.left().value();
@@ -518,61 +590,53 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                 return resultOp;
             }
 
-        } finally {
-            unlockComponent(resultOp, containerComponent);
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
+            unlockComponent(failed, containerComponent);
         }
     }
 
-    private Either<Component, ResponseFormat> getOriginComponentFromComponentInstance(ComponentInstance componentInstance) {
+    private Component getOriginComponentFromComponentInstance(ComponentInstance componentInstance) {
         return getOriginComponentFromComponentInstance(componentInstance.getName(), componentInstance.getComponentUid());
     }
 
-    private Either<Component, ResponseFormat> getInstanceOriginNode(ComponentInstance componentInstance) {
+    private Component getInstanceOriginNode(ComponentInstance componentInstance) {
         return getOriginComponentFromComponentInstance(componentInstance.getName(), componentInstance.getActualComponentUid());
     }
 
-    private Either<Component, ResponseFormat> getOriginComponentFromComponentInstance(String componentInstanceName, String origComponetId) {
-        Either<Component, ResponseFormat> eitherResponse;
+    private Component getOriginComponentFromComponentInstance(String componentInstanceName, String origComponetId) {
         Either<Component, StorageOperationStatus> eitherComponent = toscaOperationFacade.getToscaFullElement(origComponetId);
         if (eitherComponent.isRight()) {
             log.debug("Failed to get origin component with id {} for component instance {} ", origComponetId, componentInstanceName);
-            eitherResponse = Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponse(eitherComponent.right().value(), ComponentTypeEnum.RESOURCE), "", null));
-        } else {
-            eitherResponse = Either.left(eitherComponent.left().value());
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(eitherComponent.right().value(), ComponentTypeEnum.RESOURCE), "", null);
         }
-        return eitherResponse;
+        return eitherComponent.left().value();
     }
 
-    private Either<ComponentInstance, ResponseFormat> createComponentInstanceOnGraph(org.openecomp.sdc.be.model.Component containerComponent, Component originComponent, ComponentInstance componentInstance, User user) {
+    private ComponentInstance createComponentInstanceOnGraph(org.openecomp.sdc.be.model.Component containerComponent, Component originComponent, ComponentInstance componentInstance, User user) {
         Either<ComponentInstance, ResponseFormat> resultOp;
 
         Either<ImmutablePair<Component, String>, StorageOperationStatus> result = toscaOperationFacade.addComponentInstanceToTopologyTemplate(containerComponent, originComponent, componentInstance, false, user);
 
         if (result.isRight()) {
             log.debug(FAILED_TO_CREATE_ENTRY_ON_GRAPH_FOR_COMPONENT_INSTANCE, componentInstance.getName());
-            resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), "", null));
-            return resultOp;
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), "", null));
         }
 
         log.debug(ENTITY_ON_GRAPH_IS_CREATED);
         Component updatedComponent = result.left().value().getLeft();
         Map<String, String> existingEnvVersions = new HashMap<>();
         // TODO existingEnvVersions ??
-        Either<ActionStatus, ResponseFormat> addComponentInstanceArtifacts = addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
-        if (addComponentInstanceArtifacts.isRight()) {
-            log.debug("Failed to create component instance {}", componentInstance.getName());
-            resultOp = Either.right(addComponentInstanceArtifacts.right().value());
-            return resultOp;
-        }
+        addComponentInstanceArtifacts(updatedComponent, componentInstance, originComponent, user, existingEnvVersions);
 
         Optional<ComponentInstance> updatedInstanceOptional = updatedComponent.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(result.left().value().getRight())).findFirst();
         if (!updatedInstanceOptional.isPresent()) {
             log.debug("Failed to fetch new added component instance {} from component {}", componentInstance.getName(), containerComponent.getName());
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName()));
-            return resultOp;
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
         }
-        resultOp = Either.left(updatedInstanceOptional.get());
-        return resultOp;
+        return updatedInstanceOptional.get();
     }
 
   public boolean isCloudSpecificArtifact(String artifact) {
@@ -598,14 +662,13 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
      * @param existingEnvVersions
      * @return
      */
-    protected Either<ActionStatus, ResponseFormat> addComponentInstanceArtifacts(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance componentInstance, org.openecomp.sdc.be.model.Component originComponent, User user,    Map<String, String> existingEnvVersions) {
+    protected ActionStatus addComponentInstanceArtifacts(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance componentInstance, org.openecomp.sdc.be.model.Component originComponent, User user,    Map<String, String> existingEnvVersions) {
 
         log.debug("add artifacts to resource instance");
         List<GroupDefinition> filteredGroups = null;
         ActionStatus status = setResourceArtifactsOnResourceInstance(componentInstance);
-        if (!ActionStatus.OK.equals(status)) {
-            ResponseFormat resultOp = componentsUtils.getResponseFormatForResourceInstance(status, "", null);
-            return Either.right(resultOp);
+        if (ActionStatus.OK != status) {
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(status, "", null));
         }
         StorageOperationStatus artStatus;
         // generate heat_env if necessary
@@ -614,22 +677,23 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
             Map<String, ArtifactDefinition> finalDeploymentArtifacts = new HashMap<>();
             Map<String, List<ArtifactDefinition>> groupInstancesArtifacts = new HashMap<>();
-
+            Integer defaultHeatTimeout = ConfigurationManager.getConfigurationManager().getConfiguration()
+                    .getHeatArtifactDeploymentTimeout().getDefaultMinutes();
             for (ArtifactDefinition artifact : componentDeploymentArtifacts.values()) {
                 String type = artifact.getArtifactType();
                 if (!type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_ENV.getType())) {
                     finalDeploymentArtifacts.put(artifact.getArtifactLabel(), artifact);
                 }
-                if (!(type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT.getType()))) {
+                if (type.equalsIgnoreCase(ArtifactTypeEnum.HEAT.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_NET.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType()) || type.equalsIgnoreCase(ArtifactTypeEnum.CLOUD_TECHNOLOGY_SPECIFIC_ARTIFACT.getType())) {
+                    artifact.setTimeout(defaultHeatTimeout);
+                } else {
                     continue;
                 }
                 if (artifact.checkEsIdExist()) {
-                    Either<ArtifactDefinition, ResponseFormat> createHeatEnvPlaceHolder = artifactBusinessLogic.createHeatEnvPlaceHolder(artifact, ArtifactsBusinessLogic.HEAT_ENV_NAME, componentInstance.getUniqueId(), NodeTypeEnum.ResourceInstance,
-                            componentInstance.getName(), user, containerComponent, existingEnvVersions);
-                    if (createHeatEnvPlaceHolder.isRight()) {
-                        return Either.right(createHeatEnvPlaceHolder.right().value());
-                    }
-                    ArtifactDefinition artifactDefinition = createHeatEnvPlaceHolder.left().value();
+                    ArtifactDefinition artifactDefinition = artifactBusinessLogic.createHeatEnvPlaceHolder(new ArrayList<>(),
+                            artifact, ArtifactsBusinessLogic.HEAT_ENV_NAME, componentInstance.getUniqueId(),
+                            NodeTypeEnum.ResourceInstance, componentInstance.getName(), user, containerComponent,
+                            existingEnvVersions);
                     // put env
                     finalDeploymentArtifacts.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
 
@@ -637,37 +701,25 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                         filteredGroups = originComponent.getGroups().stream().filter(g -> g.getType().equals(VF_MODULE)).collect(Collectors.toList());
                     }
                     if (CollectionUtils.isNotEmpty(filteredGroups)) {
-                        for (GroupDefinition groupInstance : filteredGroups) {
-                            Optional<String> op = groupInstance.getArtifacts().stream().filter(p -> p.equals(artifactDefinition.getGeneratedFromId())).findAny();
-                            if (op.isPresent()) {
-                                List<ArtifactDefinition> artifactsUid;
-                                if (groupInstancesArtifacts.containsKey(groupInstance.getUniqueId())) {
-                                    artifactsUid = groupInstancesArtifacts.get(groupInstance.getUniqueId());
-                                } else {
-                                    artifactsUid = new ArrayList<>();
-                                }
-                                artifactsUid.add(artifactDefinition);
-                                groupInstancesArtifacts.put(groupInstance.getUniqueId(), artifactsUid);
-                                break;
-                            }
-
-                            if (isCloudSpecificArtifact(artifactDefinition.getArtifactName())) {
-                                groupInstance.getArtifacts().add(artifactDefinition.getGeneratedFromId());
-                            }
-                        }
+                        filteredGroups.stream().filter(g ->
+                                g.getArtifacts()
+                                        .stream()
+                                        .anyMatch(p -> p.equals(artifactDefinition.getGeneratedFromId())))
+                                .findFirst()
+                                .ifPresent(g -> fillInstanceArtifactMap(groupInstancesArtifacts, artifactDefinition, g));
                     }
                 }
             }
             artStatus = toscaOperationFacade.addDeploymentArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, finalDeploymentArtifacts);
             if (artStatus != StorageOperationStatus.OK) {
                 log.debug("Failed to add instance deployment artifacts for instance {} in conatiner {} error {}", componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
-                return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
+                throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
 
             }
             StorageOperationStatus result = toscaOperationFacade.addGroupInstancesToComponentInstance(containerComponent, componentInstance, filteredGroups, groupInstancesArtifacts);
             if (result != StorageOperationStatus.OK) {
                 log.debug("failed to update group instance for component instance {}", componentInstance.getUniqueId());
-                return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(result)));
+                throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(result)));
             }
             componentInstance.setDeploymentArtifacts(finalDeploymentArtifacts);
         }
@@ -675,20 +727,35 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         artStatus = toscaOperationFacade.addInformationalArtifactsToInstance(containerComponent.getUniqueId(), componentInstance, originComponent.getArtifacts());
         if (artStatus != StorageOperationStatus.OK) {
             log.debug("Failed to add informational artifacts to the instance {} belonging to the conatiner {}. Status is {}", componentInstance.getUniqueId(), containerComponent.getUniqueId(), artStatus);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(artStatus, false)));
 
         }
         componentInstance.setArtifacts(originComponent.getArtifacts());
-        return Either.left(ActionStatus.OK);
+        return ActionStatus.OK;
+    }
+
+    private void fillInstanceArtifactMap(Map<String, List<ArtifactDefinition>> groupInstancesArtifacts, ArtifactDefinition artifactDefinition, GroupDefinition groupInstance) {
+        List<ArtifactDefinition> artifactsUid;
+        if (groupInstancesArtifacts.containsKey(groupInstance.getUniqueId())) {
+            artifactsUid = groupInstancesArtifacts.get(groupInstance.getUniqueId());
+        } else {
+            artifactsUid = new ArrayList<>();
+        }
+        artifactsUid.add(artifactDefinition);
+        groupInstancesArtifacts.put(groupInstance.getUniqueId(), artifactsUid);
+        if (isCloudSpecificArtifact(artifactDefinition.getArtifactName())) {
+            groupInstance.getArtifacts().add(artifactDefinition.getGeneratedFromId());
+        }
     }
 
     private ActionStatus setResourceArtifactsOnResourceInstance(ComponentInstance resourceInstance) {
-        Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getResourceDeploymentArtifacts = artifactBusinessLogic.getArtifacts(resourceInstance.getComponentUid(), NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null);
+        Either<Map<String, ArtifactDefinition>, StorageOperationStatus> getResourceDeploymentArtifacts =
+                artifactBusinessLogic.getArtifacts(resourceInstance.getComponentUid(), NodeTypeEnum.Resource, ArtifactGroupTypeEnum.DEPLOYMENT, null);
 
         Map<String, ArtifactDefinition> deploymentArtifacts = new HashMap<>();
         if (getResourceDeploymentArtifacts.isRight()) {
             StorageOperationStatus status = getResourceDeploymentArtifacts.right().value();
-            if (!status.equals(StorageOperationStatus.NOT_FOUND)) {
+            if (status != StorageOperationStatus.NOT_FOUND) {
                 log.debug("Failed to fetch resource: {} artifacts. status is {}", resourceInstance.getComponentUid(), status);
                 return componentsUtils.convertFromStorageResponseForResourceInstance(status, true);
             }
@@ -711,119 +778,78 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     }
 
     public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance componentInstance) {
-        return updateComponentInstanceMetadata(containerComponentParam, containerComponentId, componentInstanceId, userId, componentInstance, false, true, true);
+        return updateComponentInstanceMetadata(containerComponentParam, containerComponentId, componentInstanceId, userId, componentInstance, false, true);
     }
 
     public Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance componentInstance, boolean inTransaction,
-                                                                                     boolean needLock, boolean createNewTransaction) {
+                                                                                     boolean needLock) {
 
-        validateUserExists(userId, "update Component Instance", inTransaction);
+        validateUserExists(userId);
 
-        Either<ComponentInstance, ResponseFormat> resultOp = null;
+        final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
 
-        Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-        if (validateComponentType.isRight()) {
-            return Either.right(validateComponentType.right().value());
-        }
-
-        final ComponentTypeEnum containerComponentType = validateComponentType.left().value();
-
-        Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(containerComponentId, containerComponentType, null);
-        if (validateComponentExists.isRight()) {
-            return Either.right(validateComponentExists.right().value());
-        }
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists.left().value();
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
 
-        Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-        if (validateCanWorkOnComponent.isRight()) {
-            return Either.right(validateCanWorkOnComponent.right().value());
-        }
+        validateCanWorkOnComponent(containerComponent, userId);
         ComponentTypeEnum instanceType = getComponentType(containerComponentType);
         Either<Boolean, StorageOperationStatus> validateParentStatus = toscaOperationFacade.validateComponentExists(componentInstance.getComponentUid());
         if (validateParentStatus.isRight()) {
             log.debug("Failed to get component instance {} on service {}", componentInstanceId, containerComponentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND, componentInstance.getName(), instanceType.getValue().toLowerCase()));
-            return resultOp;
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND, componentInstance.getName(), instanceType.getValue().toLowerCase());
         }
         if (!validateParentStatus.left().value()) {
-            resultOp = Either.right(
-                    componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(), instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(), containerComponentId));
-            return resultOp;
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(), instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(), containerComponentId);
         }
 
         if (needLock) {
-            Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "updateComponentInstance");
-            if (lockComponent.isRight()) {
-                return Either.right(lockComponent.right().value());
-            }
+            lockComponent(containerComponent, "updateComponentInstance");
         }
+        Component origComponent;
+        boolean failed = false;
         try {
-
-            Either<Component, ResponseFormat> eitherResourceName = getOriginComponentFromComponentInstance(componentInstance);
-
-            if (eitherResourceName.isRight()) {
-                resultOp = Either.right(eitherResourceName.right().value());
-                return resultOp;
+            origComponent = getOriginComponentFromComponentInstance(componentInstance);
+            componentInstance = updateComponentInstanceMetadata(containerComponent, containerComponentType, origComponent, componentInstanceId, componentInstance);
+        }catch (ComponentException e) {
+            failed = true;
+            throw e;
+        }finally {
+            if (needLock) {
+                unlockComponent(failed, containerComponent);
             }
-            Component origComponent = eitherResourceName.left().value();
-
-            resultOp = updateComponentInstanceMetadata(containerComponent, containerComponentType, origComponent, componentInstanceId, componentInstance);
-            return resultOp;
-
-        } finally {
-            if (needLock)
-                unlockComponent(resultOp, containerComponent);
         }
+        return Either.left(componentInstance);
     }
 
     // New Multiple Instance Update API
-    public Either<List<ComponentInstance>, ResponseFormat> updateComponentInstance(String containerComponentParam, String containerComponentId, String userId, List<ComponentInstance> componentInstanceList, boolean needLock) {
+    public List<ComponentInstance> updateComponentInstance(String containerComponentParam, Component containerComponent, String containerComponentId, String userId, List<ComponentInstance> componentInstanceList, boolean needLock) {
 
-        Either<List<ComponentInstance>, ResponseFormat> resultOp = null;
-        org.openecomp.sdc.be.model.Component containerComponent = null;
+        boolean failed = false;
         try {
-            validateUserExists(userId, "update Component Instance", true);
-
-            Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-            if (validateComponentType.isRight()) {
-                return Either.right(validateComponentType.right().value());
-            }
-
-            final ComponentTypeEnum containerComponentType = validateComponentType.left().value();
+            validateUserExists(userId);
 
+            final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
             ComponentParametersView componentFilter = new ComponentParametersView();
             componentFilter.disableAll();
             componentFilter.setIgnoreUsers(false);
             componentFilter.setIgnoreComponentInstances(false);
-            Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExistsByFilter(containerComponentId, containerComponentType, componentFilter);
-            if (validateComponentExists.isRight()) {
-                return Either.right(validateComponentExists.right().value());
-            }
-
-            containerComponent = validateComponentExists.left().value();
-
-            Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-            if (validateCanWorkOnComponent.isRight()) {
-                return Either.right(validateCanWorkOnComponent.right().value());
+            if (containerComponent == null) {
+                containerComponent = validateComponentExistsByFilter(containerComponentId, containerComponentType, componentFilter);
             }
+            validateCanWorkOnComponent(containerComponent, userId);
 
             ComponentTypeEnum instanceType = getComponentType(containerComponentType);
 
             for (ComponentInstance componentInstance : componentInstanceList) {
                 boolean validateParent = validateParent(containerComponent, componentInstance.getUniqueId());
                 if (!validateParent) {
-                    resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(), instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(),
-                            containerComponentId));
-                    return resultOp;
+                    throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName(),
+                            instanceType.getValue().toLowerCase(), containerComponentType.getValue().toLowerCase(),
+                            containerComponentId);
                 }
             }
 
             if (needLock) {
-
-                Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "updateComponentInstance");
-                if (lockComponent.isRight()) {
-                    return Either.right(lockComponent.right().value());
-                }
+                lockComponent(containerComponent, "updateComponentInstance");
             }
 
             List<ComponentInstance> updatedList = new ArrayList<>();
@@ -843,8 +869,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                         Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, origInst, updatedCi.getName());
                         if (!isUniqueName) {
                             CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update the name of the component instance {} to {}. A component instance with the same name already exists. ", origInst.getName(), updatedCi.getName());
-                            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), origInst.getName()));
-                            return resultOp;
+                            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), origInst.getName()));
                         }
                         listForUpdate.add(updatedCi);
                     } else
@@ -852,28 +877,26 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                 }
                 containerComponent.setComponentInstances(listForUpdate);
 
-                if (resultOp == null) {
-                    Either<Component, StorageOperationStatus> updateStatus = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, componentFilter);
-                    if (updateStatus.isRight()) {
-                        CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata belonging to container component {}. Status is {}. ", containerComponent.getName(), updateStatus.right().value());
-                        resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateStatus.right().value(), true), "", null));
-                        return resultOp;
-                    }
-                    for (ComponentInstance updatedInstance : updateStatus.left().value().getComponentInstances()) {
-                        Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getName().equals(updatedInstance.getName())).findAny();
-                        if (op.isPresent()) {
-                            updatedList.add(updatedInstance);
-                        }
+                Either<Component, StorageOperationStatus> updateStatus = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, componentFilter);
+                if (updateStatus.isRight()) {
+                    CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata belonging to container component {}. Status is {}. ", containerComponent.getName(), updateStatus.right().value());
+                    throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateStatus.right().value(), true), "", null));
+                }
+
+                for (ComponentInstance updatedInstance : updateStatus.left().value().getComponentInstances()) {
+                    Optional<ComponentInstance> op = componentInstanceList.stream().filter(ci -> ci.getName().equals(updatedInstance.getName())).findAny();
+                    if (op.isPresent()) {
+                        updatedList.add(updatedInstance);
                     }
                 }
             }
-
-            resultOp = Either.left(updatedList);
-            return resultOp;
-
-        } finally {
+            return updatedList;
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
             if (needLock) {
-                unlockComponent(resultOp, containerComponent);
+                unlockComponent(failed, containerComponent);
             }
         }
     }
@@ -883,94 +906,94 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     }
 
     private ComponentTypeEnum getComponentType(ComponentTypeEnum containerComponentType) {
-        if (ComponentTypeEnum.PRODUCT.equals(containerComponentType)) {
+        if (ComponentTypeEnum.PRODUCT == containerComponentType) {
             return ComponentTypeEnum.SERVICE_INSTANCE;
         } else {
             return ComponentTypeEnum.RESOURCE_INSTANCE;
         }
     }
 
-    private Either<ComponentInstance, ResponseFormat> updateComponentInstanceMetadata(Component containerComponent, ComponentTypeEnum containerComponentType, org.openecomp.sdc.be.model.Component origComponent, String componentInstanceId,
-                                                                                      ComponentInstance componentInstance) {
+    private ComponentInstance updateComponentInstanceMetadata(Component containerComponent, ComponentTypeEnum containerComponentType, org.openecomp.sdc.be.model.Component origComponent, String componentInstanceId,
+                                                              ComponentInstance componentInstance) {
 
-        Either<ComponentInstance, ResponseFormat> resultOp = null;
-        Optional<ComponentInstance> componentInstanceOptional = null;
+        Optional<ComponentInstance> componentInstanceOptional;
         Either<ImmutablePair<Component, String>, StorageOperationStatus> updateRes = null;
         ComponentInstance oldComponentInstance = null;
         boolean isNameChanged = false;
 
-        if (resultOp == null) {
-            componentInstanceOptional = containerComponent.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(componentInstance.getUniqueId())).findFirst();
-            if (!componentInstanceOptional.isPresent()) {
-                CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find the component instance {} in container component {}. ", componentInstance.getName(), containerComponent.getName());
-                resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName()));
-            }
-        }
-        if (resultOp == null) {
-            oldComponentInstance = componentInstanceOptional.get();
-            String newInstanceName = componentInstance.getName();
-            if (oldComponentInstance != null && oldComponentInstance.getName() != null && !oldComponentInstance.getName().equals(newInstanceName))
-                isNameChanged = true;
-            Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, oldComponentInstance, newInstanceName);
-            if (!isUniqueName) {
-                CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update the name of the component instance {} to {}. A component instance with the same name already exists. ", oldComponentInstance.getName(), newInstanceName);
-                resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), componentInstance.getName()));
-            }
-            if(!DirectivesUtils.isValid(componentInstance.getDirectives())) {
-                final String directivesStr =
-                        componentInstance.getDirectives().stream().collect(Collectors.joining(" , ", " [ ", " ] "));
-                CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
-                        "Failed to update the directives of the component instance {} to {}. Directives data {} is invalid. ",
-                        oldComponentInstance.getName(), newInstanceName ,
-                        directivesStr);
-                resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.DIRECTIVES_INVALID_VALUE,
-                        directivesStr));
-            }
+        componentInstanceOptional = containerComponent.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(componentInstance.getUniqueId())).findFirst();
+        if (!componentInstanceOptional.isPresent()) {
+            CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to find the component instance {} in container component {}. ", componentInstance.getName(), containerComponent.getName());
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName());
         }
+        String oldComponentName;
+        oldComponentInstance = componentInstanceOptional.get();
+        oldComponentName = oldComponentInstance.getName();
         String newInstanceName = componentInstance.getName();
-        String oldInstanceName = null;
-        if (resultOp == null) {
-            oldComponentInstance = componentInstanceOptional.get();
-            newInstanceName = componentInstance.getName();
-            updateRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, origComponent, updateComponentInstanceMetadata(oldComponentInstance, componentInstance));
-            if (updateRes.isRight()) {
-                CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata of component instance {} belonging to container component {}. Status is {}. ", componentInstance.getName(), containerComponent.getName(),
-                        updateRes.right().value());
-                resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateRes.right().value(), true), "", null));
-            } else {
-                // region - Update instance Groups
-                if (isNameChanged) {
-                    Either result = toscaOperationFacade.cleanAndAddGroupInstancesToComponentInstance(containerComponent, oldComponentInstance, componentInstanceId);
-                    if (result.isRight())
-                        CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to rename group instances for container {}. error {} ", componentInstanceId, result.right().value());
-                    if (containerComponent instanceof Service) {
-                        Either<ComponentInstance, ResponseFormat> renameEither =
-                                renameServiceFilter((Service) containerComponent, newInstanceName,
-                                        oldInstanceName);
-                        if (renameEither.isRight()) {
-                            return renameEither;
-                        }
+        if (oldComponentName != null && !oldComponentInstance.getName().equals(newInstanceName))
+            isNameChanged = true;
+        Boolean isUniqueName = validateInstanceNameUniquenessUponUpdate(containerComponent, oldComponentInstance, newInstanceName);
+        if (!isUniqueName) {
+            CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update the name of the component instance {} to {}. A component instance with the same name already exists. ", oldComponentInstance.getName(), newInstanceName);
+            throw new ByActionStatusComponentException(ActionStatus.COMPONENT_NAME_ALREADY_EXIST, containerComponentType.getValue(), componentInstance.getName());
+        }
+        if(!DirectivesUtils.isValid(componentInstance.getDirectives())) {
+            final String directivesStr =
+                    componentInstance.getDirectives().stream().collect(Collectors.joining(" , ", " [ ", " ] "));
+            CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG,
+                    "Failed to update the directives of the component instance {} to {}. Directives data {} is invalid. ",
+                    oldComponentInstance.getName(), newInstanceName ,
+                    directivesStr);
+            throw new ByActionStatusComponentException(ActionStatus.DIRECTIVES_INVALID_VALUE, containerComponentType.getValue(), componentInstance.getName());        }
+        updateRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent, origComponent, updateComponentInstanceMetadata(oldComponentInstance, componentInstance));
+        if (updateRes.isRight()) {
+            CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to update metadata of component instance {} belonging to container component {}. Status is {}. ", componentInstance.getName(), containerComponent.getName(),
+                    updateRes.right().value());
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormatForResourceInstance(componentsUtils.convertFromStorageResponseForResourceInstance(updateRes.right().value(), true), "", null));
+        } else {
+            // region - Update instance Groups
+            if (isNameChanged) {
+                Either<StorageOperationStatus, StorageOperationStatus> result =
+                        toscaOperationFacade.cleanAndAddGroupInstancesToComponentInstance(containerComponent, oldComponentInstance, componentInstanceId);
+                if (result.isRight())
+                    CommonUtility.addRecordToLog(log, LogLevelEnum.DEBUG, "Failed to rename group instances for container {}. error {} ", componentInstanceId, result.right().value());
+
+                if (containerComponent instanceof Service){
+                    Either<ComponentInstance, ResponseFormat> renameEither =
+                            renameServiceFilter((Service) containerComponent, newInstanceName,
+                                    oldComponentInstance.getName());
+                    if (renameEither.isRight()) {
+                        throw new ByResponseFormatComponentException(renameEither.right().value());
                     }
+
+                    updateForwardingPathDefinition(containerComponent, componentInstance, oldComponentName);
                 }
-                // endregion
             }
+            // endregion
         }
-        if (resultOp == null) {
-            String newInstanceId = updateRes.left().value().getRight();
-            Optional<ComponentInstance> updatedInstanceOptional = updateRes.left().value().getLeft().getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(newInstanceId)).findFirst();
-
-            if (!updatedInstanceOptional.isPresent()) {
-                log.debug("Failed to update metadata of component instance {} of container component {}", componentInstance.getName(), containerComponent.getName());
-                resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName()));
-            } else {
-                resultOp = Either.left(updatedInstanceOptional.get());
-            }
+        String newInstanceId = updateRes.left().value().getRight();
+        Optional<ComponentInstance> updatedInstanceOptional = updateRes.left().value().getLeft().getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(newInstanceId)).findFirst();
 
+        if (!updatedInstanceOptional.isPresent()) {
+            log.debug("Failed to update metadata of component instance {} of container component {}", componentInstance.getName(), containerComponent.getName());
+            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstance.getName()));
         }
-        if (resultOp == null) {
-            resultOp = Either.left(componentInstanceOptional.get());
-        }
-        return resultOp;
+
+        return componentInstanceOptional.get();
+    }
+
+    private void updateForwardingPathDefinition(Component containerComponent, ComponentInstance componentInstance, String oldComponentName) {
+        Collection<ForwardingPathDataDefinition> forwardingPathDataDefinitions = getForwardingPathDataDefinitions(containerComponent.getUniqueId());
+        Set<ForwardingPathDataDefinition> updated = new ForwardingPathUtils()
+                .updateComponentInstanceName(forwardingPathDataDefinitions, oldComponentName,
+                        componentInstance.getName());
+        updated.forEach(fp -> {
+            Either<ForwardingPathDataDefinition, StorageOperationStatus> resultEither = forwardingPathOperation
+                    .updateForwardingPath(containerComponent.getUniqueId(), fp);
+            if (resultEither.isRight()){
+                CommonUtility.addRecordToLog(log, LogLevelEnum.ERROR, "Failed to rename forwarding path for container {}. error {} ",containerComponent.getName(), resultEither.right().value());
+            }
+        });
     }
 
 
@@ -1023,32 +1046,17 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return oldComponentInstance;
     }
 
-    public Either<ComponentInstance, ResponseFormat> deleteComponentInstance(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId) {
+    public ComponentInstance deleteComponentInstance(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId) {
 
-        validateUserExists(userId, "delete Component Instance", false);
+        validateUserExists(userId);
 
-        Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-        if (validateComponentType.isRight()) {
-            return Either.right(validateComponentType.right().value());
-        }
+        final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
 
-        final ComponentTypeEnum containerComponentType = validateComponentType.left().value();
-        Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(containerComponentId, containerComponentType, null);
-        if (validateComponentExists.isRight()) {
-            return Either.right(validateComponentExists.right().value());
-        }
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists.left().value();
-        Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-        if (validateCanWorkOnComponent.isRight()) {
-            return Either.right(validateCanWorkOnComponent.right().value());
-        }
-
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "deleteComponentInstance");
-        if (lockComponent.isRight()) {
-            return Either.right(lockComponent.right().value());
-        }
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, null);
+        validateCanWorkOnComponent(containerComponent, userId);
 
-        Either<ComponentInstance, ResponseFormat> resultOp = null;
+        boolean failed = false;
+        ComponentInstance deletedRelatedInst;
         try {
             if (containerComponent instanceof Service) {
                 ComponentInstance componentInstance = containerComponent.getComponentInstanceById(componentInstanceId).get();
@@ -1058,29 +1066,32 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                     ActionStatus status = componentsUtils.convertFromStorageResponse(deleteServiceFilterEither.right().value(),
                             containerComponentType);
                     janusGraphDao.rollback();
-                    return Either.right(componentsUtils.getResponseFormat(status, componentInstanceId));
+                    throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(status, componentInstanceId));
                 }
-                resultOp = deleteServiceFiltersRelatedTobeDeletedComponentInstance((Service) containerComponent,
+                Either<ComponentInstance, ResponseFormat> resultOp = deleteServiceFiltersRelatedTobeDeletedComponentInstance((Service) containerComponent,
                         componentInstance, ComponentTypeEnum.SERVICE, userId);
                 if (resultOp.isRight()) {
                     janusGraphDao.rollback();
-                    return resultOp;
+                    throw new ByResponseFormatComponentException(resultOp.right().value());
                 }
             }
-            resultOp = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
-            if (resultOp.isRight()){
-                return resultOp;
-            }
-            Either<ComponentInstance, ResponseFormat> deleteEither = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
-                    containerComponentType, resultOp);
-            if (deleteEither.isRight()){
-                return deleteEither;
-            }
-            return deleteEither;
+            lockComponent(containerComponent, "deleteComponentInstance");
+            ComponentInstance deletedCompInstance = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
 
-        } finally {
-            unlockComponent(resultOp, containerComponent);
+            deletedRelatedInst = deleteForwardingPathsRelatedTobeDeletedComponentInstance(containerComponentId,
+                    containerComponentType, deletedCompInstance);
+            ActionStatus onDeleteOperationsStatus = onChangeInstanceOperationOrchestrator.doOnDeleteInstanceOperations(containerComponent, componentInstanceId);
+            if (ActionStatus.OK != onDeleteOperationsStatus) {
+                throw new ByActionStatusComponentException(onDeleteOperationsStatus);
+            }
+        } catch (ComponentException e) {
+            failed = true;
+            throw e;
+        }
+        finally {
+            unlockComponent(failed, containerComponent);
         }
+        return deletedRelatedInst;
     }
 
     public Either<ComponentInstance, ResponseFormat> deleteServiceFiltersRelatedTobeDeletedComponentInstance(
@@ -1112,7 +1123,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                     ci.setDirectives(directives);
                     final Either<ComponentInstance, ResponseFormat> componentInstanceResponseFormatEither =
                             updateComponentInstanceMetadata(ComponentTypeEnum.SERVICE_PARAM_NAME, service.getUniqueId(),
-                                    ci.getUniqueId(), userId, ci, true, false, false);
+                                    ci.getUniqueId(), userId, ci, true, false);
                     if (componentInstanceResponseFormatEither.isRight()) {
                         return componentInstanceResponseFormatEither;
                     }
@@ -1137,45 +1148,37 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     }
 
 
-    public Either<ComponentInstance, ResponseFormat> deleteForwardingPathsRelatedTobeDeletedComponentInstance(String containerComponentId, ComponentTypeEnum containerComponentType,
-                                                                                                              Either<ComponentInstance, ResponseFormat> resultOp) {
-        if(containerComponentType.equals(ComponentTypeEnum.SERVICE) && resultOp.isLeft() ){
-            final ComponentInstance componentInstance = resultOp.left().value();
+    ComponentInstance deleteForwardingPathsRelatedTobeDeletedComponentInstance(String containerComponentId,
+                                                                               ComponentTypeEnum containerComponentType, ComponentInstance componentInstance) {
+        if(containerComponentType == ComponentTypeEnum.SERVICE){
             List<String> pathIDsToBeDeleted = getForwardingPathsRelatedToComponentInstance(containerComponentId, componentInstance.getName());
             if (!pathIDsToBeDeleted.isEmpty()) {
-                Either<Set<String>, ResponseFormat> deleteForwardingPathsEither = deleteForwardingPaths(containerComponentId,
-                        pathIDsToBeDeleted);
-                if(deleteForwardingPathsEither.isRight()) {
-                    resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-                }
-
+                deleteForwardingPaths(containerComponentId, pathIDsToBeDeleted);
             }
         }
-        return resultOp;
+        return componentInstance;
     }
 
 
-    private Either<Set<String>, ResponseFormat> deleteForwardingPaths(String serviceId,  List<String> pathIdsToDelete){
+
+
+
+    private void deleteForwardingPaths(String serviceId,  List<String> pathIdsToDelete){
 
         Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
         if(storageStatus.isRight()) {
-            return Either.right(componentsUtils.getResponseFormat(storageStatus.right().value()));
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageStatus.right().value()));
         }
         Either<Set<String>, StorageOperationStatus> result = forwardingPathOperation.deleteForwardingPath(storageStatus.left().value(),
                 Sets.newHashSet(pathIdsToDelete));
 
         if(result.isRight()) {
-            return Either.right(componentsUtils.getResponseFormat(result.right().value()));
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(result.right().value()));
         }
-        return  Either.left(result.left().value());
     }
 
     private List<String> getForwardingPathsRelatedToComponentInstance(String containerComponentId, String componentInstanceId){
-        ComponentParametersView filter = new ComponentParametersView(true);
-        filter.setIgnoreForwardingPath(false);
-        Either<Service, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade
-                .getToscaElement(containerComponentId, filter);
-        Collection<ForwardingPathDataDefinition> allPaths = forwardingPathOrigin.left().value().getForwardingPaths().values();
+        Collection<ForwardingPathDataDefinition> allPaths = getForwardingPathDataDefinitions(containerComponentId);
         List<String> pathIDsToBeDeleted = new ArrayList<>();
 
         allPaths.stream().filter(path -> isPathRelatedToComponent(path,componentInstanceId ))
@@ -1184,6 +1187,14 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return pathIDsToBeDeleted;
     }
 
+    private Collection<ForwardingPathDataDefinition> getForwardingPathDataDefinitions(String containerComponentId) {
+        ComponentParametersView filter = new ComponentParametersView(true);
+        filter.setIgnoreForwardingPath(false);
+        Either<Service, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade
+                .getToscaElement(containerComponentId, filter);
+        return forwardingPathOrigin.left().value().getForwardingPaths().values();
+    }
+
     private boolean isPathRelatedToComponent(ForwardingPathDataDefinition pathDataDefinition,
                                              String componentInstanceId){
         return pathDataDefinition.getPathElements().getListToscaDataDefinition()
@@ -1193,49 +1204,28 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     }
 
 
-    private Either<ComponentInstance, ResponseFormat> deleteComponentInstance(Component containerComponent, String componentInstanceId, ComponentTypeEnum containerComponentType) {
-
-        Either<ComponentInstance, ResponseFormat> resultOp = null;
-        ComponentInstance deletedInstance = null;
+    private ComponentInstance deleteComponentInstance(Component containerComponent, String componentInstanceId, ComponentTypeEnum containerComponentType) {
         Either<ImmutablePair<Component, String>, StorageOperationStatus> deleteRes = toscaOperationFacade.deleteComponentInstanceFromTopologyTemplate(containerComponent, componentInstanceId);
-
         if (deleteRes.isRight()) {
             log.debug("Failed to delete entry on graph for resourceInstance {}", componentInstanceId);
             ActionStatus status = componentsUtils.convertFromStorageResponse(deleteRes.right().value(), containerComponentType);
-            resultOp = Either.right(componentsUtils.getResponseFormat(status, componentInstanceId));
-        }
-        if (resultOp == null) {
-            log.debug("The component instance {} has been removed from container component {}. ", componentInstanceId, containerComponent);
-            deletedInstance = findAndRemoveComponentInstanceFromContainerComponent(componentInstanceId, containerComponent);
-            resultOp = Either.left(deletedInstance);
-        }
-        if (resultOp.isLeft() && CollectionUtils.isNotEmpty(containerComponent.getGroups())) {
-            List<GroupDataDefinition> groupsToUpdate = new ArrayList<>();
-            for (GroupDataDefinition currGroup : containerComponent.getGroups()) {
-                Map<String, String> members = currGroup.getMembers();
-                if (members != null && members.containsKey(deletedInstance.getName())) {
-                    members.remove(deletedInstance.getName());
-                    groupsToUpdate.add(currGroup);
-                }
-            }
-            Either<List<GroupDefinition>, StorageOperationStatus> updateGroupsRes = toscaOperationFacade.updateGroupsOnComponent(containerComponent, groupsToUpdate);
-            if (updateGroupsRes.isRight()) {
-                log.debug("Failed to delete component instance {} from group members. ", componentInstanceId);
-                ActionStatus status = componentsUtils.convertFromStorageResponse(updateGroupsRes.right().value(), containerComponentType);
-                resultOp = Either.right(componentsUtils.getResponseFormat(status, componentInstanceId));
-            }
+            throw new ByActionStatusComponentException(status, componentInstanceId);
         }
-        if (resultOp.isLeft() && CollectionUtils.isNotEmpty(containerComponent.getInputs())) {
+        log.debug("The component instance {} has been removed from container component {}. ", componentInstanceId, containerComponent);
+        ComponentInstance deletedInstance = findAndRemoveComponentInstanceFromContainerComponent(componentInstanceId, containerComponent);
+
+        if (CollectionUtils.isNotEmpty(containerComponent.getInputs())) {
             List<InputDefinition> inputsToDelete = containerComponent.getInputs().stream().filter(i -> i.getInstanceUniqueId() != null && i.getInstanceUniqueId().equals(componentInstanceId)).collect(Collectors.toList());
             if (CollectionUtils.isNotEmpty(inputsToDelete)) {
                 StorageOperationStatus deleteInputsRes = toscaOperationFacade.deleteComponentInstanceInputsFromTopologyTemplate(containerComponent, inputsToDelete);
                 if (deleteInputsRes != StorageOperationStatus.OK) {
                     log.debug("Failed to delete inputs of the component instance {} from container component. ", componentInstanceId);
-                    resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(deleteInputsRes, containerComponentType), componentInstanceId));
+                    throw new ByActionStatusComponentException(
+                            componentsUtils.convertFromStorageResponse(deleteInputsRes, containerComponentType), componentInstanceId);
                 }
             }
         }
-        return resultOp;
+        return deletedInstance;
     }
 
     private ComponentInstance findAndRemoveComponentInstanceFromContainerComponent(String componentInstanceId, Component containerComponent) {
@@ -1261,59 +1251,45 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return !relation.getToNode().equals(componentInstanceId) && !relation.getFromNode().equals(componentInstanceId);
     }
 
-    public Either<RequirementCapabilityRelDef, ResponseFormat> associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum) {
-        return associateRIToRI(componentId, userId, requirementDef, componentTypeEnum, false, true, true);
+    public RequirementCapabilityRelDef associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum) {
+        return associateRIToRI(componentId, userId, requirementDef, componentTypeEnum, false, true);
     }
 
-    public Either<RequirementCapabilityRelDef, ResponseFormat> associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum, boolean inTransaction, boolean needLock,
-                                                                               boolean createNewTransaction) {
+    public RequirementCapabilityRelDef associateRIToRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum, boolean inTransaction, boolean needLock) {
 
-        validateUserExists(userId, "associate Ri To RI", inTransaction);
+        validateUserExists(userId);
 
-        Either<RequirementCapabilityRelDef, ResponseFormat> resultOp = null;
+        RequirementCapabilityRelDef requirementCapabilityRelDef = null;
 
-        Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(componentId, componentTypeEnum, null);
-        if (validateComponentExists.isRight()) {
-            return Either.right(validateComponentExists.right().value());
-        }
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists.left().value();
-
-        Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-        if (validateCanWorkOnComponent.isRight()) {
-            return Either.right(validateCanWorkOnComponent.right().value());
-        }
-        if (needLock) {
-            Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "associateRIToRI");
-
-            if (lockComponent.isRight()) {
-                return Either.right(lockComponent.right().value());
-            }
-        }
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
 
+        validateCanWorkOnComponent(containerComponent, userId);
+        boolean failed = false;
         try {
-
-            resultOp = associateRIToRIOnGraph(validateComponentExists.left().value(), requirementDef, componentTypeEnum, inTransaction);
-
-            return resultOp;
-
-        } finally {
+            if (needLock) {
+                lockComponent(containerComponent, "associateRIToRI");
+            }
+            requirementCapabilityRelDef = associateRIToRIOnGraph(containerComponent, requirementDef);
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
             if (needLock)
-                unlockComponent(resultOp, containerComponent);
+                unlockComponent(failed, containerComponent);
         }
+        return requirementCapabilityRelDef;
     }
 
-    public Either<RequirementCapabilityRelDef, ResponseFormat> associateRIToRIOnGraph(Component containerComponent, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum, boolean inTransaction) {
+    public RequirementCapabilityRelDef associateRIToRIOnGraph(Component containerComponent, RequirementCapabilityRelDef requirementDef) {
 
         log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
-        Either<RequirementCapabilityRelDef, ResponseFormat> resultOp = null;
 
-        Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade.associateResourceInstances(containerComponent.getUniqueId(), requirementDef);
+        Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade.associateResourceInstances(null, containerComponent.getUniqueId(), requirementDef);
 
         if (result.isLeft()) {
-            log.debug("Enty on graph is created.");
+            log.debug(ENTITY_ON_GRAPH_IS_CREATED);
             RequirementCapabilityRelDef requirementCapabilityRelDef = result.left().value();
-            resultOp = Either.left(requirementCapabilityRelDef);
-            return resultOp;
+            return requirementCapabilityRelDef;
 
         } else {
             log.debug("Failed to associate node: {} with node {}", requirementDef.getFromNode(), requirementDef.getToNode());
@@ -1331,9 +1307,9 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                 toNameOrId = toResult.left().value().getName();
             }
 
-            resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true), fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRelation().getRequirement()));
-
-            return resultOp;
+            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponseForResourceInstance
+                    (result.right().value(), true), fromNameOrId, toNameOrId,
+                    requirementDef.getRelationships().get(0).getRelation().getRequirement());
         }
 
     }
@@ -1351,112 +1327,71 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             List<RequirementCapabilityRelDef> requirementDefList,
             ComponentTypeEnum componentTypeEnum) {
 
+        validateUserExists(userId);
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
+        validateCanWorkOnComponent(containerComponent, userId);
+        boolean failed = false;
         List<RequirementCapabilityRelDef> delOkResult = new ArrayList<>();
-        Either<Component, ResponseFormat> validateResponse = validateDissociateRI(componentId, userId, componentTypeEnum);
-        if (validateResponse.isRight()) {
-
-            return delOkResult;
-        }
-        Component containerComponent = validateResponse.left().value();
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "associateRIToRI");
-        if (lockComponent.isRight()) {
-            return delOkResult;
-        }
         try {
+            lockComponent(containerComponent, "associateRIToRI");
             for (RequirementCapabilityRelDef requirementDef : requirementDefList) {
-                Either<RequirementCapabilityRelDef, ResponseFormat> actionResponse = dissociateRIFromRI(
-                        componentId, requirementDef, containerComponent);
-
-                if (actionResponse.isLeft()) {
-                    delOkResult.add(actionResponse.left().value());
-                }
+                RequirementCapabilityRelDef requirementCapabilityRelDef = dissociateRIFromRI(
+                        componentId, userId, requirementDef, containerComponent.getComponentType());
+                delOkResult.add(requirementCapabilityRelDef);
             }
-        } finally {
-            unlockComponent(validateResponse, containerComponent);
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
+            unlockComponent(failed, containerComponent);
         }
         return delOkResult;
     }
 
-    public Either<RequirementCapabilityRelDef, ResponseFormat> dissociateRIFromRI(
-            String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum) {
-        Either<Component, ResponseFormat> validateResponse = validateDissociateRI(componentId,  userId,  componentTypeEnum);
-        if(validateResponse.isRight())
-        {
-            return Either.right(validateResponse.right().value());
-        }
-        Either<RequirementCapabilityRelDef, ResponseFormat> actionResponse = null;
-        Component containerComponent = validateResponse.left().value();
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "associateRIToRI");
-        if (lockComponent.isRight()) {
-            return Either.right(lockComponent.right().value());
-        }
-        try {
-            actionResponse = dissociateRIFromRI(
-                    componentId, requirementDef,containerComponent);
-        } finally {
-            unlockComponent(validateResponse, containerComponent);
-        }
-        return actionResponse;
-    }
-
-    private Either<Component, ResponseFormat> validateDissociateRI(
-            String componentId, String userId, ComponentTypeEnum componentTypeEnum) {
-        validateUserExists(userId, "dissociate RI From RI", false);
-
-
-        Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(componentId, componentTypeEnum, null);
-        if (validateComponentExists.isRight()) {
-            return Either.right(validateComponentExists.right().value());
-        }
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists.left().value();
 
-        Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-        if (validateCanWorkOnComponent.isRight()) {
-            return Either.right(validateCanWorkOnComponent.right().value());
-        }
-        return Either.left(containerComponent);
-
-    }
-    private Either<RequirementCapabilityRelDef, ResponseFormat> dissociateRIFromRI(
-            String componentId, RequirementCapabilityRelDef requirementDef, Component containerComponent) {
+    public RequirementCapabilityRelDef dissociateRIFromRI(String componentId, String userId, RequirementCapabilityRelDef requirementDef, ComponentTypeEnum componentTypeEnum) {
+        validateUserExists(userId);
 
         Either<RequirementCapabilityRelDef, ResponseFormat> resultOp = null;
-        log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
-        Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade.dissociateResourceInstances(
-                componentId, requirementDef);
-        if (result.isLeft()) {
-            log.debug("Enty on graph is created.");
-            RequirementCapabilityRelDef requirementCapabilityRelDef = result.left().value();
-            resultOp = Either.left(requirementCapabilityRelDef);
-            return resultOp;
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
 
-        } else {
+        validateCanWorkOnComponent(containerComponent, userId);
+        boolean failed = false;
+        try {
+            lockComponent(containerComponent, "associateRIToRI");
+            log.debug(TRY_TO_CREATE_ENTRY_ON_GRAPH);
+            Either<RequirementCapabilityRelDef, StorageOperationStatus> result = toscaOperationFacade.dissociateResourceInstances(componentId, requirementDef);
+            if (result.isLeft()) {
+                log.debug(ENTITY_ON_GRAPH_IS_CREATED);
+                return result.left().value();
+            } else {
 
-            log.debug("Failed to dissocaite node  {} from node {}", requirementDef.getFromNode(), requirementDef.getToNode());
-            String fromNameOrId = "";
-            String toNameOrId = "";
-            Either<ComponentInstance, StorageOperationStatus> fromResult = getResourceInstanceById(
-                    containerComponent, requirementDef.getFromNode());
-            Either<ComponentInstance, StorageOperationStatus> toResult = getResourceInstanceById(
-                    containerComponent, requirementDef.getToNode());
+                log.debug("Failed to dissocaite node  {} from node {}", requirementDef.getFromNode(), requirementDef.getToNode());
+                String fromNameOrId = "";
+                String toNameOrId = "";
+                Either<ComponentInstance, StorageOperationStatus> fromResult = getResourceInstanceById(containerComponent, requirementDef.getFromNode());
+                Either<ComponentInstance, StorageOperationStatus> toResult = getResourceInstanceById(containerComponent, requirementDef.getToNode());
 
-            toNameOrId = requirementDef.getFromNode();
-            fromNameOrId = requirementDef.getFromNode();
-            if (fromResult.isLeft()) {
-                fromNameOrId = fromResult.left().value().getName();
-            }
-            if (toResult.isLeft()) {
-                toNameOrId = toResult.left().value().getName();
-            }
+                toNameOrId = requirementDef.getFromNode();
+                fromNameOrId = requirementDef.getFromNode();
+                if (fromResult.isLeft()) {
+                    fromNameOrId = fromResult.left().value().getName();
+                }
+                if (toResult.isLeft()) {
+                    toNameOrId = toResult.left().value().getName();
+                }
 
-            resultOp = Either
-                    .right(componentsUtils.getResponseFormat(
-                            componentsUtils.convertFromStorageResponseForResourceInstance(
-                                    result.right().value(), true), fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRelation().getRequirement()));
-            return resultOp;
+                throw new ByActionStatusComponentException(
+                        componentsUtils.convertFromStorageResponseForResourceInstance(result.right().value(), true),
+                        fromNameOrId, toNameOrId, requirementDef.getRelationships().get(0).getRelation().getRequirement());
+            }
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
+            unlockComponent(failed, containerComponent);
         }
     }
-
     /**
      * Allows to get relation contained in specified component according to received Id
      * @param componentId
@@ -1473,23 +1408,14 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = null;
             RequirementCapabilityRelDef foundRelation = null;
 
-            validateUserExists(userId, "get relation by Id", false);
-
-            if(resultOp == null){
-                validateComponentExists = validateComponentExists(componentId, componentTypeEnum, null);
-                if (validateComponentExists.isRight()) {
-                    resultOp = Either.right(validateComponentExists.right().value());
-                }
-            }
-            if(resultOp == null){
-                containerComponent = validateComponentExists.left().value();
-                List<RequirementCapabilityRelDef> requirementCapabilityRelations = containerComponent.getComponentInstancesRelations();
-                foundRelation = findRelation(relationId, requirementCapabilityRelations);
-                if(foundRelation == null){
-                    ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RELATION_NOT_FOUND, relationId, componentId);
-                    log.debug("Relation with id {} was not found on the component", relationId, componentId);
-                    resultOp = Either.right(responseFormat);
-                }
+            validateUserExists(userId);
+            containerComponent = validateComponentExists(componentId, componentTypeEnum, null);
+            List<RequirementCapabilityRelDef> requirementCapabilityRelations = containerComponent.getComponentInstancesRelations();
+            foundRelation = findRelation(relationId, requirementCapabilityRelations);
+            if(foundRelation == null){
+                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.RELATION_NOT_FOUND, relationId, componentId);
+                log.debug("Relation with id {} was not found on the component", relationId, componentId);
+                resultOp = Either.right(responseFormat);
             }
             if(resultOp == null){
                 resultOp = setRelatedCapability(foundRelation, containerComponent);
@@ -1526,7 +1452,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
         if(result == null){
             for(List<RequirementDefinition> requirements : instance.get().getRequirements().values()){
-                foundRequirement = requirements.stream().filter(r -> isBelongingRequirement(relationshipInfo, r)).findFirst();
+                foundRequirement = requirements.stream().filter(r -> isBelongingCalcRequirement(relationshipInfo, r, containerComponent.getLifecycleState())).findFirst();
                 if(foundRequirement.isPresent()){
                     foundRelation.resolveSingleRelationship().setRequirement(foundRequirement.get());
                     result = Either.left(foundRelation);
@@ -1534,7 +1460,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             }
         }
         if(result == null){
-            Either<RequirementDataDefinition, StorageOperationStatus> getfulfilledRequirementRes = toscaOperationFacade.getFulfilledRequirementByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, (rel, req)->isBelongingRequirement(rel, req));
+            Either<RequirementDataDefinition, StorageOperationStatus> getfulfilledRequirementRes = toscaOperationFacade.getFulfilledRequirementByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, this::isBelongingFullRequirement);
             if(getfulfilledRequirementRes.isRight()){
                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.REQUIREMENT_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getRequirement(), instanceId, containerComponent.getUniqueId());
                 log.debug("Requirement {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
@@ -1549,12 +1475,18 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return result;
     }
 
-    private boolean isBelongingRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req) {
+    private boolean isBelongingFullRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req) {
         return  req.getName().equals(relationshipInfo.getRequirement()) &&
                 req.getUniqueId().equals(relationshipInfo.getRequirementUid()) &&
                 req.getOwnerId().equals(relationshipInfo.getRequirementOwnerId());
     }
 
+    private boolean isBelongingCalcRequirement(RelationshipInfo relationshipInfo, RequirementDataDefinition req, LifecycleStateEnum state) {
+        return  nameMatches(relationshipInfo.getRequirement(), req.getName(), req.getPreviousName(), state) &&
+                req.getUniqueId().equals(relationshipInfo.getRequirementUid()) &&
+                req.getOwnerId().equals(relationshipInfo.getRequirementOwnerId());
+    }
+
     private Either<RequirementCapabilityRelDef, ResponseFormat> setRelatedCapability(RequirementCapabilityRelDef foundRelation, Component containerComponent) {
         Either<RequirementCapabilityRelDef, ResponseFormat> result = null;
         RelationshipInfo relationshipInfo = foundRelation.resolveSingleRelationship().getRelation();
@@ -1568,7 +1500,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
         if(result == null){
             for(List<CapabilityDefinition> capabilities : instance.get().getCapabilities().values()){
-                foundCapability = capabilities.stream().filter(c -> isBelongingCapability(relationshipInfo, c)).findFirst();
+                foundCapability = capabilities.stream().filter(c -> isBelongingCalcCapability(relationshipInfo, c, containerComponent.getLifecycleState())).findFirst();
                 if(foundCapability.isPresent()){
                     foundRelation.resolveSingleRelationship().setCapability(foundCapability.get());
                     result = Either.left(foundRelation);
@@ -1577,7 +1509,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
         if(result == null){
             Either<CapabilityDataDefinition, StorageOperationStatus> getfulfilledRequirementRes =
-                    toscaOperationFacade.getFulfilledCapabilityByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, (rel, cap)->isBelongingCapability(rel, cap));
+                    toscaOperationFacade.getFulfilledCapabilityByRelation(containerComponent.getUniqueId(), instanceId, foundRelation, this::isBelongingFullCapability);
             if(getfulfilledRequirementRes.isRight()){
                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CAPABILITY_OF_INSTANCE_NOT_FOUND_ON_CONTAINER, relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
                 log.debug("Capability {} of instance {} was not found on the container {}. ", relationshipInfo.getCapability(), instanceId, containerComponent.getUniqueId());
@@ -1592,12 +1524,24 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return result;
     }
 
-    private boolean isBelongingCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap) {
+    private boolean isBelongingFullCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap) {
         return     cap.getName().equals(relationshipInfo.getCapability()) &&
                 cap.getUniqueId().equals(relationshipInfo.getCapabilityUid()) &&
                 cap.getOwnerId().equals(relationshipInfo.getCapabilityOwnerId());
     }
 
+    private boolean isBelongingCalcCapability(RelationshipInfo relationshipInfo, CapabilityDataDefinition cap, LifecycleStateEnum state) {
+        return  nameMatches(relationshipInfo.getCapability(), cap.getName(), cap.getPreviousName(), state) &&
+                cap.getUniqueId().equals(relationshipInfo.getCapabilityUid()) &&
+                cap.getOwnerId().equals(relationshipInfo.getCapabilityOwnerId());
+    }
+
+    private boolean nameMatches(String nameFromRelationship, String currName, String previousName, LifecycleStateEnum state) {
+        return state == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT ?
+                currName.equals(nameFromRelationship):
+                previousName!= null && previousName.equals(nameFromRelationship);
+    }
+
     private Either<ComponentInstanceProperty, ResponseFormat> updateAttributeValue(ComponentInstanceProperty attribute, String resourceInstanceId) {
         Either<ComponentInstanceProperty, StorageOperationStatus> eitherAttribute = componentInstanceOperation.updateAttributeValueInResourceInstance(attribute, resourceInstanceId, true);
         Either<ComponentInstanceProperty, ResponseFormat> result;
@@ -1660,7 +1604,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         Either<ComponentInstanceProperty, ResponseFormat> result = null;
         Wrapper<ResponseFormat> errorWrapper = new Wrapper<>();
 
-        validateUserExist(userId, "create Or Update Attribute Value");
+        validateUserExists(userId);
         if (errorWrapper.isEmpty()) {
             validateComponentTypeEnum(componentTypeEnum, "CreateOrUpdateAttributeValue", errorWrapper);
         }
@@ -1696,45 +1640,12 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
     }
 
-    private boolean isNetworkRoleServiceProperty(ComponentInstanceProperty property, ComponentTypeEnum componentTypeEnum) {
-        return StringUtils.isNotEmpty(property.getValue())
-                && PropertyNames.NETWORK_ROLE.getPropertyName().equalsIgnoreCase(property.getName())
-                && ComponentTypeEnum.SERVICE == componentTypeEnum;
-    }
-
-    // US833308 VLI in service - specific network_role property value logic
-    private StorageOperationStatus concatServiceNameToVLINetworkRolePropertiesValues(ToscaOperationFacade toscaOperationFacade, ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, List<ComponentInstanceProperty> properties) {
-        for (ComponentInstanceProperty property: properties) {
-            if (isNetworkRoleServiceProperty(property, componentTypeEnum)) {
-                ComponentParametersView componentParametersView = new ComponentParametersView();
-                componentParametersView.disableAll();
-                componentParametersView.setIgnoreComponentInstances(false);
-                Either<Component, StorageOperationStatus> getServiceResult = toscaOperationFacade.getToscaElement(componentId, componentParametersView);
-                if (getServiceResult.isRight()) {
-                    return getServiceResult.right().value();
-                }
-                Component service = getServiceResult.left().value();
-                Optional<ComponentInstance> getInstance = service.getComponentInstances().stream().filter(p -> p.getUniqueId().equals(resourceInstanceId)).findAny();
-                if (!getInstance.isPresent()) {
-                    return StorageOperationStatus.NOT_FOUND;
-                }
-                String prefix = service.getSystemName() + ".";
-                String value = property.getValue();
-                if (OriginTypeEnum.VL == getInstance.get().getOriginType() && (!value.startsWith(prefix) || value.equalsIgnoreCase(prefix))) {
-                    property.setValue(prefix + value);
-                }
-            }
-        }
-        return StorageOperationStatus.OK;
-    }
-
     public Either<List<ComponentInstanceProperty>, ResponseFormat> createOrUpdatePropertiesValues(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, List<ComponentInstanceProperty> properties, String userId) {
 
         Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
 
         /*-------------------------------Validations---------------------------------*/
-
-        validateUserExists(userId, "create Or Update Properties Values", false);
+        validateUserExists(userId);
 
         if (componentTypeEnum == null) {
             BeEcompErrorManager.getInstance().logInvalidInputError("CreateOrUpdatePropertiesValues", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
@@ -1745,51 +1656,45 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         if (getResourceResult.isRight()) {
             log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, componentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
-            return resultOp;
+            ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getResourceResult.right().value(), componentTypeEnum);
+            return Either.right(componentsUtils.getResponseFormat(actionStatus, componentId));
         }
         Component containerComponent = getResourceResult.left().value();
 
         if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
+            if (containerComponent.isArchived()) {
+                log.info("Component is archived. Component id: {}", componentId);
+                return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, containerComponent.getName()));
+            }
             log.info("Restricted operation for user: {} on service {}", userId, componentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
-            return resultOp;
+            return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
         }
 
-               //Validate value and Constraint of property
-               Either<Boolean, ResponseFormat> constraintValidatorResponse =
-                               PropertyValueConstraintValidationUtil.getInstance().
-                                               validatePropertyConstraints(properties, applicationDataTypeCache);
-               if (constraintValidatorResponse.isRight()) {
-                       log.error("Failed validation value and constraint of property: {}",
-                                       constraintValidatorResponse.right().value());
-                       return Either.right(constraintValidatorResponse.right().value());
-               }
-
         Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
         if (resourceInstanceStatus.isRight()) {
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, resourceInstanceId, componentId));
-            return resultOp;
+            return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
+                    resourceInstanceId, "resource instance", "service", componentId));
         }
         ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
-        // specific property value logic US833308
-        StorageOperationStatus fetchByIdsStatus = concatServiceNameToVLINetworkRolePropertiesValues(toscaOperationFacade, componentTypeEnum, componentId, resourceInstanceId, properties);
-        if (StorageOperationStatus.OK != fetchByIdsStatus) {
-            resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(fetchByIdsStatus)));
-            return resultOp;
-        }
+
         // lock resource
         StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
         if (lockStatus != StorageOperationStatus.OK) {
             log.debug(FAILED_TO_LOCK_SERVICE, componentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
-            return resultOp;
+            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
         }
-
+        List <ComponentInstanceProperty> updatedProperties = new ArrayList<>();
         try {
             for (ComponentInstanceProperty property: properties) {
+                validateMandatoryFields(property);
+                ComponentInstanceProperty componentInstanceProperty = validatePropertyExistsOnComponent(property, containerComponent, foundResourceInstance);
                 String propertyParentUniqueId = property.getParentUniqueId();
                 Either<String, ResponseFormat> updatedPropertyValue = updatePropertyObjectValue(property, false);
+                if (updatedPropertyValue.isRight()) {
+                    log.error("Failed to update property object value of property: {}",
+                            property);
+                    throw new ByResponseFormatComponentException(updatedPropertyValue.right().value());
+                }
                 Optional<CapabilityDefinition>
                         capPropDefinition = getPropertyCapabilityOfChildInstance(propertyParentUniqueId, foundResourceInstance.getCapabilities());
                 if(capPropDefinition.isPresent()) {
@@ -1801,6 +1706,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                 else {
                     updatedPropertyValue.bimap(updatedValue -> updatePropertyOnContainerComponent(property, updatedValue,
                             containerComponent, foundResourceInstance), Either::right);
+                    updatedProperties.add(componentInstanceProperty);
                 }
             }
 
@@ -1810,7 +1716,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
                 return resultOp;
             }
-            resultOp = Either.left(properties);
+            resultOp = Either.left(updatedProperties);
             return resultOp;
 
         } finally {
@@ -1824,17 +1730,29 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
     }
 
+    private void validateMandatoryFields(PropertyDataDefinition property) {
+        if (StringUtils.isEmpty(property.getName())) {
+            throw new ByActionStatusComponentException (ActionStatus.MISSING_PROPERTY_NAME);
+        }
+    }
+
+    private ComponentInstanceProperty validatePropertyExistsOnComponent(ComponentInstanceProperty property, Component containerComponent, ComponentInstance foundResourceInstance) {
+        List<ComponentInstanceProperty> instanceProperties = containerComponent.getComponentInstancesProperties().get(foundResourceInstance.getUniqueId());
+        Optional<ComponentInstanceProperty> instanceProperty = instanceProperties.stream().filter(p -> p.getName().equals(property.getName())).findAny();
+        if (!instanceProperty.isPresent()) {
+            throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, property.getName());
+        }
+        return instanceProperty.get();
+    }
+
+
+
     private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property,
                                                                         String newValue, Component containerComponent, ComponentInstance foundResourceInstance,
                                                                         String capabilityType, String capabilityName) {
         String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
-        StringBuilder sb = new StringBuilder(componentInstanceUniqueId);
-        sb.append(ModelConverter.CAP_PROP_DELIM).append(property.getOwnerId()).append(ModelConverter.CAP_PROP_DELIM)
-                .append(capabilityType).append(ModelConverter.CAP_PROP_DELIM).append(capabilityName);
-        String capKey = sb.toString();
-
         ResponseFormat actionStatus = updateCapPropOnContainerComponent(property, newValue, containerComponent,
-                foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId, capKey);
+                foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId);
         if (actionStatus != null) {
             return actionStatus;
         }
@@ -1858,14 +1776,9 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         } else {
             propOwner = foundResourceInstance.getSourceModelUid();
         }
-        StringBuilder sb = new StringBuilder(componentInstanceUniqueId);
-
-        sb.append(ModelConverter.CAP_PROP_DELIM).append(propOwner).append(ModelConverter.CAP_PROP_DELIM)
-                .append(capabilityType).append(ModelConverter.CAP_PROP_DELIM).append(capabilityName);
-        String capKey = sb.toString();
 
         ResponseFormat actionStatus = updateCapPropOnContainerComponent(property, newValue, containerComponent,
-                foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId, capKey);
+                foundResourceInstance, capabilityType, capabilityName, componentInstanceUniqueId);
         if (actionStatus != null) {
             return actionStatus;
         }
@@ -1877,7 +1790,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                                                              Component containerComponent,
                                                              ComponentInstance foundResourceInstance,
                                                              String capabilityType, String capabilityName,
-                                                             String componentInstanceUniqueId, String capKey) {
+                                                             String componentInstanceUniqueId) {
         Map<String, List<CapabilityDefinition>> capabilities =
                 Optional.ofNullable(foundResourceInstance.getCapabilities()).orElse(Collections.emptyMap());
         List<CapabilityDefinition> capPerType =
@@ -1891,6 +1804,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                         capProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
                 StorageOperationStatus status;
                 if (instanceProperty.isPresent()) {
+                    String capKey = ModelConverter.buildCapabilityPropertyKey(foundResourceInstance.getOriginType().isAtomicType(), capabilityType, capabilityName, componentInstanceUniqueId, cap.get());
                     instanceProperty.get().setValue(newValue);
                     List<String> path = new ArrayList<>();
                     path.add(componentInstanceUniqueId);
@@ -1911,35 +1825,59 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return null;
     }
 
-    private ResponseFormat updatePropertyOnContainerComponent(ComponentInstanceProperty property, String newValue,
-                                                              Component containerComponent, ComponentInstance foundResourceInstance) {
-        List<ComponentInstanceProperty> instanceProperties =
-                containerComponent.getComponentInstancesProperties().get(foundResourceInstance.getUniqueId());
-        Optional<ComponentInstanceProperty> instanceProperty =
-                instanceProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
-        StorageOperationStatus status;
-        instanceProperty.get().setValue(newValue);
-        if (instanceProperty.isPresent()) {
-            status = toscaOperationFacade
-                    .updateComponentInstanceProperty(containerComponent, foundResourceInstance.getUniqueId(),
-                            property);
-        } else {
-            status = toscaOperationFacade
-                    .addComponentInstanceProperty(containerComponent, foundResourceInstance.getUniqueId(),
-                            property);
-        }
+    private ResponseFormat updatePropertyOnContainerComponent(ComponentInstanceProperty instanceProperty, String newValue, Component containerComponent, ComponentInstance foundResourceInstance) {
+        StorageOperationStatus status;
+        instanceProperty.setValue(newValue);
+        status = toscaOperationFacade.updateComponentInstanceProperty(containerComponent, foundResourceInstance.getUniqueId(), instanceProperty);
         if (status != StorageOperationStatus.OK) {
             ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
             return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
         }
-        List<String> path = new ArrayList<>();
-        path.add(foundResourceInstance.getUniqueId());
-        property.setPath(path);
-
         foundResourceInstance.setCustomizationUUID(UUID.randomUUID().toString());
         return componentsUtils.getResponseFormat(ActionStatus.OK);
     }
 
+    private <T extends PropertyDefinition> Either<String,ResponseFormat> validatePropertyObjectValue(T property, String newValue, boolean isInput) {
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypesEither = dataTypeCache.getAll();
+        if (allDataTypesEither.isRight()) {
+            JanusGraphOperationStatus status = allDataTypesEither.right().value();
+            BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance", "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
+            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status))));
+        }
+        Map<String, DataTypeDefinition> allDataTypes = allDataTypesEither.left().value();
+        String propertyType = property.getType();
+        String innerType = getInnerType(property);
+
+        // Specific Update Logic
+        Either<Object, Boolean> isValid = propertyOperation.validateAndUpdatePropertyValue(property.getType(), newValue, true, innerType, allDataTypes);
+        if (isValid.isRight()) {
+            Boolean res = isValid.right().value();
+            if (!res) {
+                log.error("Invalid value {} of property {} ", newValue, property.getName());
+                return Either.right(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            }
+        } else {
+            Object object = isValid.left().value();
+            if (object != null) {
+                newValue = object.toString();
+            }
+        }
+        if (validateAndUpdateRules(property, isInput, allDataTypes, innerType, propertyType))
+            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT))));
+        return Either.left(newValue);
+    }
+
+    private <T extends PropertyDefinition> boolean validateAndUpdateRules(T property, boolean isInput, Map<String, DataTypeDefinition> allDataTypes, String innerType, String propertyType) {
+        if (!isInput) {
+            ImmutablePair<String, Boolean> pair = propertyOperation.validateAndUpdateRules(propertyType, ((ComponentInstanceProperty) property).getRules(), innerType, allDataTypes, true);
+            if (pair.getRight() != null && !pair.getRight()) {
+                BeEcompErrorManager.getInstance().logBeInvalidValueError("Add property value", pair.getLeft(), property.getName(), propertyType);
+                return true;
+            }
+        }
+        return false;
+    }
+
     private <T extends PropertyDefinition> Either<String,ResponseFormat> updatePropertyObjectValue(T property, boolean isInput) {
         Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypesEither = dataTypeCache.getAll();
         if (allDataTypesEither.isRight()) {
@@ -1972,7 +1910,8 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         if (isValid.isRight()) {
             Boolean res = isValid.right().value();
             if (!res) {
-                return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT))));
+                log.debug("validate and update property value has failed with value: {}", property.getValue());
+                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
             }
         } else {
             Object object = isValid.left().value();
@@ -1991,15 +1930,9 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     }
 
     private ResponseFormat updateInputOnContainerComponent(ComponentInstanceInput input, String newValue, Component containerComponent, ComponentInstance foundResourceInstance) {
-        List<ComponentInstanceInput> instanceProperties = containerComponent.getComponentInstancesInputs().get(foundResourceInstance.getUniqueId());
-        Optional<ComponentInstanceInput> instanceProperty = instanceProperties.stream().filter(p -> p.getUniqueId().equals(input.getUniqueId())).findAny();
         StorageOperationStatus status;
-        if (instanceProperty.isPresent()) {
-            instanceProperty.get().setValue(input.getValue());
-            status = toscaOperationFacade.updateComponentInstanceInput(containerComponent, foundResourceInstance.getUniqueId(), input);
-        } else {
-            status = toscaOperationFacade.addComponentInstanceInput(containerComponent, foundResourceInstance.getUniqueId(), input);
-        }
+        input.setValue(newValue);
+        status = toscaOperationFacade.updateComponentInstanceInput(containerComponent, foundResourceInstance.getUniqueId(), input);
         if (status != StorageOperationStatus.OK) {
             ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
             return componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, "");
@@ -2012,7 +1945,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         Either<List<ComponentInstanceInput>, ResponseFormat> resultOp = null;
 
-        validateUserExists(userId, "create Or Update Property Value", false);
+        validateUserExists(userId);
 
         if (componentTypeEnum == null) {
             BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
@@ -2023,20 +1956,24 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         if (getResourceResult.isRight()) {
             log.debug(FAILED_TO_RETRIEVE_COMPONENT_COMPONENT_ID, componentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
-            return resultOp;
+            ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getResourceResult.right().value(), componentTypeEnum);
+            return Either.right(componentsUtils.getResponseFormat(actionStatus, componentId));
         }
         Component containerComponent = getResourceResult.left().value();
 
         if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
+            if (containerComponent.isArchived()) {
+                log.info("Component is archived. Component id: {}", componentId);
+                return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, containerComponent.getName()));
+            }
             log.info("Restricted operation for user: {} on service {}", userId, componentId);
             resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
             return resultOp;
         }
         Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, resourceInstanceId);
         if (resourceInstanceStatus.isRight()) {
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, resourceInstanceId, componentId));
-            return resultOp;
+            return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER,
+                    resourceInstanceId, "resource instance", "service", componentId));
         }
 
         ComponentInstance foundResourceInstance = resourceInstanceStatus.left().value();
@@ -2045,24 +1982,27 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
         if (lockStatus != StorageOperationStatus.OK) {
             log.debug(FAILED_TO_LOCK_SERVICE, componentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
-            return resultOp;
+            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
         }
+        List <ComponentInstanceInput> updatedInputs = new ArrayList<>();
         try {
             for (ComponentInstanceInput input: inputs) {
-                Either<String, ResponseFormat> updatedInputValue = updatePropertyObjectValue(input, true);
-                updatedInputValue.bimap(updatedValue -> updateInputOnContainerComponent(input,updatedValue, containerComponent, foundResourceInstance),
-                        Either::right);
-
+                validateMandatoryFields(input);
+                ComponentInstanceInput componentInstanceInput = validateInputExistsOnComponent(input, containerComponent, foundResourceInstance);
+                Either<String, ResponseFormat> validatedInputValue = validatePropertyObjectValue(componentInstanceInput, input.getValue(), true);
+                if (validatedInputValue.isRight()){
+                    throw new ByActionStatusComponentException(ActionStatus.INVALID_CONTENT, input.getName());
+                }
+                updateInputOnContainerComponent(componentInstanceInput, validatedInputValue.left().value(), containerComponent, foundResourceInstance);
+                updatedInputs.add(componentInstanceInput);
             }
             Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
-
             if (updateContainerRes.isRight()) {
                 ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(updateContainerRes.right().value());
                 resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
                 return resultOp;
             }
-            resultOp = Either.left(inputs);
+            resultOp = Either.left(updatedInputs);
             return resultOp;
 
         } finally {
@@ -2077,12 +2017,20 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    public Either<ComponentInstanceProperty, ResponseFormat> createOrUpdateGroupInstancePropertyValue(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, String groupInstanceId, ComponentInstanceProperty property,
-                                                                                                      String userId) {
+    private ComponentInstanceInput validateInputExistsOnComponent(ComponentInstanceInput input, Component containerComponent, ComponentInstance foundResourceInstance) {
+        List<ComponentInstanceInput> instanceProperties = containerComponent.getComponentInstancesInputs().get(foundResourceInstance.getUniqueId());
+        Optional<ComponentInstanceInput> instanceInput = instanceProperties.stream().filter(p -> p.getName().equals(input.getName())).findAny();
+        if (!instanceInput.isPresent()) {
+            throw new ByActionStatusComponentException(ActionStatus.PROPERTY_NOT_FOUND, input.getName());
+        }
+        return instanceInput.get();
+    }
+
+    public Either<ComponentInstanceProperty, ResponseFormat> createOrUpdateGroupInstancePropertyValue(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, String groupInstanceId, ComponentInstanceProperty property, String userId) {
 
         Either<ComponentInstanceProperty, ResponseFormat> resultOp = null;
 
-        validateUserExists(userId, "create Or Update Property Value", false);
+        validateUserExists(userId);
 
         if (componentTypeEnum == null) {
             BeEcompErrorManager.getInstance().logInvalidInputError(CREATE_OR_UPDATE_PROPERTY_VALUE, INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
@@ -2172,98 +2120,9 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    public Either<ComponentInstanceInput, ResponseFormat> createOrUpdateInputValue(ComponentTypeEnum componentTypeEnum, String componentId, String resourceInstanceId, ComponentInstanceInput inputProperty, String userId) {
-
-        Either<ComponentInstanceInput, ResponseFormat> resultOp = null;
-
-        validateUserExists(userId, "create Or Update Input Value", false);
-
-        if (componentTypeEnum == null) {
-            BeEcompErrorManager.getInstance().logInvalidInputError("createOrUpdateInputValue", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
-            return resultOp;
-        }
-
-        if (!ComponentValidationUtils.canWorkOnComponent(componentId, toscaOperationFacade, userId)) {
-            log.info("Restricted operation for user: {} on service: {}", userId, componentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
-            return resultOp;
-        }
-        // lock resource
-        StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
-        if (lockStatus != StorageOperationStatus.OK) {
-            log.debug(FAILED_TO_LOCK_SERVICE, componentId);
-            resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
-            return resultOp;
-        }
-        try {
-            String propertyValueUid = inputProperty.getValueUniqueUid();
-            if (propertyValueUid == null) {
-
-                Either<Integer, StorageOperationStatus> counterRes = componentInstanceOperation.increaseAndGetResourceInstanceSpecificCounter(resourceInstanceId, GraphPropertiesDictionary.INPUT_COUNTER, true);
-
-                if (counterRes.isRight()) {
-                    log.debug("increaseAndGetResourceInputCounter failed resource instance {} inputProperty {}", resourceInstanceId, inputProperty);
-                    StorageOperationStatus status = counterRes.right().value();
-                    ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(status);
-                    resultOp = Either.right(componentsUtils.getResponseFormat(actionStatus));
-                }
-                Integer index = counterRes.left().value();
-                Either<ComponentInstanceInput, StorageOperationStatus> result = componentInstanceOperation.addInputValueToResourceInstance(inputProperty, resourceInstanceId, index, true);
-
-                if (result.isLeft()) {
-                    log.debug("Property value was added to resource instance {}", resourceInstanceId);
-                    ComponentInstanceInput instanceProperty = result.left().value();
-
-                    resultOp = Either.left(instanceProperty);
-                    return resultOp;
-
-                } else {
-                    log.debug("Failed to add input value {} to resource instance {}", inputProperty, resourceInstanceId);
-
-                    ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
-
-                    resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
-
-                    return resultOp;
-                }
-
-            } else {
-                Either<ComponentInstanceInput, StorageOperationStatus> result = componentInstanceOperation.updateInputValueInResourceInstance(inputProperty, resourceInstanceId, true);
-
-                if (result.isLeft()) {
-                    log.debug("Input value {} was updated on graph.", inputProperty.getValueUniqueUid());
-                    ComponentInstanceInput instanceProperty = result.left().value();
-
-                    resultOp = Either.left(instanceProperty);
-                    return resultOp;
-
-                } else {
-                    log.debug("Failed to update property value {} in resource instance {}", inputProperty, resourceInstanceId);
-
-                    ActionStatus actionStatus = componentsUtils.convertFromStorageResponseForResourceInstanceProperty(result.right().value());
-
-                    resultOp = Either.right(componentsUtils.getResponseFormatForResourceInstanceProperty(actionStatus, ""));
-
-                    return resultOp;
-                }
-            }
-
-        } finally {
-            if (resultOp == null || resultOp.isRight()) {
-                janusGraphDao.rollback();
-            } else {
-                janusGraphDao.commit();
-            }
-            // unlock resource
-            graphLockOperation.unlockComponent(componentId, componentTypeEnum.getNodeType());
-        }
-
-    }
-
     public Either<ComponentInstanceProperty, ResponseFormat> deletePropertyValue(ComponentTypeEnum componentTypeEnum, String serviceId, String resourceInstanceId, String propertyValueId, String userId) {
 
-        validateUserExists(userId, "delete Property Value", false);
+        validateUserExists(userId);
 
         Either<ComponentInstanceProperty, ResponseFormat> resultOp = null;
 
@@ -2317,32 +2176,27 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
     }
 
-    private Either<Component, ResponseFormat> getAndValidateOriginComponentOfComponentInstance(ComponentTypeEnum containerComponentType, ComponentInstance componentInstance) {
+    private Component getAndValidateOriginComponentOfComponentInstance(Component containerComponent, ComponentInstance componentInstance) {
 
-        Either<Component, ResponseFormat> eitherResponse = null;
-        ComponentTypeEnum componentType = getComponentTypeByParentComponentType(containerComponentType);
+        ComponentTypeEnum componentType = getComponentTypeByParentComponentType(containerComponent.getComponentType());
         Component component;
-        ResponseFormat errorResponse;
         Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getToscaFullElement(componentInstance.getComponentUid());
         if (getComponentRes.isRight()) {
             log.debug("Failed to get the component with id {} for component instance {} creation. ", componentInstance.getComponentUid(), componentInstance.getName());
             ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getComponentRes.right().value(), componentType);
-            errorResponse = componentsUtils.getResponseFormat(actionStatus, Constants.EMPTY_STRING);
-            eitherResponse = Either.right(errorResponse);
+            throw new ByActionStatusComponentException(actionStatus, Constants.EMPTY_STRING);
         }
-        if (eitherResponse == null) {
-            component = getComponentRes.left().value();
-            LifecycleStateEnum resourceCurrState = component.getLifecycleState();
-            if (resourceCurrState == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
-                ActionStatus actionStatus = ActionStatus.ILLEGAL_COMPONENT_STATE;
-                errorResponse = componentsUtils.getResponseFormat(actionStatus, component.getComponentType().toString(), component.getName(), resourceCurrState.toString());
-                eitherResponse = Either.right(errorResponse);
-            }
+        component = getComponentRes.left().value();
+        LifecycleStateEnum resourceCurrState = component.getLifecycleState();
+        if (resourceCurrState == LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT) {
+            ActionStatus actionStatus = ActionStatus.CONTAINER_CANNOT_CONTAIN_COMPONENT_IN_STATE;
+            throw new ByActionStatusComponentException(actionStatus, containerComponent.getComponentType().toString(),  resourceCurrState.toString());
         }
-        if (eitherResponse == null) {
-            eitherResponse = Either.left(getComponentRes.left().value());
+        if (component.isArchived() == true){
+            ActionStatus actionStatus = ActionStatus.COMPONENT_IS_ARCHIVED;
+            throw new ByActionStatusComponentException(actionStatus, component.getName());
         }
-        return eitherResponse;
+        return component;
     }
 
     public Either<Set<String>, ResponseFormat> forwardingPathOnVersionChange(String containerComponentParam,
@@ -2350,20 +2204,11 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                                                                              String componentInstanceId,
                                                                              ComponentInstance newComponentInstance) {
         Either<Set<String>, ResponseFormat> resultOp;
-        Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-        if (validateComponentType.isRight()) {
-            return Either.right(validateComponentType.right().value());
-        }
-        final ComponentTypeEnum containerComponentType = validateComponentType.left().value();
+        final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
         ComponentParametersView componentParametersView = getComponentParametersViewForForwardingPath();
 
         //Fetch Component
-        Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists =
-                validateComponentExists(containerComponentId, containerComponentType, componentParametersView);
-        if (validateComponentExists.isRight()) {
-            return Either.right(validateComponentExists.right().value());
-        }
-        Component containerComponent = validateComponentExists.left().value();
+        Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, componentParametersView);
 
         //Fetch current component instance
         Either<ComponentInstance, StorageOperationStatus> eitherResourceInstance =
@@ -2379,7 +2224,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         String resourceId = newComponentInstance.getComponentUid();
         Either<Boolean, StorageOperationStatus> componentExistsRes = toscaOperationFacade.validateComponentExists(resourceId);
         if (componentExistsRes.isRight()) {
-            log.debug("Failed to find resource {} ", resourceId);
+            log.debug("Failed to find resource {}", resourceId);
             resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse
                     (componentExistsRes.right().value()), resourceId));
             return resultOp;
@@ -2390,12 +2235,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         }
 
         //Fetch component using new component instance uid
-        Either<Component, ResponseFormat> eitherResourceName = getOriginComponentFromComponentInstance(newComponentInstance);
-        if (eitherResourceName.isRight()) {
-            resultOp = Either.right(eitherResourceName.right().value());
-            return resultOp;
-        }
-        Component updatedContainerComponent=eitherResourceName.left().value();
+        Component updatedContainerComponent=getOriginComponentFromComponentInstance(newComponentInstance);
         Set<String> toDeleteForwardingPaths = getForwardingPaths(containerComponent,
                 currentResourceInstance, updatedContainerComponent);
         resultOp=Either.left(toDeleteForwardingPaths);
@@ -2406,7 +2246,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
     private Set<String> getForwardingPaths(Component containerComponent, ComponentInstance currentResourceInstance,
                                            Component updatedContainerComponent) {
         DataForMergeHolder dataForMergeHolder=new DataForMergeHolder();
-        dataForMergeHolder.setOrigComponentInstId(currentResourceInstance.getUniqueId());
+        dataForMergeHolder.setOrigComponentInstId(currentResourceInstance.getName());
 
         Service service = (Service) containerComponent;
         ForwardingPathUtils forwardingPathUtils = new ForwardingPathUtils();
@@ -2422,35 +2262,20 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return componentParametersView;
     }
 
-    public Either<ComponentInstance, ResponseFormat> changeComponentInstanceVersion(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance newComponentInstance) {
+    public ComponentInstance changeComponentInstanceVersion(String containerComponentParam, String containerComponentId, String componentInstanceId, String userId, ComponentInstance newComponentInstance) {
 
-        User user = validateUserExists(userId, "change Component Instance Version", false);
-
-        Either<ComponentInstance, ResponseFormat> resultOp = null;
-
-        Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-        if (validateComponentType.isRight()) {
-            return Either.right(validateComponentType.right().value());
-        }
-
-        final ComponentTypeEnum containerComponentType = validateComponentType.left().value();
+        User user = validateUserExists(userId);
+        final ComponentTypeEnum containerComponentType = validateComponentType(containerComponentParam);
         ComponentParametersView componentParametersView = new ComponentParametersView();
         componentParametersView.setIgnoreCapabiltyProperties(false);
-        Either<org.openecomp.sdc.be.model.Component, ResponseFormat> validateComponentExists = validateComponentExists(containerComponentId, containerComponentType, componentParametersView);
-        if (validateComponentExists.isRight()) {
-            return Either.right(validateComponentExists.right().value());
-        }
-        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists.left().value();
 
-        Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-        if (validateCanWorkOnComponent.isRight()) {
-            return Either.right(validateCanWorkOnComponent.right().value());
-        }
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(containerComponentId, containerComponentType, componentParametersView);
+
+        validateCanWorkOnComponent(containerComponent, userId);
 
         Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceId);
         if (resourceInstanceStatus.isRight()) {
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceId, containerComponentId));
-            return resultOp;
+            throw new ByActionStatusComponentException(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceId, containerComponentId);
         }
 
         ComponentInstance currentResourceInstance = resourceInstanceStatus.left().value();
@@ -2458,84 +2283,48 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         return changeInstanceVersion(containerComponent, currentResourceInstance, newComponentInstance, user, containerComponentType );
     }
 
-    public Either<ComponentInstance, ResponseFormat> changeInstanceVersion(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance currentResourceInstance,
-                                                                           ComponentInstance newComponentInstance, User user, final ComponentTypeEnum containerComponentType    ) {
-        Either<ComponentInstance, ResponseFormat> resultOp = null;
+    public ComponentInstance changeInstanceVersion(org.openecomp.sdc.be.model.Component containerComponent, ComponentInstance currentResourceInstance,
+                                                   ComponentInstance newComponentInstance, User user, final ComponentTypeEnum containerComponentType    ) {
+        boolean failed = false;
         Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus;
 
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(containerComponent, "changeComponentInstanceVersion");
-        String containerComponentId = containerComponent.getUniqueId();
-        String componentInstanceId = currentResourceInstance.getUniqueId();
-        if (lockComponent.isRight()) {
-            return Either.right(lockComponent.right().value());
-        }
-
         try {
-
-
+            lockComponent(containerComponent, "changeComponentInstanceVersion");
+            String containerComponentId = containerComponent.getUniqueId();
+            String componentInstanceId = currentResourceInstance.getUniqueId();
             if (currentResourceInstance.getComponentUid().equals(newComponentInstance.getComponentUid())) {
-                resultOp = Either.left(currentResourceInstance);
-                return resultOp;
-
+                return currentResourceInstance;
             }
             String resourceId = newComponentInstance.getComponentUid();
 
-
-
             Either<Boolean, StorageOperationStatus> componentExistsRes = toscaOperationFacade.validateComponentExists(resourceId);
             if (componentExistsRes.isRight()) {
-                log.debug("Failed to validate existing of the component {}. Status is {} ", resourceId);
-                resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(componentExistsRes.right().value()), resourceId));
-                return resultOp;
+                log.debug("Failed to validate existing of the component {}. Status is {} ", resourceId, componentExistsRes.right().value());
+                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(componentExistsRes.right().value()), resourceId);
             } else if (!componentExistsRes.left().value()) {
                 log.debug("The resource {} not found ", resourceId);
-                resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_NOT_FOUND, resourceId));
-                return resultOp;
+                throw new ByActionStatusComponentException(ActionStatus.RESOURCE_NOT_FOUND, resourceId);
             }
 
-            Either<Component, ResponseFormat> eitherOriginComponent = getInstanceOriginNode(currentResourceInstance);
+            Component eitherOriginComponent = getInstanceOriginNode(currentResourceInstance);
 
-            if (eitherOriginComponent.isRight()) {
-                resultOp = Either.right(eitherOriginComponent.right().value());
-                return resultOp;
-            }
-            DataForMergeHolder dataHolder = compInstMergeDataBL.saveAllDataBeforeDeleting(containerComponent, currentResourceInstance, eitherOriginComponent.left().value());
-            resultOp = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
-            if (resultOp.isRight()) {
-                log.debug("failed to delete resource instance {}", resourceId);
-                return resultOp;
-            }
-            ComponentInstance resResourceInfo = resultOp.left().value();
+            DataForMergeHolder dataHolder = compInstMergeDataBL.saveAllDataBeforeDeleting(containerComponent, currentResourceInstance, eitherOriginComponent);
+            ComponentInstance resResourceInfo = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentType);
             Component origComponent = null;
             OriginTypeEnum originType = currentResourceInstance.getOriginType();
             if (originType == OriginTypeEnum.ServiceProxy) {
                 Either<Component, StorageOperationStatus> serviceProxyOrigin = toscaOperationFacade.getLatestByName("serviceProxy");
-                if (serviceProxyOrigin.isRight()) {
-                    log.debug("Failed to fetch normative service proxy resource by tosca name, error {}", serviceProxyOrigin.right().value());
-                    return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value())));
-                }
+                if (isServiceProxyOrigin(serviceProxyOrigin))
+                    throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(serviceProxyOrigin.right().value()));
                 origComponent = serviceProxyOrigin.left().value();
 
                 StorageOperationStatus fillProxyRes = fillProxyInstanceData(newComponentInstance, origComponent);
 
-                if (fillProxyRes != StorageOperationStatus.OK) {
-                    log.debug("Failed to fill service proxy resource data with data from service, error {}", fillProxyRes);
-                    return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(fillProxyRes)));
-
-                }
+                if (isFillProxyRes(fillProxyRes))
+                    throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(fillProxyRes));
                 newComponentInstance.setOriginType(originType);
             }else{
-
-
-                Either<Component, ResponseFormat> eitherResourceName = getOriginComponentFromComponentInstance(newComponentInstance);
-
-                if (eitherResourceName.isRight()) {
-                    resultOp = Either.right(eitherResourceName.right().value());
-                    return resultOp;
-                }
-
-                origComponent = eitherResourceName.left().value();
-
+                origComponent = getOriginComponentFromComponentInstance(newComponentInstance);
                 newComponentInstance.setName(resResourceInfo.getName());
             }
 
@@ -2544,28 +2333,13 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             newComponentInstance.setPosY(resResourceInfo.getPosY());
             newComponentInstance.setDescription(resResourceInfo.getDescription());
 
-            resultOp = createComponentInstanceOnGraph(containerComponent, origComponent, newComponentInstance, user);
-
-            if (resultOp.isRight()) {
-                log.debug("failed to create resource instance {}", resourceId);
-                return resultOp;
-            }
-
-            ComponentInstance updatedComponentInstance = resultOp.left().value();
-            if (resultOp.isRight()) {
-                log.debug("failed to create resource instance {}", resourceId);
-                return resultOp;
-            }
-
+            ComponentInstance updatedComponentInstance = createComponentInstanceOnGraph(containerComponent, origComponent, newComponentInstance, user);
             dataHolder.setCurrInstanceNode(origComponent);
-            Either<Component, ResponseFormat> mergeStatusEither = compInstMergeDataBL.mergeComponentUserOrigData(user, dataHolder, containerComponent, containerComponentId, newComponentInstance.getUniqueId());
-            if (mergeStatusEither.isRight()) {
-                return Either.right(mergeStatusEither.right().value());
-            }
+            Component mergeStatusEither = compInstMergeDataBL.mergeComponentUserOrigData(user, dataHolder, containerComponent, containerComponentId, newComponentInstance.getUniqueId());
 
             ActionStatus postChangeVersionResult = onChangeInstanceOperationOrchestrator.doPostChangeVersionOperations(containerComponent, currentResourceInstance, newComponentInstance);
             if (postChangeVersionResult != ActionStatus.OK) {
-                return Either.right(componentsUtils.getResponseFormat(postChangeVersionResult));
+                throw new ByActionStatusComponentException(postChangeVersionResult);
             }
 
             ComponentParametersView filter = new ComponentParametersView(true);
@@ -2574,59 +2348,62 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             if (updatedComponentRes.isRight()) {
                 StorageOperationStatus storageOperationStatus = updatedComponentRes.right().value();
                 ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(storageOperationStatus, containerComponent.getComponentType());
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(actionStatus, Constants.EMPTY_STRING);
                 log.debug("Component with id {} was not found", containerComponentId);
-                return Either.right(responseFormat);
+                throw new ByActionStatusComponentException(actionStatus, Constants.EMPTY_STRING);
             }
             resourceInstanceStatus = getResourceInstanceById(updatedComponentRes.left().value(), updatedComponentInstance.getUniqueId());
             if (resourceInstanceStatus.isRight()) {
-                resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(resourceInstanceStatus.right().value()), updatedComponentInstance.getUniqueId()));
-                return resultOp;
+                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse
+                        (resourceInstanceStatus.right().value()), updatedComponentInstance.getUniqueId());
             }
-            resultOp = Either.left(resourceInstanceStatus.left().value());
-            return resultOp;
+            return  resourceInstanceStatus.left().value();
 
-        } finally {
-            unlockComponent(resultOp, containerComponent);
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
+            unlockComponent(failed, containerComponent);
+        }
+    }
+
+    private boolean isFillProxyRes(StorageOperationStatus fillProxyRes) {
+        if (fillProxyRes != StorageOperationStatus.OK) {
+            log.debug("Failed to fill service proxy resource data with data from service, error {}", fillProxyRes);
+            return true;
         }
+        return false;
     }
 
     // US831698
-    public Either<List<ComponentInstanceProperty>, ResponseFormat> getComponentInstancePropertiesById(String containerComponentTypeParam, String containerComponentId, String componentInstanceUniqueId, String userId) {
-        final String ECOMP_ERROR_CONTEXT = "Get Component Instance Properties By Id";
+    public List<ComponentInstanceProperty> getComponentInstancePropertiesById(String containerComponentTypeParam, String containerComponentId, String componentInstanceUniqueId, String userId) {
         Component containerComponent = null;
 
-        Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
+        boolean failed = false;
         try {
-            validateUserExists(userId, ECOMP_ERROR_CONTEXT, false);
-
-            Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentTypeParam);
-            if (validateComponentType.isRight()) {
-                resultOp = Either.right(validateComponentType.right().value());
-                return resultOp;
-            }
+            validateUserExists(userId);
+            validateComponentType(containerComponentTypeParam);
 
             Either<Component, StorageOperationStatus> validateContainerComponentExists = toscaOperationFacade.getToscaElement(containerComponentId);
             if (validateContainerComponentExists.isRight()) {
-                resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(validateContainerComponentExists.right().value())));
-                return resultOp;
+                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(validateContainerComponentExists.right().value()));
             }
             containerComponent = validateContainerComponentExists.left().value();
 
             Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
             if (resourceInstanceStatus.isRight()) {
-                resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
-                return resultOp;
+                throw new ByActionStatusComponentException(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId);
             }
 
             List<ComponentInstanceProperty> instanceProperties = containerComponent.getComponentInstancesProperties().get(componentInstanceUniqueId);
             if (CollectionUtils.isEmpty(instanceProperties)) {
                 instanceProperties = new ArrayList<>();
             }
-            resultOp = Either.left(instanceProperties);
-            return resultOp;
-        } finally {
-            unlockComponent(resultOp, containerComponent);
+            return instanceProperties;
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
+            unlockComponent(failed, containerComponent);
         }
     }
 
@@ -2668,20 +2445,17 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
     public Either<ComponentInstance, ResponseFormat> deleteServiceProxy() {
         // TODO Add implementation
-        Either<ComponentInstance, ResponseFormat> result = Either.left(new ComponentInstance());
-        return result;
+        return Either.left(new ComponentInstance());
     }
 
     public Either<ComponentInstance, ResponseFormat> createServiceProxy() {
         // TODO Add implementation
-        Either<ComponentInstance, ResponseFormat> result = Either.left(new ComponentInstance());
-        return result;
+        return Either.left(new ComponentInstance());
     }
 
     public Either<ComponentInstance, ResponseFormat> changeServiceProxyVersion() {
         // TODO Add implementation
-        Either<ComponentInstance, ResponseFormat> result = Either.left(new ComponentInstance());
-        return result;
+        return Either.left(new ComponentInstance());
     }
 
     private Boolean validateInstanceNameUniquenessUponUpdate(Component containerComponent, ComponentInstance oldComponentInstance, String newInstanceName) {
@@ -2753,6 +2527,9 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         if (resourceInstanceForUpdate.getSourceModelUid() == null) {
             resourceInstanceForUpdate.setSourceModelUid(origInstanceForUpdate.getSourceModelUid());
         }
+        if (resourceInstanceForUpdate.getCreatedFrom() == null) {
+            resourceInstanceForUpdate.setCreatedFrom(origInstanceForUpdate.getCreatedFrom());
+        }
         return resourceInstanceForUpdate;
     }
     /**
@@ -2766,43 +2543,29 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
      * @param ownerId
      * @return
      */
-    public Either<List<ComponentInstanceProperty>, ResponseFormat> getComponentInstanceCapabilityPropertiesById(String containerComponentType, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName, String ownerId, String userId) {
+    public List<ComponentInstanceProperty> getComponentInstanceCapabilityPropertiesById(String containerComponentType, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName, String ownerId, String userId) {
 
         Component containerComponent = null;
 
-        Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
+        List<ComponentInstanceProperty> resultOp = null;
         try {
-            validateUserExists(userId, "Get Component Instance Properties By Id", false);
-            if(resultOp == null){
-                Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentType);
-                if (validateComponentType.isRight()) {
-                    resultOp = Either.right(validateComponentType.right().value());
-                }
-            }
-            if(resultOp == null){
-                Either<Component, StorageOperationStatus> validateContainerComponentExists = toscaOperationFacade.getToscaFullElement(containerComponentId);
-                if (validateContainerComponentExists.isRight()) {
-                    resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(validateContainerComponentExists.right().value())));
-                } else {
-                    containerComponent = validateContainerComponentExists.left().value();
-                }
-            }
-            if(resultOp == null){
-                Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
-                if (resourceInstanceStatus.isRight()) {
-                    resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.RESOURCE_INSTANCE_NOT_FOUND_ON_SERVICE, componentInstanceUniqueId, containerComponentId));
-                } else {
-                    resultOp = findCapabilityOfInstance(containerComponentId, componentInstanceUniqueId, capabilityType, capabilityName, ownerId, resourceInstanceStatus.left().value().getCapabilities());
-                }
-            }
-            return resultOp;
-        } finally {
-            unlockComponent(resultOp, containerComponent);
-        }
+            validateUserExists(userId);
+            validateComponentType(containerComponentType);
+            containerComponent = toscaOperationFacade.getToscaFullElement(containerComponentId).left().on(this::componentException);
+            ComponentInstance resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId).left().on(this::componentInstanceException);
+            resultOp = findCapabilityOfInstance(containerComponentId, componentInstanceUniqueId, capabilityType, capabilityName, ownerId, resourceInstanceStatus.getCapabilities());
+        } catch(StorageException e){
+            unlockRollbackWithException(containerComponent, e);
+        } catch (ComponentException e) {
+            unlockRollbackWithException(containerComponent, e);
+        } catch (Exception e){
+            unlockRollbackWithException(containerComponent, new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR));
+        }
+        unlockWithCommit(containerComponent);
+        return resultOp;
     }
 
-    private Either<List<ComponentInstanceProperty>, ResponseFormat> findCapabilityOfInstance( String componentId, String instanceId, String capabilityType, String capabilityName, String ownerId, Map<String, List<CapabilityDefinition>> instanceCapabilities) {
-        Either<List<ComponentInstanceProperty>, ResponseFormat> result = null;
+    private List<ComponentInstanceProperty> findCapabilityOfInstance( String componentId, String instanceId, String capabilityType, String capabilityName, String ownerId, Map<String, List<CapabilityDefinition>> instanceCapabilities) {
         CapabilityDefinition foundCapability;
         if (MapUtils.isNotEmpty(instanceCapabilities)) {
             List<CapabilityDefinition> capabilitiesPerType = instanceCapabilities.get(capabilityType);
@@ -2810,43 +2573,27 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                 Optional<CapabilityDefinition> capabilityOpt = capabilitiesPerType.stream().filter(c -> c.getName().equals(capabilityName) && c.getOwnerId().equals(ownerId)).findFirst();
                 if (capabilityOpt.isPresent()) {
                     foundCapability = capabilityOpt.get();
-                    result = Either.left(foundCapability.getProperties() == null ? new ArrayList<>() : foundCapability.getProperties());
+                    return foundCapability.getProperties() == null ? new ArrayList<>() : foundCapability.getProperties();
                 }
             }
         }
-        if (result == null) {
-            result = fetchComponentInstanceCapabilityProperties(componentId, instanceId, capabilityType, capabilityName, ownerId);
-        }
-        return result;
+        return fetchComponentInstanceCapabilityProperties(componentId, instanceId, capabilityType, capabilityName, ownerId);
     }
 
-    private Either<List<ComponentInstanceProperty>, ResponseFormat> fetchComponentInstanceCapabilityProperties(String componentId, String instanceId, String capabilityType, String capabilityName, String ownerId) {
-        Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
+    private List<ComponentInstanceProperty> fetchComponentInstanceCapabilityProperties(String componentId, String instanceId, String capabilityType, String capabilityName, String ownerId) {
         try {
-            Either<List<ComponentInstanceProperty>, StorageOperationStatus> getComponentInstanceCapabilityProperties = toscaOperationFacade.getComponentInstanceCapabilityProperties(componentId, instanceId, capabilityName, capabilityType, ownerId);
-            if(getComponentInstanceCapabilityProperties != null) {
-                if (getComponentInstanceCapabilityProperties.isRight()) {
-                    resultOp = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getComponentInstanceCapabilityProperties.right().value()), capabilityType, instanceId, componentId));
-                } else {
-                    resultOp = Either.left(getComponentInstanceCapabilityProperties.left().value());
-                }
-            } else {
-                resultOp = Either.left(new ArrayList<>());
-            }
+            return toscaOperationFacade.getComponentInstanceCapabilityProperties(componentId, instanceId, capabilityName, capabilityType, ownerId)
+                    .left()
+                    .on(this::componentInstancePropertyListException);
         } catch(Exception e){
-            log.error("The exception {} occurred upon the component {} instance {} capability {} properties retrieving. ", componentId, instanceId, capabilityName, e);
-            resultOp = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+            log.debug("The exception {} occurred upon the component {} instance {} capability {} properties retrieving. ", componentId, instanceId, capabilityName, e);
+            throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
         }
-        return resultOp;
     }
 
-    private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property, String newValue, Component containerComponent, ComponentInstance foundResourceInstance,
+    /*private ResponseFormat updateCapabilityPropertyOnContainerComponent(ComponentInstanceProperty property, String newValue, Component containerComponent, ComponentInstance foundResourceInstance,
                                                                         String capabilityType, String capabilityName, String ownerId) {
         String componentInstanceUniqueId = foundResourceInstance.getUniqueId();
-        StringBuilder sb = new StringBuilder(componentInstanceUniqueId);
-        sb.append(ModelConverter.CAP_PROP_DELIM).append(property.getOwnerId()).append(ModelConverter.CAP_PROP_DELIM).append(capabilityType).append(ModelConverter.CAP_PROP_DELIM).append(capabilityName);
-        String capKey = sb.toString();
-
         Map<String, List<CapabilityDefinition>> capabilities = Optional.ofNullable(foundResourceInstance.getCapabilities())
                 .orElse(Collections.emptyMap());
         List<CapabilityDefinition> capPerType = Optional.ofNullable(capabilities.get(capabilityType)).orElse(Collections.emptyList());
@@ -2857,6 +2604,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                 Optional<ComponentInstanceProperty> instanceProperty = capProperties.stream().filter(p -> p.getUniqueId().equals(property.getUniqueId())).findAny();
                 StorageOperationStatus status;
                 if (instanceProperty.isPresent()) {
+                    String capKey = ModelConverter.buildCapabilityPropertyKey(foundResourceInstance.getOriginType().isAtomicType(), capabilityType, capabilityName, componentInstanceUniqueId, cap.get());
                     instanceProperty.get().setValue(newValue);
                     List<String> path = new ArrayList<>();
                     path.add(componentInstanceUniqueId);
@@ -2873,13 +2621,13 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             }
         }
         return componentsUtils.getResponseFormat(ActionStatus.OK);
-    }
+    }*/
 
-    public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName, String ownerId,
+    /*public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName, String ownerId,
                                                                                                       List<ComponentInstanceProperty> properties, String userId) {
         Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
 
-        validateUserExists(userId, "update instance capability property", false);
+        validateUserExists(userId);
 
         if (componentTypeEnum == null) {
             BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceCapabilityProperty", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
@@ -2894,7 +2642,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
         Component containerComponent = getResourceResult.left().value();
 
         if (!ComponentValidationUtils.canWorkOnComponent(containerComponent, userId)) {
-            log.info("Restricted operation for user: {sourcePropList} on component {}", userId, containerComponentId);
+            log.info("Restricted operation for user: {} on component {}", userId, containerComponentId);
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
         }
         Either<ComponentInstance, StorageOperationStatus> resourceInstanceStatus = getResourceInstanceById(containerComponent, componentInstanceUniqueId);
@@ -2918,9 +2666,9 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         try {
             for (ComponentInstanceProperty property : properties) {
-                Either<String, ResponseFormat> newPropertyValueEither = updatePropertyObjectValue(property, false);
+                Either<String, ResponseFormat> newPropertyValueEither = validatePropertyObjectValue(property, false);
                 newPropertyValueEither.bimap(updatedValue ->
-                                updateCapabilityPropertyOnContainerComponent(property, updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName, ownerId),
+                        updateCapabilityPropertyOnContainerComponent(property,updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName, ownerId),
                         Either::right);
             }
             Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
@@ -2942,14 +2690,13 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             // unlock resource
             graphLockOperation.unlockComponent(containerComponentId, componentTypeEnum.getNodeType());
         }
-    }
+    }*/
 
     public Either<List<ComponentInstanceProperty>, ResponseFormat> updateInstanceCapabilityProperties(ComponentTypeEnum componentTypeEnum, String containerComponentId, String componentInstanceUniqueId, String capabilityType, String capabilityName,
                                                                                                       List<ComponentInstanceProperty> properties, String userId) {
         Either<List<ComponentInstanceProperty>, ResponseFormat> resultOp = null;
 
-        validateUserExists(userId, "update instance capability property", false);
-
+        validateUserExists(userId);
         if (componentTypeEnum == null) {
             BeEcompErrorManager.getInstance().logInvalidInputError("updateInstanceCapabilityProperty", INVALID_COMPONENT_TYPE, ErrorSeverity.INFO);
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
@@ -2980,9 +2727,9 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         try {
             for (ComponentInstanceProperty property : properties) {
-                Either<String, ResponseFormat> newPropertyValueEither = updatePropertyObjectValue(property, false);
+                Either<String, ResponseFormat> newPropertyValueEither = validatePropertyObjectValue(property, property.getValue(), false);
                 newPropertyValueEither.bimap(updatedValue ->
-                                updateCapabilityPropertyOnContainerComponent(property, updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName),
+                                updateCapabilityPropertyOnContainerComponent(property,updatedValue, containerComponent, foundResourceInstance, capabilityType, capabilityName),
                         Either::right);
             }
             Either<Component, StorageOperationStatus> updateContainerRes = toscaOperationFacade.updateComponentInstanceMetadataOfTopologyTemplate(containerComponent);
@@ -3021,62 +2768,67 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         Component origComponent = getOrigComponent.left().value();
 
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(origComponent, "copyComponentInstance");
-        if (lockComponent.isRight()) {
+        try {
+            lockComponent(origComponent, "copyComponentInstance");
+
+        } catch (ComponentException e) {
             log.error("destComponentInstance's data is {}", origComponent.toString());
-            return Either.right(lockComponent.right().value());
+            return Either.right(componentsUtils.getResponseFormat(
+                    ActionStatus.USER_DEFINED, "Failed to lock component destComponentInstance's data is {}", origComponent.toString()));
         }
 
-
-        Either<ComponentInstance, ResponseFormat> actionResponse = null;
+        boolean failed = false;
+        ComponentInstance actionResponse = null;
         try {
+
             actionResponse = createComponentInstance(
                     "services", containerComponentId, userId, inputComponentInstance, true, false);
 
-            if (actionResponse.isRight()) {
-                log.error(FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS);
-                return Either.right(componentsUtils.getResponseFormat(
-                        ActionStatus.USER_DEFINED, FAILED_TO_COPY_COMP_INSTANCE_TO_CANVAS));
-            }
-
+        } catch (ComponentException e) {
+            failed = true;
+            throw e;
         } finally {
 
             // on failure of the create instance unlock the resource and rollback the transaction.
-            if (null == actionResponse || actionResponse.isRight()) {
+            if (null == actionResponse || failed) {
                 janusGraphDao.rollback();
+                log.error("Failed to copy the component instance to the canvas");
+
+                unlockComponent(failed, origComponent);
+
+                return Either.right(componentsUtils.getResponseFormat(
+                        ActionStatus.USER_DEFINED, "Failed to copy the component instance to the canvas"));
             }
-            unlockComponent(actionResponse, origComponent);
         }
 
         Either<String, ResponseFormat> resultOp = null;
 
         try {
-            ComponentInstance destComponentInstance = actionResponse.left().value();
+            ComponentInstance destComponentInstance = actionResponse;
             log.debug("destComponentInstance's data is {}", destComponentInstance.toString());
 
 
             resultOp = deepCopyComponentInstance(
                     origComponent, containerComponentId, componentInstanceId, destComponentInstance, userId);
 
-            if (resultOp.isRight()) {
-                log.error("Failed to deep copy component instance");
-                return Either.right(componentsUtils.getResponseFormat(
-                        ActionStatus.USER_DEFINED, "Failed to deep copy the component instance to the canvas"));
-            }
             resultMap.put("componentInstance", destComponentInstance);
-            return Either.left(resultMap);
         } finally {
+            // unlock resource
 
             if (resultOp == null || resultOp.isRight()) {
+                unlockComponent(true, origComponent);
                 janusGraphDao.rollback();
-
+                log.error("Failed to deep copy component instance");
+                return Either.right(componentsUtils.getResponseFormat(
+                        ActionStatus.USER_DEFINED, "Failed to deep copy the component instance to the canvas"));
             } else {
+                unlockComponent(false, origComponent);
                 janusGraphDao.commit();
                 log.debug("Success trasaction commit");
             }
-            // unlock resource
-            unlockComponent(resultOp, origComponent);
         }
+
+        return Either.left(resultMap);
     }
 
     private Either<String, ResponseFormat> deepCopyComponentInstance(
@@ -3160,8 +2912,8 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                     log.debug("Now start to update inputs");
 
                     if (sourceProp.getGetInputValues() != null) {
-                        if (sourceProp.getGetInputValues().isEmpty()) {
-                            log.debug("source property input values empty");
+                        if (sourceProp.getGetInputValues().size() < 1) {
+                            log.debug("property is return from input, set by man");
                             break;
                         }
                         log.debug("Now starting to copy the {} property", destPropertyName);
@@ -3243,7 +2995,7 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         Either<ComponentInstanceProperty, ResponseFormat> resultOp = null;
 
-        validateUserExists(userId, "Create or Update attribute value", false);
+        validateUserExists(userId);
 
         if (componentTypeEnum == null) {
             BeEcompErrorManager.getInstance().logInvalidInputError(
@@ -3398,22 +3150,12 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
 
         List<String> deleteErrorIds = new ArrayList<>();
         Map<String, List<String>> deleteErrorMap = new HashMap<>();
-        Either<Component, ResponseFormat> validateResponse = validateUser(containerComponentType, componentId, userId);
-        if (validateResponse.isRight()) {
-            deleteErrorMap.put("deleteFailedIds", componentInstanceIdList);
-            return deleteErrorMap;
-        }
-        Component containerComponent = validateResponse.left().value();
-
-        Either<Boolean, ResponseFormat> lockComponent = lockComponent(
-                containerComponent, "batchDeleteComponentInstance");
-        if (lockComponent.isRight()) {
-            log.error("Failed to lockComponent containerComponent");
-            deleteErrorMap.put("deleteFailedIds", componentInstanceIdList);
-            return deleteErrorMap;
-        }
+        validateUserExists(userId);
+        org.openecomp.sdc.be.model.Component containerComponent = validateComponentExists(componentId, ComponentTypeEnum.findByParamName(containerComponentType), null);
 
+        boolean failed = false;
         try {
+            lockComponent(containerComponent, "batchDeleteComponentInstance");
             for (String eachInstanceId : componentInstanceIdList) {
                 Either<ComponentInstance, ResponseFormat> actionResponse = batchDeleteComponentInstance(
                         containerComponent, containerComponentType, componentId, eachInstanceId);
@@ -3426,35 +3168,12 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
             //sending the ids of the error nodes that were not deleted to UI
             deleteErrorMap.put("deleteFailedIds", deleteErrorIds);
             return deleteErrorMap;
-        } finally {
-            unlockComponent(validateResponse, containerComponent);
-        }
-    }
-
-    private Either<Component, ResponseFormat> validateUser(String containerComponentParam,
-                                                           String containerComponentId,
-                                                           String userId) {
-        validateUserExists(userId, "delete Component Instance", false);
-        Either<ComponentTypeEnum, ResponseFormat> validateComponentType = validateComponentType(containerComponentParam);
-        if (validateComponentType.isRight()) {
-            log.error("ComponentType[{}] doesn't support", containerComponentParam);
-            return Either.right(validateComponentType.right().value());
-        }
-
-        final ComponentTypeEnum containerComponentType = validateComponentType.left().value();
-        Either<Component, ResponseFormat> validateComponentExists = validateComponentExists(
-                containerComponentId, containerComponentType, null);
-        if (validateComponentExists.isRight()) {
-            log.error("Component Id[{}] doesn't exist", containerComponentId);
-            return Either.right(validateComponentExists.right().value());
+        }catch (ComponentException e){
+            failed = true;
+            throw e;
+        }finally {
+            unlockComponent(failed, containerComponent);
         }
-
-        Component containerComponent = validateComponentExists.left().value();
-        Either<Boolean, ResponseFormat> validateCanWorkOnComponent = validateCanWorkOnComponent(containerComponent, userId);
-        if (validateCanWorkOnComponent.isRight()) {
-            return Either.right(validateCanWorkOnComponent.right().value());
-        }
-        return Either.left(containerComponent);
     }
 
     private Either<ComponentInstance, ResponseFormat> batchDeleteComponentInstance(Component containerComponent,
@@ -3462,17 +3181,21 @@ public class ComponentInstanceBusinessLogic extends BaseBusinessLogic {
                                                                                    String containerComponentId,
                                                                                    String componentInstanceId) {
 
-        Either<ComponentInstance, ResponseFormat> resultOp;
+        ComponentInstance resultOp;
         final ComponentTypeEnum containerComponentTypeEnum = ComponentTypeEnum.findByParamName(containerComponentType);
 
-        resultOp = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentTypeEnum);
-
-        if (resultOp.isRight()) {
+        boolean failed = false;
+        try {
+            resultOp = deleteComponentInstance(containerComponent, componentInstanceId, containerComponentTypeEnum);
+            log.info("Successfully deleted instance with id {}", componentInstanceId);
+            return Either.left(resultOp);
+        }
+        catch (ComponentException e){
             log.error("Failed to deleteComponentInstance with instanceId[{}]", componentInstanceId);
-            return Either.right(resultOp.right().value());
+            return Either.right(new ResponseFormat());
         }
 
-        log.info("Successfully deleted instance with id {}", componentInstanceId);
-        return Either.left(resultOp.left().value());
+
     }
+
 }