Merge "Allow to declare a property as an output" into 20.3
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java
index fe87a65..4230358 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/BaseBusinessLogic.java
@@ -57,6 +57,7 @@
 import org.openecomp.sdc.be.model.ArtifactDefinition;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstInputsMap;
+import org.openecomp.sdc.be.model.ComponentInstOutputsMap;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.ComponentParametersView;
@@ -129,8 +130,10 @@
     DataTypeValidatorConverter dataTypeValidatorConverter = DataTypeValidatorConverter.getInstance();
 
     public BaseBusinessLogic(IElementOperation elementDao, IGroupOperation groupOperation,
-        IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation, InterfaceOperation interfaceOperation,
-        InterfaceLifecycleOperation interfaceLifecycleTypeOperation, ArtifactsOperations artifactToscaOperation) {
+                             IGroupInstanceOperation groupInstanceOperation, IGroupTypeOperation groupTypeOperation,
+                             InterfaceOperation interfaceOperation,
+                             InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+                             ArtifactsOperations artifactToscaOperation) {
         this.elementDao = elementDao;
         this.groupOperation = groupOperation;
         this.groupInstanceOperation = groupInstanceOperation;
@@ -219,11 +222,11 @@
         lockComponent(component.getUniqueId(), component, ecompErrorContext);
     }
 
-    protected boolean isVolumeGroup(List<String> artifactsInGroup,List <ArtifactDefinition> deploymentArtifacts) {
+    protected boolean isVolumeGroup(List<String> artifactsInGroup, List<ArtifactDefinition> deploymentArtifacts) {
         for (String artifactId : artifactsInGroup) {
             ArtifactDefinition artifactDef = ArtifactUtils.findArtifactInList(deploymentArtifacts, artifactId);
             if (artifactDef != null
-                    && artifactDef.getArtifactType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
+                && artifactDef.getArtifactType().equalsIgnoreCase(ArtifactTypeEnum.HEAT_VOL.getType())) {
                 return true;
             }
         }
@@ -231,14 +234,14 @@
     }
 
     protected void lockComponent(Component component, boolean shouldLock, String ecompErrorContext) {
-        if(shouldLock){
+        if (shouldLock) {
             lockComponent(component.getUniqueId(), component, ecompErrorContext);
         }
     }
 
     protected void lockComponent(String componentId, Component component, String ecompErrorContext) {
         ActionStatus lock = lockElement(componentId, component, ecompErrorContext);
-        if (lock!= ActionStatus.OK) {
+        if (lock != ActionStatus.OK) {
             logAndThrowComponentException(lock, component.getUniqueId(), component.getName());
         }
     }
@@ -249,7 +252,7 @@
         }
     }
 
-    private ResponseFormat logAndThrowComponentException(ActionStatus status, String componentId, String name){
+    private ResponseFormat logAndThrowComponentException(ActionStatus status, String componentId, String name) {
         log.debug(FAILED_TO_LOCK_COMPONENT_ERROR, componentId, status);
         throw new ByActionStatusComponentException(status, name);
     }
@@ -262,7 +265,8 @@
         if (lockResourceStatus == StorageOperationStatus.OK) {
             return ActionStatus.OK;
         } else {
-            BeEcompErrorManager.getInstance().logBeFailedLockObjectError(ecompErrorContext, nodeType.getName(), componentId);
+            BeEcompErrorManager.getInstance()
+                .logBeFailedLockObjectError(ecompErrorContext, nodeType.getName(), componentId);
             return componentsUtils.convertFromStorageResponse(lockResourceStatus, componentType);
         }
     }
@@ -280,16 +284,18 @@
             }
             // unlock resource
             graphLockOperation.unlockComponent(component.getUniqueId(), nodeType);
+        } else {
+            log.debug("component is NULL");
         }
-        else log.debug("component is NULL");
     }
 
     protected void unlockComponent(boolean failed, Component component) {
         unlockComponent(failed, component, false);
     }
+
     void unlockComponentById(boolean failed, String componentId) {
         Either<Component, StorageOperationStatus> component = toscaOperationFacade.getToscaElement(componentId);
-        if(component.isLeft()) {
+        if (component.isLeft()) {
             unlockComponent(failed, component.left().value(), false);
         }
     }
@@ -314,10 +320,12 @@
         }
     }
 
-    Component validateComponentExists(String componentId, ComponentTypeEnum componentType, ComponentParametersView filter) {
+    Component validateComponentExists(String componentId, ComponentTypeEnum componentType,
+                                      ComponentParametersView filter) {
 
-        Either<Component, StorageOperationStatus> toscaElement = toscaOperationFacade.getToscaElement(componentId, filter == null ? new ComponentParametersView() : filter);
-        if(toscaElement.isRight()){
+        Either<Component, StorageOperationStatus> toscaElement = toscaOperationFacade
+            .getToscaElement(componentId, filter == null ? new ComponentParametersView() : filter);
+        if (toscaElement.isRight()) {
             handleGetComponentError(componentId, componentType, toscaElement.right().value());
         }
         return validateComponentType(toscaElement.left().value(), componentType);
@@ -326,7 +334,8 @@
     private Component validateComponentType(Component cmpt, ComponentTypeEnum componentType) {
         if (componentType != cmpt.getComponentType()) {
             log.debug("component {} is not of requested type {}", cmpt.getUniqueId(), componentType);
-            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, componentType));
+            throw new ByActionStatusComponentException(
+                componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND, componentType));
         }
         return cmpt;
     }
@@ -335,21 +344,24 @@
         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);
-            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status)));
+            BeEcompErrorManager.getInstance().logInternalFlowError("UpdatePropertyValueOnComponentInstance",
+                "Failed to update property value on instance. Status is " + status, ErrorSeverity.ERROR);
+            throw new ByActionStatusComponentException(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(propertyType, (String) property.getValue(), true,
-                        innerType, allDataTypes);
+            propertyOperation.validateAndUpdatePropertyValue(propertyType, (String) property.getValue(), true,
+                innerType, allDataTypes);
         String newValue = property.getValue();
         if (isValid.isRight()) {
             Boolean res = isValid.right().value();
             if (Boolean.FALSE.equals(res)) {
-                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
+                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(DaoStatusConverter
+                    .convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
             }
         } else {
             Object object = isValid.left().value();
@@ -360,19 +372,21 @@
         return newValue;
     }
 
-    <T extends PropertyDataDefinition> String getInnerType(T property){
+    <T extends PropertyDataDefinition> String getInnerType(T property) {
         ToscaPropertyType type = ToscaPropertyType.isValidType(property.getType());
         log.debug("#getInnerType - The type of the property {} is {}", property.getUniqueId(), property.getType());
         String innerType = null;
         if (type == ToscaPropertyType.LIST || type == ToscaPropertyType.MAP) {
             if (property.getSchema() == null) {
                 log.debug(SCHEMA_DOESN_T_EXISTS_FOR_PROPERTY_OF_TYPE, type);
-                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE));
+                throw new ByActionStatusComponentException(
+                    componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE));
             }
             PropertyDataDefinition innerProperty = property.getSchema().getProperty();
             if (innerProperty == null) {
                 log.debug(PROPERTY_IN_SCHEMA_DEFINITION_INSIDE_PROPERTY_OF_TYPE_DOESN_T_EXIST, type);
-                throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE));
+                throw new ByActionStatusComponentException(
+                    componentsUtils.convertFromStorageResponse(StorageOperationStatus.INVALID_VALUE));
             }
             innerType = innerProperty.getType();
         }
@@ -382,7 +396,7 @@
     public void validateCanWorkOnComponent(Component component, String userId) {
         ActionStatus actionStatus = ActionStatus.RESTRICTED_OPERATION;
         // verify resource is not archived
-        if (component.isArchived() == true){
+        if (component.isArchived() == true) {
             actionStatus = ActionStatus.COMPONENT_IS_ARCHIVED;
             throw new ByActionStatusComponentException(actionStatus, component.getName());
         }
@@ -401,7 +415,8 @@
         // verify component last update user is the current user
         String lastUpdaterUserId = component.getLastUpdaterUserId();
         if (!userId.equals(lastUpdaterUserId)) {
-            log.debug("Current user is not last updater, last updater userId: {}, current user userId: {}", lastUpdaterUserId, userId);
+            log.debug("Current user is not last updater, last updater userId: {}, current user userId: {}",
+                lastUpdaterUserId, userId);
             throw new ByActionStatusComponentException(actionStatus);
         }
 
@@ -428,37 +443,44 @@
     }
 
 
-
     protected Map<String, DataTypeDefinition> getAllDataTypes(ApplicationDataTypeCache applicationDataTypeCache) {
-        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = applicationDataTypeCache.getAll();
+        Either<Map<String, DataTypeDefinition>, JanusGraphOperationStatus> allDataTypes = applicationDataTypeCache
+            .getAll();
         if (allDataTypes.isRight()) {
             JanusGraphOperationStatus operationStatus = allDataTypes.right().value();
             if (operationStatus == JanusGraphOperationStatus.NOT_FOUND) {
-                BeEcompErrorManager.getInstance().logInternalDataError("FetchDataTypes", "Data types are not loaded", ErrorSeverity.ERROR);
+                BeEcompErrorManager.getInstance()
+                    .logInternalDataError("FetchDataTypes", "Data types are not loaded", ErrorSeverity.ERROR);
                 throw new ByActionStatusComponentException(ActionStatus.DATA_TYPE_CANNOT_BE_EMPTY);
             } else {
-                BeEcompErrorManager.getInstance().logInternalFlowError("FetchDataTypes", "Failed to fetch data types", ErrorSeverity.ERROR);
+                BeEcompErrorManager.getInstance()
+                    .logInternalFlowError("FetchDataTypes", "Failed to fetch data types", ErrorSeverity.ERROR);
                 throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
             }
         }
         return allDataTypes.left().value();
     }
 
-    Either<Boolean, ResponseFormat> validatePropertyDefaultValue(IComplexDefaultValue property, Map<String, DataTypeDefinition> dataTypes) {
+    Either<Boolean, ResponseFormat> validatePropertyDefaultValue(IComplexDefaultValue property,
+                                                                 Map<String, DataTypeDefinition> dataTypes) {
         String type;
         String innerType = null;
         if (!propertyOperation.isPropertyTypeValid(property, dataTypes.values())) {
             log.info("Invalid type for property '{}' type '{}'", property.getName(), property.getType());
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_PROPERTY_TYPE, property.getType(), property.getName());
+            ResponseFormat responseFormat = componentsUtils
+                .getResponseFormat(ActionStatus.INVALID_PROPERTY_TYPE, property.getType(), property.getName());
             return Either.right(responseFormat);
         }
         type = property.getType();
         if (type.equals(ToscaPropertyType.LIST.getType()) || type.equals(ToscaPropertyType.MAP.getType())) {
-            ImmutablePair<String, Boolean> propertyInnerTypeValid = propertyOperation.isPropertyInnerTypeValid(property, dataTypes);
+            ImmutablePair<String, Boolean> propertyInnerTypeValid = propertyOperation
+                .isPropertyInnerTypeValid(property, dataTypes);
             innerType = propertyInnerTypeValid.getLeft();
             if (!propertyInnerTypeValid.getRight()) {
-                log.info("Invalid inner type for property '{}' type '{}', dataTypeCount '{}'", property.getName(), property.getType(), dataTypes.size());
-                ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_PROPERTY_INNER_TYPE, innerType, property.getName());
+                log.info("Invalid inner type for property '{}' type '{}', dataTypeCount '{}'", property.getName(),
+                    property.getType(), dataTypes.size());
+                ResponseFormat responseFormat = componentsUtils
+                    .getResponseFormat(ActionStatus.INVALID_PROPERTY_INNER_TYPE, innerType, property.getName());
                 return Either.right(responseFormat);
             }
         }
@@ -466,10 +488,12 @@
             log.info("Invalid default value for property '{}' type '{}'", property.getName(), property.getType());
             ResponseFormat responseFormat;
             if (type.equals(ToscaPropertyType.LIST.getType()) || type.equals(ToscaPropertyType.MAP.getType())) {
-                responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_COMPLEX_DEFAULT_VALUE, property.getName(), type, innerType,
+                responseFormat = componentsUtils
+                    .getResponseFormat(ActionStatus.INVALID_COMPLEX_DEFAULT_VALUE, property.getName(), type, innerType,
                         property.getDefaultValue());
             } else {
-                responseFormat = componentsUtils.getResponseFormat(ActionStatus.INVALID_DEFAULT_VALUE, property.getName(), type,
+                responseFormat = componentsUtils
+                    .getResponseFormat(ActionStatus.INVALID_DEFAULT_VALUE, property.getName(), type,
                         property.getDefaultValue());
             }
             return Either.right(responseFormat);
@@ -500,15 +524,18 @@
         }
     }
 
-    void validateComponentTypeEnum(ComponentTypeEnum componentTypeEnum, String errorContext, Wrapper<ResponseFormat> errorWrapper) {
+    void validateComponentTypeEnum(ComponentTypeEnum componentTypeEnum, String errorContext,
+                                   Wrapper<ResponseFormat> errorWrapper) {
         if (componentTypeEnum == null) {
-            BeEcompErrorManager.getInstance().logInvalidInputError(errorContext, "invalid component type", ErrorSeverity.INFO);
+            BeEcompErrorManager.getInstance()
+                .logInvalidInputError(errorContext, "invalid component type", ErrorSeverity.INFO);
             errorWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.NOT_ALLOWED));
         }
 
     }
 
-    protected void validateCanWorkOnComponent(String componentId, ComponentTypeEnum componentTypeEnum, String userId, Wrapper<ResponseFormat> errorWrapper) {
+    protected void validateCanWorkOnComponent(String componentId, ComponentTypeEnum componentTypeEnum, String userId,
+                                              Wrapper<ResponseFormat> errorWrapper) {
         if (!ComponentValidationUtils.canWorkOnComponent(componentId, toscaOperationFacade, userId)) {
             log.info("Restricted operation for user {} on {} {}", userId, componentTypeEnum.getValue(), componentId);
             errorWrapper.setInnerElement(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
@@ -516,11 +543,14 @@
 
     }
 
-    void validateComponentLock(String componentId, ComponentTypeEnum componentTypeEnum, Wrapper<ResponseFormat> errorWrapper) {
-        StorageOperationStatus lockStatus = graphLockOperation.lockComponent(componentId, componentTypeEnum.getNodeType());
+    void validateComponentLock(String componentId, ComponentTypeEnum componentTypeEnum,
+                               Wrapper<ResponseFormat> errorWrapper) {
+        StorageOperationStatus lockStatus = graphLockOperation
+            .lockComponent(componentId, componentTypeEnum.getNodeType());
         if (lockStatus != StorageOperationStatus.OK) {
             log.debug("Failed to lock {} {}", componentTypeEnum.getValue(), componentId);
-            errorWrapper.setInnerElement(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
+            errorWrapper.setInnerElement(
+                componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(lockStatus)));
         }
 
     }
@@ -539,7 +569,8 @@
         }
     }
 
-    protected Either<Boolean, ResponseFormat> lockComponentByName(String name, Component component, String ecompErrorContext) {
+    protected Either<Boolean, ResponseFormat> lockComponentByName(String name, Component component,
+                                                                  String ecompErrorContext) {
         ComponentTypeEnum componentType = component.getComponentType();
         NodeTypeEnum nodeType = componentType.getNodeType();
         StorageOperationStatus lockResourceStatus = graphLockOperation.lockComponentByName(name, nodeType);
@@ -555,36 +586,40 @@
         }
     }
 
-    protected Component validateComponentExistsByFilter(String componentId, ComponentTypeEnum componentType, ComponentParametersView componentParametersView) {
+    protected Component validateComponentExistsByFilter(String componentId, ComponentTypeEnum componentType,
+                                                        ComponentParametersView componentParametersView) {
         return toscaOperationFacade.getToscaElement(componentId, componentParametersView)
-                .left()
-                .on(err -> handleGetComponentError(componentId, componentType, err));
+            .left()
+            .on(err -> handleGetComponentError(componentId, componentType, err));
 
     }
 
-    private Component handleGetComponentError(String componentId, ComponentTypeEnum componentType, StorageOperationStatus getComponentError) {
+    private Component handleGetComponentError(String componentId, ComponentTypeEnum componentType,
+                                              StorageOperationStatus getComponentError) {
         ActionStatus actionStatus = componentsUtils.convertFromStorageResponse(getComponentError, componentType);
         log.debug("error fetching component with id {}. error status: {}", componentId, getComponentError);
         throw new ByActionStatusComponentException(actionStatus, componentId);
     }
 
     @SafeVarargs
-    static <T extends Enum<T>> boolean enumHasValueFilter(String name, Function<String, T> enumGetter, T... enumValues) {
+    static <T extends Enum<T>> boolean enumHasValueFilter(String name, Function<String, T> enumGetter,
+                                                          T... enumValues) {
         T enumFound = enumGetter.apply(name);
         return Arrays.asList(enumValues).contains(enumFound);
     }
 
     String validatePropValueBeforeCreate(IPropertyInputCommon property, String value, boolean isValidate,
-        Map<String, DataTypeDefinition> allDataTypes) {
+                                         Map<String, DataTypeDefinition> allDataTypes) {
         String propertyType = property.getType();
         String updatedInnerType = updateInnerType(property);
-        Either<Object, Boolean> isValid = validateAndUpdatePropertyValue(propertyType, value, isValidate, updatedInnerType, allDataTypes);
+        Either<Object, Boolean> isValid = validateAndUpdatePropertyValue(propertyType, value, isValidate,
+            updatedInnerType, allDataTypes);
         String newValue = value;
         if (isValid.isRight()) {
             Boolean res = isValid.right().value();
             if (Boolean.FALSE.equals(res)) {
                 throw new StorageException(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(
-                        JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
+                    JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
             }
         } else {
             Object object = isValid.left().value();
@@ -592,12 +627,14 @@
                 newValue = object.toString();
             }
         }
-        ImmutablePair<String, Boolean> pair = validateAndUpdateRules(propertyType, property.getRules(), updatedInnerType, allDataTypes, isValidate);
+        ImmutablePair<String, Boolean> pair = validateAndUpdateRules(propertyType, property.getRules(),
+            updatedInnerType, allDataTypes, isValidate);
         log.trace("After validateAndUpdateRules. pair = {}", pair);
         if (Boolean.FALSE.equals(pair.getRight())) {
-            BeEcompErrorManager.getInstance().logBeInvalidValueError(ADD_PROPERTY_VALUE, pair.getLeft(), property.getName(), propertyType);
+            BeEcompErrorManager.getInstance()
+                .logBeInvalidValueError(ADD_PROPERTY_VALUE, pair.getLeft(), property.getName(), propertyType);
             throw new StorageException(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(
-                    JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
+                JanusGraphOperationStatus.ILLEGAL_ARGUMENT));
         }
         return newValue;
     }
@@ -622,11 +659,13 @@
 
     private void failOnIllegalArgument() {
         throw new ByActionStatusComponentException(
-                componentsUtils.convertFromStorageResponse(
-                        DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
+            componentsUtils.convertFromStorageResponse(
+                DaoStatusConverter.convertJanusGraphStatusToStorageStatus(JanusGraphOperationStatus.ILLEGAL_ARGUMENT)));
     }
 
-    public Either<Object, Boolean> validateAndUpdatePropertyValue(String propertyType, String value, boolean isValidate, String innerType, Map<String, DataTypeDefinition> dataTypes) {
+    public Either<Object, Boolean> validateAndUpdatePropertyValue(String propertyType, String value, boolean isValidate,
+                                                                  String innerType,
+                                                                  Map<String, DataTypeDefinition> dataTypes) {
         log.trace("Going to validate property value and its type. type = {}, value = {}", propertyType, value);
         ToscaPropertyType type = getType(propertyType);
 
@@ -634,7 +673,8 @@
 
             if (type == null) {
                 DataTypeDefinition dataTypeDefinition = dataTypes.get(propertyType);
-                ImmutablePair<JsonElement, Boolean> validateResult = dataTypeValidatorConverter.validateAndUpdate(value, dataTypeDefinition, dataTypes);
+                ImmutablePair<JsonElement, Boolean> validateResult = dataTypeValidatorConverter
+                    .validateAndUpdate(value, dataTypeDefinition, dataTypes);
                 if (Boolean.FALSE.equals(validateResult.right)) {
                     log.debug(THE_VALUE_OF_PROPERTY_FROM_TYPE_IS_INVALID, value, propertyType);
                     return Either.right(false);
@@ -658,7 +698,10 @@
         return Either.left(convertedValue);
     }
 
-    private ImmutablePair<String, Boolean> validateAndUpdateRules(String propertyType, List<PropertyRule> rules, String innerType, Map<String, DataTypeDefinition> dataTypes, boolean isValidate) {
+    private ImmutablePair<String, Boolean> validateAndUpdateRules(String propertyType, List<PropertyRule> rules,
+                                                                  String innerType,
+                                                                  Map<String, DataTypeDefinition> dataTypes,
+                                                                  boolean isValidate) {
 
         if (rules == null || rules.isEmpty()) {
             return ImmutablePair.of(null, true);
@@ -666,7 +709,8 @@
 
         for (PropertyRule rule : rules) {
             String value = rule.getValue();
-            Either<Object, Boolean> updateResult = validateAndUpdatePropertyValue(propertyType, value, isValidate, innerType, dataTypes);
+            Either<Object, Boolean> updateResult = validateAndUpdatePropertyValue(propertyType, value, isValidate,
+                innerType, dataTypes);
             if (updateResult.isRight()) {
                 Boolean status = updateResult.right().value();
                 if (Boolean.FALSE.equals(status)) {
@@ -685,7 +729,8 @@
         return ImmutablePair.of(null, true);
     }
 
-    protected boolean isValidValue(ToscaPropertyType type, String value, String innerType, Map<String, DataTypeDefinition> dataTypes) {
+    protected boolean isValidValue(ToscaPropertyType type, String value, String innerType,
+                                   Map<String, DataTypeDefinition> dataTypes) {
         if (isEmptyValue(value)) {
             return true;
         }
@@ -714,21 +759,38 @@
         throw new ByActionStatusComponentException(actionStatus, params);
     }
 
-    public  <T extends ToscaDataDefinition> Either<List<T>, ResponseFormat> declareProperties(String userId, String componentId,
-                                                                                              ComponentTypeEnum componentTypeEnum, ComponentInstInputsMap componentInstInputsMap) {
+    public <T extends ToscaDataDefinition> Either<List<T>, ResponseFormat> declareProperties(String userId,
+                                                                                             String componentId,
+                                                                                             ComponentTypeEnum componentTypeEnum,
+                                                                                             ComponentInstInputsMap componentInstInputsMap) {
+
+        return Either.left(new ArrayList<>());
+    }
+
+    public <T extends ToscaDataDefinition> Either<List<T>, ResponseFormat> declareOutputProperties(
+        final String userId, final String componentId, final ComponentTypeEnum componentTypeEnum,
+        final ComponentInstOutputsMap componentInstOutputsMap) {
 
         return Either.left(new ArrayList<>());
     }
 
     public <T extends PropertyDataDefinition> List<PropertyConstraint> setInputConstraint(T inputDefinition) {
         if (StringUtils.isNotBlank(inputDefinition.getParentPropertyType())
-                && StringUtils.isNotBlank(inputDefinition.getSubPropertyInputPath())) {
+            && StringUtils.isNotBlank(inputDefinition.getSubPropertyInputPath())) {
             return setConstraint(inputDefinition);
         }
 
         return Collections.emptyList();
     }
 
+    public <T extends PropertyDataDefinition> List<PropertyConstraint> setOutputConstraint(final T outputDefinition) {
+        if (StringUtils.isNotBlank(outputDefinition.getParentPropertyType()) &&
+            StringUtils.isNotBlank(outputDefinition.getSubPropertyOutputPath())) {
+            return setConstraint(outputDefinition);
+        }
+        return Collections.emptyList();
+    }
+
     private <T extends PropertyDataDefinition> List<PropertyConstraint> setConstraint(T inputDefinition) {
         List<PropertyConstraint> constraints = new ArrayList<>();
         String[] inputPathArr = inputDefinition.getSubPropertyInputPath().split("#");
@@ -737,17 +799,17 @@
         }
 
         Map<String, DataTypeDefinition> dataTypeDefinitionMap =
-                applicationDataTypeCache.getAll().left().value();
+            applicationDataTypeCache.getAll().left().value();
 
         String propertyType = inputDefinition.getParentPropertyType();
 
         for (String anInputPathArr : inputPathArr) {
             if (ToscaType.isPrimitiveType(propertyType)) {
                 constraints.addAll(
-                        dataTypeDefinitionMap.get(propertyType).getConstraints());
+                    dataTypeDefinitionMap.get(propertyType).getConstraints());
             } else if (!ToscaType.isCollectionType(propertyType)) {
                 propertyType = setConstraintForComplexType(dataTypeDefinitionMap, propertyType, anInputPathArr,
-                        constraints);
+                    constraints);
             }
         }
 
@@ -760,7 +822,7 @@
                                                List<PropertyConstraint> constraints) {
         String type = null;
         List<PropertyDefinition> propertyDefinitions =
-                dataTypeDefinitionMap.get(propertyType).getProperties();
+            dataTypeDefinitionMap.get(propertyType).getProperties();
         for (PropertyDefinition propertyDefinition : propertyDefinitions) {
             if (propertyDefinition.getName().equals(anInputPathArr)) {
                 if (ToscaType.isPrimitiveType(propertyDefinition.getType())) {
@@ -792,7 +854,7 @@
         throw e;
     }
 
-    protected void unlockWithCommit(Component component){
+    protected void unlockWithCommit(Component component) {
         ComponentTypeEnum componentType = component.getComponentType();
         NodeTypeEnum nodeType = componentType.getNodeType();
         janusGraphDao.commit();
@@ -819,7 +881,8 @@
         throw new ByResponseFormatComponentException(responseFormat);
     }
 
-    protected List<ComponentInstanceProperty> componentInstancePropertyListException(StorageOperationStatus storageOperationStatus) {
+    protected List<ComponentInstanceProperty> componentInstancePropertyListException(
+        StorageOperationStatus storageOperationStatus) {
         throw new StorageException(storageOperationStatus);
     }
 
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
index 3f48328..c363339 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ComponentInstanceBusinessLogic.java
@@ -21,6 +21,7 @@
 package org.openecomp.sdc.be.components.impl;
 
 import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
+import static org.openecomp.sdc.be.components.property.GetOutputUtils.isGetOutputValueForOutput;
 import static org.openecomp.sdc.be.components.utils.PropertiesUtils.getPropertyCapabilityOfChildInstance;
 
 import com.google.common.collect.Sets;
@@ -61,11 +62,11 @@
 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.model.jsonjanusgraph.config.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.GetAttributeValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
@@ -84,6 +85,7 @@
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
 import org.openecomp.sdc.be.model.ComponentInstanceInput;
+import org.openecomp.sdc.be.model.ComponentInstanceOutput;
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.ComponentParametersView;
@@ -100,6 +102,7 @@
 import org.openecomp.sdc.be.model.Resource;
 import org.openecomp.sdc.be.model.Service;
 import org.openecomp.sdc.be.model.User;
+import org.openecomp.sdc.be.model.jsonjanusgraph.config.ContainerInstanceTypesData;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ForwardingPathOperation;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
@@ -312,6 +315,33 @@
 
     }
 
+    public List<ComponentInstanceOutput> getComponentInstanceOutputsByOutputId(final Component component,
+                                                                               final String outputId) {
+        final List<ComponentInstanceOutput> componentInstanceOutputs = new ArrayList<>();
+        final Map<String, List<ComponentInstanceOutput>> componentInstancesOutputsMap = component
+            .getComponentInstancesOutputs();
+        if (componentInstancesOutputsMap != null && !componentInstancesOutputsMap.isEmpty()) {
+            componentInstancesOutputsMap.forEach(new BiConsumer<String, List<ComponentInstanceOutput>>() {
+                @Override
+                public void accept(String s, List<ComponentInstanceOutput> outputList) {
+                    String componentInstanceName = "";
+                    final Optional<ComponentInstance> componentInstanceOptional = component.getComponentInstances()
+                        .stream().filter(ci -> ci.getUniqueId().equals(s)).findAny();
+                    if (componentInstanceOptional.isPresent()) {
+                        componentInstanceName = componentInstanceOptional.get().getName();
+                    }
+                    if (outputList != null && !outputList.isEmpty()) {
+                        for (final ComponentInstanceOutput output : outputList) {
+                            addComponentInstanceOutput(s, componentInstanceName, output, output.getGetAttributeValues(), outputId,
+                                componentInstanceOutputs);
+                        }
+                    }
+                }
+            });
+        }
+        return componentInstanceOutputs;
+    }
+
     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){
@@ -325,6 +355,23 @@
         }
     }
 
+    private void addComponentInstanceOutput(final String uniqueId, final String ciName,
+                                            final ComponentInstanceOutput prop,
+                                            final List<GetAttributeValueDataDefinition> outputsValues,
+                                            final String outputId,
+                                            final List<ComponentInstanceOutput> componentInstanceOutputList) {
+        if (outputsValues != null && !outputsValues.isEmpty()) {
+            for (final GetAttributeValueDataDefinition outputData : outputsValues) {
+                if (isGetOutputValueForOutput(outputData, outputId)) {
+                    prop.setComponentInstanceId(uniqueId);
+                    prop.setComponentInstanceName(ciName);
+                    componentInstanceOutputList.add(prop);
+                    break;
+                }
+            }
+        }
+    }
+
     public ComponentInstance createComponentInstance(final String containerComponentParam,
                                                      final String containerComponentId, final String userId,
                                                      final ComponentInstance resourceInstance, final boolean needLock) {
@@ -675,8 +722,8 @@
         }
         resourceInstance.setProperties(PropertiesUtils.getProperties(service));
 
-        final List<InputDefinition> serviceInputs = service.getInputs();
-        resourceInstance.setInputs(serviceInputs);
+        resourceInstance.setInputs(service.getInputs());
+        resourceInstance.setOutputs(service.getOutputs());
         resourceInstance.setSourceModelInvariant(service.getInvariantUUID());
         resourceInstance.setSourceModelName(service.getName());
         resourceInstance.setSourceModelUuid(service.getUUID());
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/OutputsBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/OutputsBusinessLogic.java
new file mode 100644
index 0000000..7f6072b
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/OutputsBusinessLogic.java
@@ -0,0 +1,254 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2020, Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.impl;
+
+import fj.data.Either;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+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.property.PropertyDeclarationOrchestrator;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.dao.utils.MapUtil;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstOutputsMap;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ArtifactsOperations;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.InterfaceOperation;
+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.InterfaceLifecycleOperation;
+import org.openecomp.sdc.common.log.elements.LoggerSupportability;
+import org.openecomp.sdc.common.log.enums.EcompLoggerErrorCode;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.openecomp.sdc.exception.ResponseFormat;
+import org.springframework.beans.factory.annotation.Autowired;
+
+@org.springframework.stereotype.Component("outputsBusinessLogic")
+public class OutputsBusinessLogic extends BaseBusinessLogic {
+
+    private static final String CREATE_OUTPUT = "CreateOutput";
+
+    private static final Logger log = Logger.getLogger(OutputsBusinessLogic.class);
+    private static final String FAILED_TO_FIND_COMPONENT_ERROR = "Failed to find component %s, error: %s";
+    private static final String FAILED_TO_FIND_OUTPUT_UNDER_COMPONENT_ERROR = "Failed to find output %s under component %s, error: %s";
+    private static final String GOING_TO_EXECUTE_ROLLBACK_ON_CREATE_GROUP = "Going to execute rollback on create group.";
+    private static final String GOING_TO_EXECUTE_COMMIT_ON_CREATE_GROUP = "Going to execute commit on create group.";
+    private static final LoggerSupportability loggerSupportability = LoggerSupportability.getLogger(
+        OutputsBusinessLogic.class.getName());
+
+    private final PropertyDeclarationOrchestrator propertyDeclarationOrchestrator;
+    private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
+    private final DataTypeBusinessLogic dataTypeBusinessLogic;
+
+    @Autowired
+    public OutputsBusinessLogic(IElementOperation elementDao,
+                                IGroupOperation groupOperation,
+                                IGroupInstanceOperation groupInstanceOperation,
+                                IGroupTypeOperation groupTypeOperation,
+                                InterfaceOperation interfaceOperation,
+                                InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
+                                PropertyDeclarationOrchestrator propertyDeclarationOrchestrator,
+                                ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
+                                DataTypeBusinessLogic dataTypeBusinessLogic,
+                                ArtifactsOperations artifactToscaOperation) {
+        super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation,
+            interfaceOperation, interfaceLifecycleTypeOperation, artifactToscaOperation);
+        this.propertyDeclarationOrchestrator = propertyDeclarationOrchestrator;
+        this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
+        this.dataTypeBusinessLogic = dataTypeBusinessLogic;
+    }
+
+    @Override
+    public Either<List<OutputDefinition>, ResponseFormat> declareOutputProperties(final String userId,
+                                                                                  final String componentId,
+                                                                                  final ComponentTypeEnum componentTypeEnum,
+                                                                                  final ComponentInstOutputsMap componentInstOutputsMap) {
+
+        return createMultipleOutputs(userId, componentId, componentTypeEnum, componentInstOutputsMap, true, false);
+    }
+
+    private Either<List<OutputDefinition>, ResponseFormat> createMultipleOutputs(final String userId,
+                                                                                 final String componentId,
+                                                                                 final ComponentTypeEnum componentType,
+                                                                                 final ComponentInstOutputsMap componentInstOutputsMapUi,
+                                                                                 final boolean shouldLockComp,
+                                                                                 final boolean inTransaction) {
+
+        Either<List<OutputDefinition>, ResponseFormat> result = null;
+        Component component = null;
+        try {
+            validateUserExists(userId);
+            component = getAndValidateComponentForCreate(userId, componentId, componentType, shouldLockComp);
+            result = propertyDeclarationOrchestrator.declarePropertiesToOutputs(component, componentInstOutputsMapUi)
+                .left()
+                .bind(outputsToCreate -> prepareOutputsForCreation(userId, componentId, outputsToCreate))
+                .right()
+                .map(componentsUtils::getResponseFormat);
+
+            return result;
+
+        } catch (final ByResponseFormatComponentException e) {
+            log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, getClass().getName(),
+                "Failed to createMultipleOutputs: Exception thrown: ", e);
+            result = Either.right(e.getResponseFormat());
+            return result;
+        } finally {
+            if (!inTransaction) {
+                if (result == null || result.isRight()) {
+                    log.debug(GOING_TO_EXECUTE_ROLLBACK_ON_CREATE_GROUP);
+                    janusGraphDao.rollback();
+                } else {
+                    log.debug(GOING_TO_EXECUTE_COMMIT_ON_CREATE_GROUP);
+                    janusGraphDao.commit();
+                }
+            }
+            if (shouldLockComp && component != null) {
+                graphLockOperation.unlockComponent(componentId, componentType.getNodeType());
+            }
+
+        }
+    }
+
+    private Component getAndValidateComponentForCreate(final String userId,
+                                                       final String componentId,
+                                                       final ComponentTypeEnum componentType,
+                                                       final boolean shouldLockComp) {
+        final ComponentParametersView componentParametersView = getBaseComponentParametersView();
+        final Component component = validateComponentExists(componentId, componentType, componentParametersView);
+        if (shouldLockComp) {
+            lockComponent(component, CREATE_OUTPUT);
+        }
+        validateCanWorkOnComponent(component, userId);
+        return component;
+    }
+
+    private Either<List<OutputDefinition>, StorageOperationStatus> prepareOutputsForCreation(final String userId,
+                                                                                             final String componentId,
+                                                                                             final List<OutputDefinition> outputsToCreate) {
+        final Map<String, OutputDefinition> outputsToPersist = MapUtil
+            .toMap(outputsToCreate, OutputDefinition::getName);
+        assignOwnerIdToOutputs(userId, outputsToPersist);
+        outputsToPersist.values()
+            .forEach(output -> output.setConstraints(componentInstanceBusinessLogic.setOutputConstraint(output)));
+
+        return toscaOperationFacade.addOutputsToComponent(outputsToPersist, componentId)
+            .left()
+            .map(persistedOutputs -> outputsToCreate);
+    }
+
+    private void assignOwnerIdToOutputs(final String userId, final Map<String, OutputDefinition> outputsToCreate) {
+        outputsToCreate.values().forEach(outputDefinition -> outputDefinition.setOwnerId(userId));
+    }
+
+    private ComponentParametersView getBaseComponentParametersView() {
+        final ComponentParametersView componentParametersView = new ComponentParametersView();
+        componentParametersView.disableAll();
+        componentParametersView.setIgnoreOutputs(false);
+        componentParametersView.setIgnoreComponentInstances(false);
+        componentParametersView.setIgnoreComponentInstancesOutputs(false);
+        componentParametersView.setIgnoreComponentInstancesProperties(false);
+        componentParametersView.setIgnorePolicies(false);
+        componentParametersView.setIgnoreGroups(false);
+        componentParametersView.setIgnoreUsers(false);
+        return componentParametersView;
+    }
+
+    /**
+     * Delete output from component
+     *
+     * @param componentId component id
+     * @param userId      user id
+     * @param outputId    output property id
+     */
+    public OutputDefinition deleteOutput(final String componentId, final String userId, final String outputId) {
+
+        final Either<OutputDefinition, ResponseFormat> deleteEither;
+        if (log.isDebugEnabled()) {
+            log.debug("Going to delete output id: {}", outputId);
+        }
+        validateUserExists(userId);
+        final ComponentParametersView componentParametersView = getBaseComponentParametersView();
+        componentParametersView.setIgnoreInterfaces(false);
+        componentParametersView.setIgnoreDataType(false);
+        componentParametersView.setIgnoreProperties(false);
+        componentParametersView.setIgnoreOutputs(false);
+
+        final Either<Component, StorageOperationStatus> componentEither =
+            toscaOperationFacade.getToscaElement(componentId, componentParametersView);
+        if (componentEither.isRight()) {
+            throw new ByActionStatusComponentException(
+                componentsUtils.convertFromStorageResponse(componentEither.right().value()));
+        }
+        final Component component = componentEither.left().value();
+
+        // Validate outputId is child of the component
+        Optional<OutputDefinition> optionalOutputDefinition = component.getOutputs().stream().
+            // filter by ID
+                filter(output -> output.getUniqueId().equals(outputId)).
+            // Get the output
+                findAny();
+        if (optionalOutputDefinition.isEmpty()) {
+            throw new ByActionStatusComponentException(ActionStatus.OUTPUT_IS_NOT_CHILD_OF_COMPONENT, outputId,
+                componentId);
+        }
+
+        final OutputDefinition outputDefinition = optionalOutputDefinition.get();
+        lockComponent(componentId, component, "deleteOutput");
+        // Delete output operations
+        boolean failed = false;
+        try {
+            StorageOperationStatus storageOperationStatus =
+                toscaOperationFacade.deleteOutputOfResource(component, outputDefinition.getName());
+            if (storageOperationStatus != StorageOperationStatus.OK) {
+                log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, getClass().getName(),
+                    String.format("Component id: %s delete output id: %s failed", componentId, outputId));
+                throw new ByActionStatusComponentException(
+                    componentsUtils.convertFromStorageResponse(storageOperationStatus),
+                    component.getName());
+            }
+
+            storageOperationStatus =
+                propertyDeclarationOrchestrator.unDeclarePropertiesAsOutputs(component, outputDefinition);
+            if (storageOperationStatus != StorageOperationStatus.OK) {
+                log.error(EcompLoggerErrorCode.BUSINESS_PROCESS_ERROR, getClass().getName(), String
+                    .format("Component id: %s update properties declared as output for output id: %s failed",
+                        componentId, outputId));
+                throw new ByActionStatusComponentException(
+                    componentsUtils.convertFromStorageResponse(storageOperationStatus), component.getName());
+            }
+            return outputDefinition;
+        } catch (final ComponentException e) {
+            failed = true;
+            throw e;
+        } finally {
+            unlockComponent(failed, component);
+        }
+    }
+
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
index 7a25989..f78e069 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/impl/ServiceBusinessLogic.java
@@ -228,8 +228,10 @@
                                 InterfaceOperation interfaceOperation,
                                 InterfaceLifecycleOperation interfaceLifecycleTypeOperation,
                                 ArtifactsBusinessLogic artifactsBusinessLogic,
-                                IDistributionEngine distributionEngine, ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
-                                ServiceDistributionValidation serviceDistributionValidation, ForwardingPathValidator forwardingPathValidator,
+                                IDistributionEngine distributionEngine,
+                                ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
+                                ServiceDistributionValidation serviceDistributionValidation,
+                                ForwardingPathValidator forwardingPathValidator,
                                 UiComponentDataConverter uiComponentDataConverter,
                                 ArtifactsOperations artifactToscaOperation,
                                 ComponentContactIdValidator componentContactIdValidator,
@@ -240,9 +242,10 @@
                                 ComponentProjectCodeValidator componentProjectCodeValidator,
                                 ComponentDescriptionValidator componentDescriptionValidator) {
         super(elementDao, groupOperation, groupInstanceOperation, groupTypeOperation, groupBusinessLogic,
-            interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation, componentContactIdValidator,
-                componentNameValidator, componentTagsValidator, componentValidator,
-                componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
+            interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic, artifactToscaOperation,
+            componentContactIdValidator,
+            componentNameValidator, componentTagsValidator, componentValidator,
+            componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator);
         this.distributionEngine = distributionEngine;
         this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
         this.serviceDistributionValidation = serviceDistributionValidation;
@@ -251,14 +254,17 @@
     }
 
 
-    public Either<List<Map<String, Object>>, ResponseFormat> getComponentAuditRecords(String componentVersion, String componentUUID, String userId) {
+    public Either<List<Map<String, Object>>, ResponseFormat> getComponentAuditRecords(String componentVersion,
+                                                                                      String componentUUID,
+                                                                                      String userId) {
         validateUserExists(userId);
         Either<List<Map<String, Object>>, ActionStatus> result;
         try {
 
             // Certified Version
             if (componentVersion.endsWith(".0")) {
-                Either<List<ResourceAdminEvent>, ActionStatus> eitherAuditingForCertified = auditCassandraDao.getByServiceInstanceId(componentUUID);
+                Either<List<ResourceAdminEvent>, ActionStatus> eitherAuditingForCertified = auditCassandraDao
+                    .getByServiceInstanceId(componentUUID);
                 if (eitherAuditingForCertified.isLeft()) {
                     result = Either.left(getAuditingFieldsList(eitherAuditingForCertified.left().value()));
                 } else {
@@ -290,17 +296,16 @@
         List<Operation> operationList = new ArrayList<>();
 
         Either<Service, StorageOperationStatus> serviceEither =
-                toscaOperationFacade.getToscaElement(serviceId);
-        if(serviceEither.isRight()) {
+            toscaOperationFacade.getToscaElement(serviceId);
+        if (serviceEither.isRight()) {
             return Either.right(componentsUtils.getResponseFormat
-                    (serviceEither.right().value()));
+                (serviceEither.right().value()));
         }
 
         Service service = serviceEither.left().value();
 
-
         StorageOperationStatus storageOperationStatus =
-                graphLockOperation.lockComponent(service.getUniqueId(), NodeTypeEnum.Service);
+            graphLockOperation.lockComponent(service.getUniqueId(), NodeTypeEnum.Service);
         if (storageOperationStatus != StorageOperationStatus.OK) {
             return Either.right(componentsUtils.getResponseFormat(storageOperationStatus));
         }
@@ -308,8 +313,8 @@
         try {
             for (ServiceConsumptionData serviceConsumptionData : serviceConsumptionDataList) {
                 Either<Operation, ResponseFormat> operationEither =
-                        addPropertyServiceConsumption(serviceId, serviceInstanceId, operationId,
-                                userId, serviceConsumptionData);
+                    addPropertyServiceConsumption(serviceId, serviceInstanceId, operationId,
+                        userId, serviceConsumptionData);
 
                 if (operationEither.isRight()) {
                     return Either.right(operationEither.right().value());
@@ -330,64 +335,64 @@
         }
     }
 
-    public Either <Operation, ResponseFormat> addPropertyServiceConsumption(String serviceId,
-                                                                            String serviceInstanceId,
-                                                                            String operationId,
-                                                                            String userId,
-                                                                            ServiceConsumptionData serviceConsumptionData) {
+    public Either<Operation, ResponseFormat> addPropertyServiceConsumption(String serviceId,
+                                                                           String serviceInstanceId,
+                                                                           String operationId,
+                                                                           String userId,
+                                                                           ServiceConsumptionData serviceConsumptionData) {
         validateUserExists(userId);
 
         Either<Service, StorageOperationStatus> serviceEither =
-                toscaOperationFacade.getToscaElement(serviceId);
-        if(serviceEither.isRight()) {
+            toscaOperationFacade.getToscaElement(serviceId);
+        if (serviceEither.isRight()) {
             return Either.right(componentsUtils.getResponseFormat(serviceEither.right
-                    ().value()));
+                ().value()));
         }
 
         Service parentService = serviceEither.left().value();
 
         List<ComponentInstance> componentInstances = parentService.getComponentInstances();
-        if(CollectionUtils.isEmpty(componentInstances)) {
+        if (CollectionUtils.isEmpty(componentInstances)) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus
-                    .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
+                .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
         }
 
         Optional<ComponentInstance> serviceInstanceCandidate =
-                componentInstances.stream().filter(instance -> instance.getUniqueId().equals
-                        (serviceInstanceId)).findAny();
+            componentInstances.stream().filter(instance -> instance.getUniqueId().equals
+                (serviceInstanceId)).findAny();
 
-        if(!serviceInstanceCandidate.isPresent()) {
+        if (!serviceInstanceCandidate.isPresent()) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus
-                    .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
+                .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
         }
 
         Map<String, List<ComponentInstanceInterface>> componentInstancesInterfaces =
-                parentService.getComponentInstancesInterfaces();
-        if(MapUtils.isEmpty(componentInstancesInterfaces)) {
+            parentService.getComponentInstancesInterfaces();
+        if (MapUtils.isEmpty(componentInstancesInterfaces)) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus
-                    .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
+                .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
         }
 
         List<InterfaceDefinition> interfaces = new ArrayList<>();
-        for(ComponentInstanceInterface componentInstanceInterface :
-                componentInstancesInterfaces.get(serviceInstanceId)) {
+        for (ComponentInstanceInterface componentInstanceInterface :
+            componentInstancesInterfaces.get(serviceInstanceId)) {
             interfaces.add(componentInstanceInterface);
         }
 
         ComponentInstance serviceInstance = serviceInstanceCandidate.get();
         Optional<InterfaceDefinition> interfaceCandidate = InterfaceOperationUtils
-                .getInterfaceDefinitionFromOperationId(interfaces, operationId);
+            .getInterfaceDefinitionFromOperationId(interfaces, operationId);
 
-        if(!interfaceCandidate.isPresent()) {
+        if (!interfaceCandidate.isPresent()) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus
-                    .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
+                .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
         }
 
         InterfaceDefinition interfaceDefinition = interfaceCandidate.get();
         Map<String, Operation> operations = interfaceDefinition.getOperationsMap();
-        if(MapUtils.isEmpty(operations)) {
+        if (MapUtils.isEmpty(operations)) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus
-                    .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
+                .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
         }
 
         Operation operation = operations.get(operationId);
@@ -395,22 +400,22 @@
 
         ListDataDefinition<OperationInputDefinition> inputs = operation.getInputs();
         Optional<OperationInputDefinition> inputCandidate =
-                getOperationInputByInputId(serviceConsumptionData, inputs);
+            getOperationInputByInputId(serviceConsumptionData, inputs);
 
-        if(!inputCandidate.isPresent()) {
+        if (!inputCandidate.isPresent()) {
             return Either.right(new ResponseFormat(HttpStatus.NOT_FOUND.value()));
         }
 
         OperationInputDefinition operationInputDefinition = inputCandidate.get();
         // add data to operation
 
-        if(Objects.nonNull(serviceConsumptionData.getValue()))  {
+        if (Objects.nonNull(serviceConsumptionData.getValue())) {
             operationEither =
-                    handleConsumptionValue(parentService, serviceInstanceId, serviceConsumptionData, operation,
-                            operationInputDefinition);
+                handleConsumptionValue(parentService, serviceInstanceId, serviceConsumptionData, operation,
+                    operationInputDefinition);
         }
 
-        if(operationEither.isRight()) {
+        if (operationEither.isRight()) {
             return Either.right(operationEither.right().value());
         }
 
@@ -420,26 +425,29 @@
         interfaceDefinition.setOperationsMap(operations);
 
         parentService.getComponentInstances().remove(serviceInstance);
-        if(CollectionUtils.isEmpty(parentService.getComponentInstances())) {
+        if (CollectionUtils.isEmpty(parentService.getComponentInstances())) {
             parentService.setComponentInstances(new ArrayList<>());
         }
 
         Map<String, Object> instanceInterfaces =
-                MapUtils.isEmpty(serviceInstance.getInterfaces())? new HashMap<>() : serviceInstance.getInterfaces();
+            MapUtils.isEmpty(serviceInstance.getInterfaces()) ? new HashMap<>() : serviceInstance.getInterfaces();
         instanceInterfaces.remove(interfaceDefinition.getUniqueId());
         instanceInterfaces.put(interfaceDefinition.getUniqueId(), interfaceDefinition);
         serviceInstance.setInterfaces(instanceInterfaces);
 
-        removeComponentInstanceInterfaceByInterfaceId(interfaceDefinition.getUniqueId(), componentInstancesInterfaces.get(serviceInstanceId));
-        componentInstancesInterfaces.get(serviceInstanceId).add(new ComponentInstanceInterface(interfaceDefinition.getUniqueId(), interfaceDefinition));
+        removeComponentInstanceInterfaceByInterfaceId(interfaceDefinition.getUniqueId(),
+            componentInstancesInterfaces.get(serviceInstanceId));
+        componentInstancesInterfaces.get(serviceInstanceId)
+            .add(new ComponentInstanceInterface(interfaceDefinition.getUniqueId(), interfaceDefinition));
 
         parentService.getComponentInstances().add(serviceInstance);
 
-        StorageOperationStatus status = toscaOperationFacade.updateComponentInstanceInterfaces(parentService, serviceInstanceId);
+        StorageOperationStatus status = toscaOperationFacade
+            .updateComponentInstanceInterfaces(parentService, serviceInstanceId);
 
-        if(status != StorageOperationStatus.OK) {
+        if (status != StorageOperationStatus.OK) {
             return Either.right(componentsUtils.getResponseFormat(ActionStatus
-                    .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
+                .INTERFACE_OPERATION_NOT_FOUND, serviceInstanceId));
         }
 
         return Either.left(operation);
@@ -447,15 +455,15 @@
 
     private void removeComponentInstanceInterfaceByInterfaceId(String interfaceIdToRemove,
                                                                List<ComponentInstanceInterface> instanceInterfaces) {
-        if(CollectionUtils.isEmpty(instanceInterfaces)) {
+        if (CollectionUtils.isEmpty(instanceInterfaces)) {
             return;
         }
 
         Optional<ComponentInstanceInterface> interfaceToRemove =
-                instanceInterfaces.stream().filter(instInterface -> instInterface.getUniqueId().equals
-                        (interfaceIdToRemove)).findAny();
+            instanceInterfaces.stream().filter(instInterface -> instInterface.getUniqueId().equals
+                (interfaceIdToRemove)).findAny();
 
-        if(interfaceToRemove.isPresent()) {
+        if (interfaceToRemove.isPresent()) {
             instanceInterfaces.remove(interfaceToRemove.get());
         }
 
@@ -466,26 +474,26 @@
                                                                      ServiceConsumptionData serviceConsumptionData,
                                                                      Operation operation,
                                                                      OperationInputDefinition
-                                                                             operationInputDefinition) {
+                                                                         operationInputDefinition) {
         String source = serviceConsumptionData.getSource();
         String consumptionValue = serviceConsumptionData.getValue();
         String type = serviceConsumptionData.getType();
         String operationIdentifier = consumptionValue.contains(".")
-                ? consumptionValue.substring(0, consumptionValue.lastIndexOf('.'))
-                : consumptionValue;
+            ? consumptionValue.substring(0, consumptionValue.lastIndexOf('.'))
+            : consumptionValue;
 
         ServiceConsumptionSource sourceValue = ServiceConsumptionSource.getSourceValue(source);
 
-        if(STATIC.equals(sourceValue)) {
+        if (STATIC.equals(sourceValue)) {
             // Validate constraint on input value
             Either<Boolean, ResponseFormat> constraintValidationResult =
-                    validateOperationInputConstraint(operationInputDefinition, consumptionValue, type);
+                validateOperationInputConstraint(operationInputDefinition, consumptionValue, type);
 
             if (constraintValidationResult.isRight()) {
                 return Either.right(constraintValidationResult.right().value());
             }
             return handleConsumptionStaticValue(consumptionValue, type, operation,
-                    operationInputDefinition);
+                operationInputDefinition);
         }
 
         if (Objects.isNull(sourceValue)) {
@@ -495,7 +503,7 @@
             List<OperationOutputDefinition> outputs = null;
             if (source.equals(containerService.getUniqueId())) {
                 Either<Service, StorageOperationStatus> serviceToTakePropEither =
-                        toscaOperationFacade.getToscaElement(source);
+                    toscaOperationFacade.getToscaElement(source);
                 if (serviceToTakePropEither.isRight()) {
                     return Either.right(componentsUtils.getResponseFormat(serviceToTakePropEither.right().value()));
                 }
@@ -505,12 +513,12 @@
                 propertyDefinitions = service.getProperties();
                 componentName = service.getName();
                 outputs = InterfaceOperationUtils.getOtherOperationOutputsOfComponent(operationIdentifier,
-                        service.getInterfaces()).getListToscaDataDefinition();
+                    service.getInterfaces()).getListToscaDataDefinition();
             } else {
                 Optional<ComponentInstance> getComponentInstance = containerService.getComponentInstanceById(source);
-                if(!getComponentInstance.isPresent()){
+                if (!getComponentInstance.isPresent()) {
                     return Either.right(componentsUtils.getResponseFormat(
-                            ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, source));
+                        ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, source));
                 }
                 ComponentInstance componentInstance = getComponentInstance.get();
                 operationInputDefinition.setSource(componentInstance.getUniqueId());
@@ -519,21 +527,21 @@
                 componentName = source.equals(serviceInstanceId) ? SELF : componentInstance.getName();
                 if (MapUtils.isNotEmpty(componentInstance.getInterfaces())) {
                     Map<String, InterfaceDataDefinition> componentInstanceInterfaces =
-                            componentInstance.getInterfaces().entrySet().stream()
-                                    .collect(Collectors.toMap((Map.Entry::getKey),
-                                            (interfaceEntry -> (InterfaceDataDefinition) interfaceEntry.getValue())));
+                        componentInstance.getInterfaces().entrySet().stream()
+                            .collect(Collectors.toMap((Map.Entry::getKey),
+                                (interfaceEntry -> (InterfaceDataDefinition) interfaceEntry.getValue())));
                     outputs = InterfaceOperationUtils.getOtherOperationOutputsOfComponent(operationIdentifier,
-                            componentInstanceInterfaces).getListToscaDataDefinition();
+                        componentInstanceInterfaces).getListToscaDataDefinition();
                 }
             }
 
-            if(sourceValue == ServiceConsumptionSource.SERVICE_INPUT) {
+            if (sourceValue == ServiceConsumptionSource.SERVICE_INPUT) {
                 //The operation input in service consumption has been mapped to an input in the parent service
                 return handleConsumptionInputValue(consumptionValue, containerService, operation,
-                        operationInputDefinition);
+                    operationInputDefinition);
             }
             return handleConsumptionPropertyValue(operation, operationInputDefinition,
-                    serviceConsumptionData, propertyDefinitions, capabilities, outputs, componentName);
+                serviceConsumptionData, propertyDefinitions, capabilities, outputs, componentName);
         }
 
         operationInputDefinition.setToscaPresentationValue(JsonPresentationFields.SOURCE, source);
@@ -545,20 +553,20 @@
     private Optional<OperationInputDefinition> getOperationInputByInputId(ServiceConsumptionData serviceConsumptionData,
                                                                           ListDataDefinition<OperationInputDefinition> inputs) {
 
-        if(CollectionUtils.isEmpty(inputs.getListToscaDataDefinition())) {
+        if (CollectionUtils.isEmpty(inputs.getListToscaDataDefinition())) {
             return Optional.empty();
         }
 
         return inputs.getListToscaDataDefinition().stream().filter(operationInput -> operationInput.getInputId().equals
-                (serviceConsumptionData.getInputId()))
-                .findAny();
+            (serviceConsumptionData.getInputId()))
+            .findAny();
     }
 
     private Either<Operation, ResponseFormat> handleConsumptionPropertyValue(
-            Operation operation, OperationInputDefinition operationInputDefinition,
-            ServiceConsumptionData serviceConsumptionData, List<PropertyDefinition> properties,Map<String,
-            List<CapabilityDefinition>> capabilities,
-            List<OperationOutputDefinition> outputs,  String componentName) {
+        Operation operation, OperationInputDefinition operationInputDefinition,
+        ServiceConsumptionData serviceConsumptionData, List<PropertyDefinition> properties, Map<String,
+        List<CapabilityDefinition>> capabilities,
+        List<OperationOutputDefinition> outputs, String componentName) {
 
         if (CollectionUtils.isEmpty(properties) && CollectionUtils.isEmpty(outputs)) {
             return Either.left(operation);
@@ -566,60 +574,64 @@
         String consumptionValue = serviceConsumptionData.getValue();
 
         if (CollectionUtils.isNotEmpty(outputs)
-                && isOperationInputMappedToOtherOperationOutput(getOperationOutputName(consumptionValue), outputs)) {
+            && isOperationInputMappedToOtherOperationOutput(getOperationOutputName(consumptionValue), outputs)) {
             return handleConsumptionInputMappedToOperationOutput(operation, operationInputDefinition, outputs,
-                    consumptionValue, componentName);
+                consumptionValue, componentName);
         }
 
         if (CollectionUtils.isNotEmpty(properties) && PropertiesUtils.isNodeProperty(consumptionValue, properties)) {
             return handleConsumptionInputMappedToProperty(operation, operationInputDefinition, serviceConsumptionData,
-                    properties, componentName);
+                properties, componentName);
         }
 
         if (MapUtils.isNotEmpty(capabilities)) {
             return handleConsumptionInputMappedToCapabilityProperty(operation, operationInputDefinition,
-                    serviceConsumptionData, capabilities, componentName);
+                serviceConsumptionData, capabilities, componentName);
         }
 
         return Either.left(operation);
     }
 
     private Either<Operation, ResponseFormat> handleConsumptionInputMappedToProperty(Operation operation,
-                                                                                     OperationInputDefinition operationInputDefinition, ServiceConsumptionData serviceConsumptionData,
-                                                                                     List<PropertyDefinition> properties, String componentName) {
+                                                                                     OperationInputDefinition operationInputDefinition,
+                                                                                     ServiceConsumptionData serviceConsumptionData,
+                                                                                     List<PropertyDefinition> properties,
+                                                                                     String componentName) {
         Optional<PropertyDefinition> servicePropertyCandidate =
-                properties.stream().filter(property -> property.getName()
-                        .equals(serviceConsumptionData.getValue())).findAny();
+            properties.stream().filter(property -> property.getName()
+                .equals(serviceConsumptionData.getValue())).findAny();
 
         if (servicePropertyCandidate.isPresent()) {
             boolean isInputTypeSimilarToOperation =
-                    isAssignedValueFromValidType(operationInputDefinition.getType(),
-                            servicePropertyCandidate.get());
+                isAssignedValueFromValidType(operationInputDefinition.getType(),
+                    servicePropertyCandidate.get());
 
             if (!isInputTypeSimilarToOperation) {
                 return Either.right(componentsUtils.getResponseFormat(
-                        ActionStatus.INVALID_CONSUMPTION_TYPE, operationInputDefinition.getType()));
+                    ActionStatus.INVALID_CONSUMPTION_TYPE, operationInputDefinition.getType()));
             }
 
             addPropertyToInputValue(componentName, operation, operationInputDefinition,
-                    servicePropertyCandidate.get());
+                servicePropertyCandidate.get());
         }
         return Either.left(operation);
     }
 
     private Either<Operation, ResponseFormat> handleConsumptionInputMappedToOperationOutput(Operation operation,
-                                                                                            OperationInputDefinition operationInputDefinition, List<OperationOutputDefinition> outputs,
-                                                                                            String consumptionValue, String componentName) {
+                                                                                            OperationInputDefinition operationInputDefinition,
+                                                                                            List<OperationOutputDefinition> outputs,
+                                                                                            String consumptionValue,
+                                                                                            String componentName) {
         String outputName = getOperationOutputName(consumptionValue);
         Optional<OperationOutputDefinition> servicePropertyOutputCandidate = outputs.stream()
-                .filter(output -> output.getName().equals(outputName)).findAny();
+            .filter(output -> output.getName().equals(outputName)).findAny();
         if (servicePropertyOutputCandidate.isPresent()) {
             boolean isInputTypeSimilarToOperation =
-                    isAssignedValueFromValidType(operationInputDefinition.getType(),
-                            servicePropertyOutputCandidate.get());
+                isAssignedValueFromValidType(operationInputDefinition.getType(),
+                    servicePropertyOutputCandidate.get());
             if (!isInputTypeSimilarToOperation) {
                 return Either.right(componentsUtils.getResponseFormat(
-                        ActionStatus.INVALID_CONSUMPTION_TYPE, operationInputDefinition.getType()));
+                    ActionStatus.INVALID_CONSUMPTION_TYPE, operationInputDefinition.getType()));
             }
             addOutputToInputValue(componentName, consumptionValue, operation, operationInputDefinition);
         }
@@ -638,7 +650,7 @@
         operationInputDefinition.setSourceProperty(serviceProperty.getUniqueId());
         operation.getInputs().delete(operationInputDefinition);
         operationInputDefinition.setToscaPresentationValue(JsonPresentationFields.GET_PROPERTY,
-                getPropertyValues);
+            getPropertyValues);
         operationInputDefinition.setValue((new Gson()).toJson(getProperty));
         operation.getInputs().add(operationInputDefinition);
     }
@@ -646,10 +658,10 @@
     private void addOutputToInputValue(String componentName, String consumptionValue,
                                        Operation operation, OperationInputDefinition operationInputDefinition) {
         Map<String, List<String>> getOperationOutput =
-                InterfaceOperationUtils.createMappedOutputDefaultValue(componentName, consumptionValue);
+            InterfaceOperationUtils.createMappedOutputDefaultValue(componentName, consumptionValue);
         operation.getInputs().delete(operationInputDefinition);
         operationInputDefinition.setToscaPresentationValue(JsonPresentationFields.GET_OPERATION_OUTPUT,
-                getOperationOutput);
+            getOperationOutput);
         operationInputDefinition.setValue((new Gson()).toJson(getOperationOutput));
         operation.getInputs().add(operationInputDefinition);
     }
@@ -657,45 +669,45 @@
     public Either<Operation, ResponseFormat> handleConsumptionStaticValue(String value, String type,
                                                                           Operation operation,
                                                                           OperationInputDefinition
-                                                                                  operationInputDefinition) {
+                                                                              operationInputDefinition) {
         boolean isInputTypeSimilarToOperation =
-                isAssignedValueFromValidType(type, value);
+            isAssignedValueFromValidType(type, value);
 
-        if(!isInputTypeSimilarToOperation) {
+        if (!isInputTypeSimilarToOperation) {
             return Either.right(componentsUtils.getResponseFormat(
-                    ActionStatus.INVALID_CONSUMPTION_TYPE, type));
+                ActionStatus.INVALID_CONSUMPTION_TYPE, type));
         }
 
-		//Validate Constraint and Value
-		Either<Boolean, ResponseFormat> constraintValidationResponse =
-				validateOperationInputConstraint(operationInputDefinition, value, type);
-		if(constraintValidationResponse.isRight()) {
-			return Either.right(constraintValidationResponse.right().value());
-		}
+        //Validate Constraint and Value
+        Either<Boolean, ResponseFormat> constraintValidationResponse =
+            validateOperationInputConstraint(operationInputDefinition, value, type);
+        if (constraintValidationResponse.isRight()) {
+            return Either.right(constraintValidationResponse.right().value());
+        }
 
         addStaticValueToInputOperation(value, operation, operationInputDefinition);
 
         return Either.left(operation);
     }
 
-	private Either<Boolean, ResponseFormat> validateOperationInputConstraint(
-			OperationInputDefinition operationInputDefinition, String value, String type) {
-		ComponentInstanceProperty propertyDefinition = new ComponentInstanceProperty();
-		propertyDefinition.setType(operationInputDefinition.getParentPropertyType());
+    private Either<Boolean, ResponseFormat> validateOperationInputConstraint(
+        OperationInputDefinition operationInputDefinition, String value, String type) {
+        ComponentInstanceProperty propertyDefinition = new ComponentInstanceProperty();
+        propertyDefinition.setType(operationInputDefinition.getParentPropertyType());
 
-		InputDefinition inputDefinition = new InputDefinition();
-		inputDefinition.setDefaultValue(value);
-		inputDefinition.setInputPath(operationInputDefinition.getSubPropertyInputPath());
-		inputDefinition.setType(type);
-		if (Objects.nonNull(operationInputDefinition.getParentPropertyType())) {
-                inputDefinition.setProperties(Collections.singletonList(propertyDefinition));
-		}
+        InputDefinition inputDefinition = new InputDefinition();
+        inputDefinition.setDefaultValue(value);
+        inputDefinition.setInputPath(operationInputDefinition.getSubPropertyInputPath());
+        inputDefinition.setType(type);
+        if (Objects.nonNull(operationInputDefinition.getParentPropertyType())) {
+            inputDefinition.setProperties(Collections.singletonList(propertyDefinition));
+        }
 
-		return PropertyValueConstraintValidationUtil.getInstance()
-				.validatePropertyConstraints(Collections.singletonList(inputDefinition), applicationDataTypeCache);
-	}
+        return PropertyValueConstraintValidationUtil.getInstance()
+            .validatePropertyConstraints(Collections.singletonList(inputDefinition), applicationDataTypeCache);
+    }
 
-	private void addStaticValueToInputOperation(String value, Operation operation,
+    private void addStaticValueToInputOperation(String value, Operation operation,
                                                 OperationInputDefinition operationInputDefinition) {
         operation.getInputs().delete(operationInputDefinition);
         operationInputDefinition.setSource(STATIC.getSource());
@@ -704,22 +716,22 @@
         operation.getInputs().add(operationInputDefinition);
     }
 
-    private Either<Operation, ResponseFormat>  handleConsumptionInputValue(String inputId,
-                                                                           Service service,
-                                                                           Operation operation,
-                                                                           OperationInputDefinition
-                                                                                   operationInputDefinition) {
+    private Either<Operation, ResponseFormat> handleConsumptionInputValue(String inputId,
+                                                                          Service service,
+                                                                          Operation operation,
+                                                                          OperationInputDefinition
+                                                                              operationInputDefinition) {
         List<InputDefinition> serviceInputs = service.getInputs();
         Optional<InputDefinition> inputForValue =
-                serviceInputs.stream().filter(input -> input.getUniqueId().contains(inputId)).findAny();
+            serviceInputs.stream().filter(input -> input.getUniqueId().contains(inputId)).findAny();
 
-        if(inputForValue.isPresent()) {
+        if (inputForValue.isPresent()) {
             boolean isInputTypeSimilarToOperation =
-                    isAssignedValueFromValidType(operationInputDefinition.getType(), inputForValue.get());
+                isAssignedValueFromValidType(operationInputDefinition.getType(), inputForValue.get());
 
-            if(!isInputTypeSimilarToOperation) {
+            if (!isInputTypeSimilarToOperation) {
                 return Either.right(componentsUtils.getResponseFormat(
-                        ActionStatus.INVALID_CONSUMPTION_TYPE, operationInputDefinition.getType()));
+                    ActionStatus.INVALID_CONSUMPTION_TYPE, operationInputDefinition.getType()));
             }
             addGetInputValueToOperationInput(operation, operationInputDefinition, inputForValue.get());
         }
@@ -739,22 +751,25 @@
         operation.getInputs().add(operationInputDefinition);
     }
 
-    private Either<List<Map<String, Object>>, ActionStatus> getAuditRecordsForUncertifiedComponent(String componentUUID, String componentVersion) {
+    private Either<List<Map<String, Object>>, ActionStatus> getAuditRecordsForUncertifiedComponent(String componentUUID,
+                                                                                                   String componentVersion) {
         // First Query
-        Either<List<ResourceAdminEvent>, ActionStatus> eitherprevVerAudit = auditCassandraDao.getAuditByServiceIdAndPrevVersion(componentUUID, componentVersion);
+        Either<List<ResourceAdminEvent>, ActionStatus> eitherprevVerAudit = auditCassandraDao
+            .getAuditByServiceIdAndPrevVersion(componentUUID, componentVersion);
 
         if (eitherprevVerAudit.isRight()) {
             return Either.right(eitherprevVerAudit.right().value());
         }
 
         // Second Query
-        Either<List<ResourceAdminEvent>, ActionStatus> eitherCurrVerAudit = auditCassandraDao.getAuditByServiceIdAndCurrVersion(componentUUID, componentVersion);
+        Either<List<ResourceAdminEvent>, ActionStatus> eitherCurrVerAudit = auditCassandraDao
+            .getAuditByServiceIdAndCurrVersion(componentUUID, componentVersion);
         if (eitherCurrVerAudit.isRight()) {
             return Either.right(eitherCurrVerAudit.right().value());
         }
 
-
-        Either<List<ResourceAdminEvent>, ActionStatus> eitherArchiveRestoreList = getArchiveRestoreEventList(componentUUID);
+        Either<List<ResourceAdminEvent>, ActionStatus> eitherArchiveRestoreList = getArchiveRestoreEventList(
+            componentUUID);
         if (eitherArchiveRestoreList.isRight()) {
             return Either.right(eitherArchiveRestoreList.right().value());
         }
@@ -772,19 +787,20 @@
         joinedNonDuplicatedList.addAll(currVerAuditList);
         joinedNonDuplicatedList.addAll(getAuditingFieldsList(eitherArchiveRestoreList.left().value()));
 
-
         return Either.left(joinedNonDuplicatedList);
     }
 
     private Either<List<ResourceAdminEvent>, ActionStatus> getArchiveRestoreEventList(String componentUUID) {
         // Archive Query
-        Either<List<ResourceAdminEvent>, ActionStatus> eitherArchiveAudit = auditCassandraDao.getArchiveAuditByServiceInstanceId(componentUUID);
+        Either<List<ResourceAdminEvent>, ActionStatus> eitherArchiveAudit = auditCassandraDao
+            .getArchiveAuditByServiceInstanceId(componentUUID);
         if (eitherArchiveAudit.isRight()) {
             return Either.right(eitherArchiveAudit.right().value());
         }
 
         // Restore Query
-        Either<List<ResourceAdminEvent>, ActionStatus> eitherRestoreAudit = auditCassandraDao.getRestoreAuditByServiceInstanceId(componentUUID);
+        Either<List<ResourceAdminEvent>, ActionStatus> eitherRestoreAudit = auditCassandraDao
+            .getRestoreAuditByServiceInstanceId(componentUUID);
         if (eitherRestoreAudit.isRight()) {
             return Either.right(eitherRestoreAudit.right().value());
         }
@@ -819,17 +835,15 @@
     /**
      * createService
      *
-     * @param service
-     *            - Service
-     * @param user
-     *            - modifier data (userId)
+     * @param service - Service
+     * @param user    - modifier data (userId)
      * @return Either<Service, responseFormat>
      */
     public Either<Service, ResponseFormat> createService(Service service, User user) {
 
         // get user details
         user = validateUser(user, "Create Service", service, AuditingActionEnum.CREATE_RESOURCE, false);
-        log.debug("User returned from validation: "+ user.toString());
+        log.debug("User returned from validation: " + user.toString());
         // validate user role
         validateUserRole(user, service, new ArrayList<>(), AuditingActionEnum.CREATE_RESOURCE, null);
         service.setCreatorUserId(user.getUserId());
@@ -839,18 +853,20 @@
         log.debug("enrich service with version and state");
         service.setState(LifecycleStateEnum.NOT_CERTIFIED_CHECKOUT);
         service.setVersion(INITIAL_VERSION);
-        service.setConformanceLevel(ConfigurationManager.getConfigurationManager().getConfiguration().getToscaConformanceLevel());
+        service.setConformanceLevel(
+            ConfigurationManager.getConfigurationManager().getConfiguration().getToscaConformanceLevel());
         service.setDistributionStatus(DistributionStatusEnum.DISTRIBUTION_NOT_APPROVED);
         service.setComponentType(ComponentTypeEnum.SERVICE);
-        Either<Service, ResponseFormat> createServiceResponse = validateServiceBeforeCreate(service, user, AuditingActionEnum.CREATE_RESOURCE);
+        Either<Service, ResponseFormat> createServiceResponse = validateServiceBeforeCreate(service, user,
+            AuditingActionEnum.CREATE_RESOURCE);
         if (createServiceResponse.isRight()) {
             return createServiceResponse;
         }
         return createServiceByDao(service, user)
+            .left()
+            .bind(c -> updateCatalog(c, ChangeTypeEnum.LIFECYCLE)
                 .left()
-                .bind(c -> updateCatalog(c, ChangeTypeEnum.LIFECYCLE)
-                        .left()
-                        .map (r -> (Service) r));
+                .map(r -> (Service) r));
     }
 
     private void checkFieldsForOverideAttampt(Service service) {
@@ -861,9 +877,11 @@
     }
 
     private Either<Service, ResponseFormat> createServiceByDao(final Service service, final User user) {
-        log.debug("send service {} to dao for create", service.getComponentMetadataDefinition().getMetadataDataDefinition().getName());
+        log.debug("send service {} to dao for create",
+            service.getComponentMetadataDefinition().getMetadataDataDefinition().getName());
 
-        Either<Boolean, ResponseFormat> lockResult = lockComponentByName(service.getSystemName(), service, "Create Service");
+        Either<Boolean, ResponseFormat> lockResult = lockComponentByName(service.getSystemName(), service,
+            "Create Service");
         if (lockResult.isRight()) {
             ResponseFormat responseFormat = lockResult.right().value();
             componentsUtils.auditComponentAdmin(responseFormat, user, service, AuditingActionEnum.CREATE_RESOURCE,
@@ -882,7 +900,8 @@
             generateAndAddInputsFromGenericTypeProperties(service, genericType);
             beforeCreate(service);
 
-            Either<Service, StorageOperationStatus> dataModelResponse = toscaOperationFacade.createToscaComponent(service);
+            Either<Service, StorageOperationStatus> dataModelResponse = toscaOperationFacade
+                .createToscaComponent(service);
             if (dataModelResponse.isLeft()) {
                 log.debug("Service '{}' created successfully", service.getName());
                 ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.CREATED);
@@ -891,13 +910,16 @@
                 ASDCKpiApi.countCreatedServicesKPI();
                 return Either.left(dataModelResponse.left().value());
             }
-            ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(componentsUtils.convertFromStorageResponse(dataModelResponse.right().value()), service, ComponentTypeEnum.SERVICE);
+            ResponseFormat responseFormat = componentsUtils.getResponseFormatByComponent(
+                componentsUtils.convertFromStorageResponse(dataModelResponse.right().value()), service,
+                ComponentTypeEnum.SERVICE);
             log.debug(AUDIT_BEFORE_SENDING_RESPONSE);
             componentsUtils.auditComponentAdmin(responseFormat, user, service, AuditingActionEnum.CREATE_RESOURCE,
                 ComponentTypeEnum.SERVICE);
             return Either.right(responseFormat);
         } finally {
-            graphLockOperation.unlockComponentByName(service.getSystemName(), service.getUniqueId(), NodeTypeEnum.Service);
+            graphLockOperation
+                .unlockComponentByName(service.getSystemName(), service.getUniqueId(), NodeTypeEnum.Service);
         }
     }
 
@@ -946,11 +968,14 @@
         // moved to ArtifactOperation
         String serviceUniqueId = service.getUniqueId();
         Map<String, ArtifactDefinition> artifactMap = service.getServiceApiArtifacts();
-        if (artifactMap == null)
+        if (artifactMap == null) {
             artifactMap = new HashMap<>();
+        }
 
-        Map<String, Object> serviceApiArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getServiceApiArtifacts();
-        List<String> exludeServiceCategory = ConfigurationManager.getConfigurationManager().getConfiguration().getExcludeServiceCategory();
+        Map<String, Object> serviceApiArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration()
+            .getServiceApiArtifacts();
+        List<String> exludeServiceCategory = ConfigurationManager.getConfigurationManager().getConfiguration()
+            .getExcludeServiceCategory();
 
         List<CategoryDefinition> categories = service.getCategories();
         boolean isCreateArtifact = true;
@@ -967,8 +992,10 @@
         if (serviceApiArtifacts != null && isCreateArtifact) {
             Set<String> keys = serviceApiArtifacts.keySet();
             for (String serviceApiArtifactName : keys) {
-                Map<String, Object> artifactInfoMap = (Map<String, Object>) serviceApiArtifacts.get(serviceApiArtifactName);
-                ArtifactDefinition artifactDefinition = createArtifactDefinition(serviceUniqueId, serviceApiArtifactName, artifactInfoMap, user, true);
+                Map<String, Object> artifactInfoMap = (Map<String, Object>) serviceApiArtifacts
+                    .get(serviceApiArtifactName);
+                ArtifactDefinition artifactDefinition = createArtifactDefinition(serviceUniqueId,
+                    serviceApiArtifactName, artifactInfoMap, user, true);
                 artifactDefinition.setArtifactGroupType(ArtifactGroupTypeEnum.SERVICE_API);
                 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
             }
@@ -978,14 +1005,15 @@
     }
 
     @VisibleForTesting
-    protected Either<Service, ResponseFormat> validateServiceBeforeCreate(Service service, User user, AuditingActionEnum actionEnum) {
+    protected Either<Service, ResponseFormat> validateServiceBeforeCreate(Service service, User user,
+                                                                          AuditingActionEnum actionEnum) {
 
         try {
-            serviceValidator.validate(user,service,actionEnum);
+            serviceValidator.validate(user, service, actionEnum);
         } catch (ComponentException exp) {
             ResponseFormat responseFormat = componentsUtils.getResponseFormat(exp);
             componentsUtils.auditComponentAdmin(responseFormat, user, service,
-                    AuditingActionEnum.CREATE_SERVICE, ComponentTypeEnum.SERVICE);
+                AuditingActionEnum.CREATE_SERVICE, ComponentTypeEnum.SERVICE);
             throw exp;
         }
 
@@ -1003,7 +1031,8 @@
     public Either<Map<String, Boolean>, ResponseFormat> validateServiceNameExists(String serviceName, String userId) {
         validateUserExists(userId);
 
-        Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade.validateComponentNameUniqueness(serviceName, null, ComponentTypeEnum.SERVICE);
+        Either<Boolean, StorageOperationStatus> dataModelResponse = toscaOperationFacade
+            .validateComponentNameUniqueness(serviceName, null, ComponentTypeEnum.SERVICE);
         // DE242223
         janusGraphDao.commit();
 
@@ -1013,7 +1042,8 @@
             log.debug("validation was successfully performed.");
             return Either.left(result);
         }
-        ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(dataModelResponse.right().value()));
+        ResponseFormat responseFormat = componentsUtils
+            .getResponseFormat(componentsUtils.convertFromStorageResponse(dataModelResponse.right().value()));
         return Either.right(responseFormat);
     }
 
@@ -1041,17 +1071,21 @@
 
         Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
         if (storageStatus.isRight()) {
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), ""));
+            return Either.right(componentsUtils.getResponseFormat(
+                componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE),
+                ""));
         }
 
         Service currentService = storageStatus.left().value();
 
         if (!ComponentValidationUtils.canWorkOnComponent(currentService, user.getUserId())) {
-            log.info("Restricted operation for user: {}, on service: {}", user.getUserId(), currentService.getCreatorUserId());
+            log.info("Restricted operation for user: {}, on service: {}", user.getUserId(),
+                currentService.getCreatorUserId());
             return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
         }
 
-        Either<Service, ResponseFormat> validationRsponse = validateAndUpdateServiceMetadata(user, currentService, serviceUpdate);
+        Either<Service, ResponseFormat> validationRsponse = validateAndUpdateServiceMetadata(user, currentService,
+            serviceUpdate);
         if (validationRsponse.isRight()) {
             log.info("service update metadata: validations field.");
             return validationRsponse;
@@ -1062,23 +1096,24 @@
         lockComponent(serviceId, currentService, "Update Service Metadata");
         try {
             return toscaOperationFacade.updateToscaElement(serviceToUpdate)
-                    .right()
-                    .map(rf -> {
-                        janusGraphDao.rollback();
-                        BeEcompErrorManager.getInstance().logBeSystemError("Update Service Metadata");
-                        log.debug("failed to update sevice {}", serviceToUpdate.getUniqueId());
-                        return (componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
-                       })
-                    .left()
-                    .bind(c ->  updateCatalogAndCommit(c));
+                .right()
+                .map(rf -> {
+                    janusGraphDao.rollback();
+                    BeEcompErrorManager.getInstance().logBeSystemError("Update Service Metadata");
+                    log.debug("failed to update sevice {}", serviceToUpdate.getUniqueId());
+                    return (componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
+                })
+                .left()
+                .bind(c -> updateCatalogAndCommit(c));
 
         } finally {
             graphLockOperation.unlockComponent(serviceId, NodeTypeEnum.Service);
         }
     }
 
-    private Either<Service, ResponseFormat> updateCatalogAndCommit(Service service){
-        Either<Service, ResponseFormat> res = updateCatalog(service, ChangeTypeEnum.LIFECYCLE).left().map(s -> (Service)s);
+    private Either<Service, ResponseFormat> updateCatalogAndCommit(Service service) {
+        Either<Service, ResponseFormat> res = updateCatalog(service, ChangeTypeEnum.LIFECYCLE).left()
+            .map(s -> (Service) s);
         janusGraphDao.commit();
         return res;
 
@@ -1091,7 +1126,9 @@
         validateUserRole(user, serviceToDelete, new ArrayList<>(), null, null);
         Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
         if (storageStatus.isRight()) {
-            throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), "");
+            throw new ByActionStatusComponentException(
+                componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE),
+                "");
         }
         Service service = storageStatus.left().value();
         Either<Set<String>, StorageOperationStatus> result = null;
@@ -1101,26 +1138,26 @@
             } catch (ComponentException e) {
                 janusGraphDao.rollback();
                 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse
-                        (storageStatus.right().value(), ComponentTypeEnum.SERVICE), "");
+                    (storageStatus.right().value(), ComponentTypeEnum.SERVICE), "");
             }
         }
-        try{
-            result = forwardingPathOperation.deleteForwardingPath(service ,pathIdsToDelete);
+        try {
+            result = forwardingPathOperation.deleteForwardingPath(service, pathIdsToDelete);
             if (result.isRight()) {
                 log.debug(FAILED_TO_LOCK_SERVICE_RESPONSE_IS, service.getName(), result.right().value());
                 janusGraphDao.rollback();
                 throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse
-                        (storageStatus.right().value(), ComponentTypeEnum.SERVICE));
+                    (storageStatus.right().value(), ComponentTypeEnum.SERVICE));
             }
             janusGraphDao.commit();
             log.debug(THE_SERVICE_WITH_SYSTEM_NAME_LOCKED, service.getSystemName());
 
-        } catch (ComponentException e){
+        } catch (ComponentException e) {
             log.error("Exception occurred during delete forwarding path : {}", e.getMessage(), e);
             janusGraphDao.rollback();
             throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
         } finally {
-              graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service);
+            graphLockOperation.unlockComponent(service.getUniqueId(), NodeTypeEnum.Service);
         }
         return result.left().value();
     }
@@ -1129,19 +1166,20 @@
         Service serviceToDelete = new Service();
         serviceToDelete.setUniqueId(serviceId);
         serviceToDelete.setForwardingPaths(new HashMap<>());
-        pathIdsToDelete.forEach(pathIdToDelete ->  serviceToDelete.getForwardingPaths().put(pathIdToDelete, new ForwardingPathDataDefinition()));
+        pathIdsToDelete.forEach(pathIdToDelete -> serviceToDelete.getForwardingPaths()
+            .put(pathIdToDelete, new ForwardingPathDataDefinition()));
         return serviceToDelete;
     }
 
     public Service updateForwardingPath(String serviceId, Service serviceUpdate, User user, boolean lock) {
-        return createOrUpdateForwardingPath(serviceId, serviceUpdate, user, true,"updateForwardingPath", lock);
+        return createOrUpdateForwardingPath(serviceId, serviceUpdate, user, true, "updateForwardingPath", lock);
     }
 
     public Service createForwardingPath(String serviceId, Service serviceUpdate, User user, boolean lock) {
         return createOrUpdateForwardingPath(serviceId, serviceUpdate, user, false, "createForwardingPath", lock);
     }
 
-    private ForwardingPathDataDefinition  getTrimmedValues(ForwardingPathDataDefinition path){
+    private ForwardingPathDataDefinition getTrimmedValues(ForwardingPathDataDefinition path) {
         ForwardingPathDataDefinition dataDefinition = new ForwardingPathDataDefinition(path.getName());
         dataDefinition.setName(Strings.nullToEmpty(path.getName()).trim());
         dataDefinition.setProtocol(Strings.nullToEmpty(path.getProtocol()).trim());
@@ -1150,24 +1188,26 @@
         dataDefinition.setPathElements(path.getPathElements());
         dataDefinition.setDescription(path.getDescription());
         dataDefinition.setToscaResourceName(path.getToscaResourceName());
-        return  dataDefinition;
+        return dataDefinition;
     }
 
-    private Service createOrUpdateForwardingPath(String serviceId, Service serviceUpdate, User user, boolean isUpdate, String errorContext, boolean lock) {
+    private Service createOrUpdateForwardingPath(String serviceId, Service serviceUpdate, User user, boolean isUpdate,
+                                                 String errorContext, boolean lock) {
         validateUserAndRole(serviceUpdate, user, errorContext);
 
         Map<String, ForwardingPathDataDefinition> forwardingPaths = serviceUpdate.getForwardingPaths();
 
         Map<String, ForwardingPathDataDefinition> trimmedForwardingPaths =
-                forwardingPaths.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,
-                        entry -> new ForwardingPathDataDefinition(getTrimmedValues(entry.getValue()))));
+            forwardingPaths.entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey,
+                entry -> new ForwardingPathDataDefinition(getTrimmedValues(entry.getValue()))));
 
         forwardingPathValidator.validateForwardingPaths(trimmedForwardingPaths.values(),
-                serviceId, isUpdate);
+            serviceId, isUpdate);
 
-        Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade.getToscaElement(serviceId);
+        Either<Service, StorageOperationStatus> serviceStorageOperationStatusEither = toscaOperationFacade
+            .getToscaElement(serviceId);
 
-        if(serviceStorageOperationStatusEither.isRight()){
+        if (serviceStorageOperationStatusEither.isRight()) {
             StorageOperationStatus errorStatus = serviceStorageOperationStatusEither.right().value();
             log.debug("Failed to fetch service information by service id, error {}", errorStatus);
             throw new ByActionStatusComponentException(componentsUtils.convertFromStorageResponse(errorStatus));
@@ -1177,14 +1217,14 @@
         Either<ForwardingPathDataDefinition, StorageOperationStatus> result;
         Component component = getForwardingPathOriginComponent();
         final String toscaResourceName;
-        if (  component.getComponentType() == ComponentTypeEnum.RESOURCE) {
+        if (component.getComponentType() == ComponentTypeEnum.RESOURCE) {
             toscaResourceName = ((Resource) component).getToscaResourceName();
         } else {
             toscaResourceName = "";
         }
         if (lock) {
-           lockComponent(storedService.getUniqueId(), storedService, "Add or Update Forwarding Path on Service");
-           log.debug(THE_SERVICE_WITH_SYSTEM_NAME_LOCKED, storedService.getSystemName());
+            lockComponent(storedService.getUniqueId(), storedService, "Add or Update Forwarding Path on Service");
+            log.debug(THE_SERVICE_WITH_SYSTEM_NAME_LOCKED, storedService.getSystemName());
         }
         Map<String, ForwardingPathDataDefinition> resultMap = new HashMap<>();
         try {
@@ -1201,7 +1241,8 @@
     }
 
     private Component getForwardingPathOriginComponent() {
-        Either<Component, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade.getLatestByName(ForwardingPathUtils.FORWARDING_PATH_NODE_NAME);
+        Either<Component, StorageOperationStatus> forwardingPathOrigin = toscaOperationFacade
+            .getLatestByName(ForwardingPathUtils.FORWARDING_PATH_NODE_NAME);
         if (forwardingPathOrigin.isRight()) {
             StorageOperationStatus errorStatus = forwardingPathOrigin.right().value();
             log.debug("Failed to fetch normative forwarding path resource by tosca name, error {}", errorStatus);
@@ -1210,7 +1251,9 @@
         return forwardingPathOrigin.left().value();
     }
 
-    private void populateForwardingPaths(String serviceId, boolean isUpdate, Map<String, ForwardingPathDataDefinition> trimmedForwardingPaths, Map<String, ForwardingPathDataDefinition> resultMap) {
+    private void populateForwardingPaths(String serviceId, boolean isUpdate,
+                                         Map<String, ForwardingPathDataDefinition> trimmedForwardingPaths,
+                                         Map<String, ForwardingPathDataDefinition> resultMap) {
         Either<ForwardingPathDataDefinition, StorageOperationStatus> result;
         try {
             for (ForwardingPathDataDefinition forwardingPathDataDefinition : trimmedForwardingPaths.values()) {
@@ -1233,12 +1276,13 @@
         } catch (ComponentException e) {
             janusGraphDao.rollback();
             log.error("Exception occurred during add or update forwarding path property values: {}",
-                    e.getMessage(), e);
+                e.getMessage(), e);
             throw new ByActionStatusComponentException(ActionStatus.GENERAL_ERROR);
         }
     }
 
-    private Service createServiceWithForwardingPathForResponse(String serviceId, Map<String,ForwardingPathDataDefinition> forwardingPathDataDefinitionMap) {
+    private Service createServiceWithForwardingPathForResponse(String serviceId,
+                                                               Map<String, ForwardingPathDataDefinition> forwardingPathDataDefinitionMap) {
         Service service = new Service();
         service.setUniqueId(serviceId);
         service.setForwardingPaths(forwardingPathDataDefinitionMap);
@@ -1251,27 +1295,34 @@
     }
 
     @VisibleForTesting
-    Either<Service, ResponseFormat> validateAndUpdateServiceMetadata(User user, Service currentService, Service serviceUpdate) {
+    Either<Service, ResponseFormat> validateAndUpdateServiceMetadata(User user, Service currentService,
+                                                                     Service serviceUpdate) {
 
         try {
             boolean hasBeenCertified = ValidationUtils.hasBeenCertified(currentService.getVersion());
-            Either<Boolean, ResponseFormat> response = validateAndUpdateCategory(user, currentService, serviceUpdate, hasBeenCertified, UPDATE_SERVICE_METADATA);
+            Either<Boolean, ResponseFormat> response = validateAndUpdateCategory(user, currentService, serviceUpdate,
+                hasBeenCertified, UPDATE_SERVICE_METADATA);
             if (response.isRight()) {
                 ResponseFormat errorResponse = response.right().value();
                 return Either.right(errorResponse);
             }
 
-            verifyValuesAreIdentical(serviceUpdate.getCreatorUserId(), currentService.getCreatorUserId(), "creatorUserId");
-            verifyValuesAreIdentical(serviceUpdate.getCreatorFullName(), currentService.getCreatorFullName(), "creatorFullName");
-            verifyValuesAreIdentical(serviceUpdate.getLastUpdaterUserId(), currentService.getLastUpdaterUserId(), "lastUpdaterUserId");
-            verifyValuesAreIdentical(serviceUpdate.getLastUpdaterFullName(), currentService.getLastUpdaterFullName(), "lastUpdaterFullName");
+            verifyValuesAreIdentical(serviceUpdate.getCreatorUserId(), currentService.getCreatorUserId(),
+                "creatorUserId");
+            verifyValuesAreIdentical(serviceUpdate.getCreatorFullName(), currentService.getCreatorFullName(),
+                "creatorFullName");
+            verifyValuesAreIdentical(serviceUpdate.getLastUpdaterUserId(), currentService.getLastUpdaterUserId(),
+                "lastUpdaterUserId");
+            verifyValuesAreIdentical(serviceUpdate.getLastUpdaterFullName(), currentService.getLastUpdaterFullName(),
+                "lastUpdaterFullName");
 
             response = validateAndUpdateServiceName(user, currentService, serviceUpdate, hasBeenCertified, null);
             if (response.isRight()) {
                 return Either.right(response.right().value());
             }
 
-            verifyValuesAreIdentical(serviceUpdate.getDistributionStatus(), currentService.getDistributionStatus(), "distributionStatus");
+            verifyValuesAreIdentical(serviceUpdate.getDistributionStatus(), currentService.getDistributionStatus(),
+                "distributionStatus");
 
             if (serviceUpdate.getProjectCode() != null) {
                 response = validateAndUpdateProjectCode(user, currentService, serviceUpdate, UPDATE_SERVICE_METADATA);
@@ -1280,7 +1331,8 @@
                 }
             }
 
-            response = validateAndUpdateIcon(user, currentService, serviceUpdate, hasBeenCertified, UPDATE_SERVICE_METADATA);
+            response = validateAndUpdateIcon(user, currentService, serviceUpdate, hasBeenCertified,
+                UPDATE_SERVICE_METADATA);
             if (response.isRight()) {
                 return Either.right(response.right().value());
             }
@@ -1303,9 +1355,12 @@
                 return Either.right(response.right().value());
             }
 
-            verifyValuesAreIdentical(serviceUpdate.getLastUpdateDate(), currentService.getLastUpdateDate(), "lastUpdateDate");
-            verifyValuesAreIdentical(serviceUpdate.getLifecycleState(), currentService.getLifecycleState(), "lifecycleState");
-            verifyValuesAreIdentical(serviceUpdate.isHighestVersion(), currentService.isHighestVersion(), "isHighestVersion");
+            verifyValuesAreIdentical(serviceUpdate.getLastUpdateDate(), currentService.getLastUpdateDate(),
+                "lastUpdateDate");
+            verifyValuesAreIdentical(serviceUpdate.getLifecycleState(), currentService.getLifecycleState(),
+                "lifecycleState");
+            verifyValuesAreIdentical(serviceUpdate.isHighestVersion(), currentService.isHighestVersion(),
+                "isHighestVersion");
             verifyValuesAreIdentical(serviceUpdate.getUUID(), currentService.getUUID(), "uuid");
 
             validateAndUpdateServiceType(currentService, serviceUpdate);
@@ -1317,12 +1372,14 @@
                 return Either.right(response.right().value());
             }
 
-            response = validateAndUpdateInstantiationTypeValue(user, currentService, serviceUpdate, UPDATE_SERVICE_METADATA);
+            response = validateAndUpdateInstantiationTypeValue(user, currentService, serviceUpdate,
+                UPDATE_SERVICE_METADATA);
             if (response.isRight()) {
                 return Either.right(response.right().value());
             }
 
-            verifyValuesAreIdentical(serviceUpdate.getInvariantUUID(), currentService.getInvariantUUID(), "invariantUUID");
+            verifyValuesAreIdentical(serviceUpdate.getInvariantUUID(), currentService.getInvariantUUID(),
+                "invariantUUID");
 
             validateAndUpdateEcompNaming(currentService, serviceUpdate);
 
@@ -1332,14 +1389,15 @@
         } catch (ComponentException exception) {
             ResponseFormat responseFormat = componentsUtils.getResponseFormat(exception);
             componentsUtils.auditComponentAdmin(responseFormat, user, serviceUpdate,
-                    AuditingActionEnum.UPDATE_SERVICE_METADATA, ComponentTypeEnum.SERVICE);
+                AuditingActionEnum.UPDATE_SERVICE_METADATA, ComponentTypeEnum.SERVICE);
             return Either.right(responseFormat);
         }
     }
 
     private void verifyValuesAreIdentical(Object updatedValue, Object originalValue, String fieldName) {
         if (updatedValue != null && !updatedValue.equals(originalValue)) {
-            log.info("update service: received request to update {} to {} the field is not updatable ignoring.", fieldName, updatedValue);
+            log.info("update service: received request to update {} to {} the field is not updatable ignoring.",
+                fieldName, updatedValue);
         }
     }
 
@@ -1360,7 +1418,9 @@
         }
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateContactId(User user, Service currentService, Service serviceUpdate, AuditingActionEnum audatingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateContactId(User user, Service currentService,
+                                                                       Service serviceUpdate,
+                                                                       AuditingActionEnum audatingAction) {
         String contactIdUpdated = serviceUpdate.getContactId();
         String contactIdCurrent = currentService.getContactId();
         if (!contactIdCurrent.equals(contactIdUpdated)) {
@@ -1370,12 +1430,15 @@
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateTags(User user, Service currentService, Service serviceUpdate, AuditingActionEnum audatingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateTags(User user, Service currentService,
+                                                                  Service serviceUpdate,
+                                                                  AuditingActionEnum audatingAction) {
         List<String> tagsUpdated = serviceUpdate.getTags();
         List<String> tagsCurrent = currentService.getTags();
         if (tagsUpdated == null || tagsUpdated.isEmpty()) {
             ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.COMPONENT_MISSING_TAGS);
-            componentsUtils.auditComponentAdmin(responseFormat, user, serviceUpdate, audatingAction, ComponentTypeEnum.SERVICE);
+            componentsUtils
+                .auditComponentAdmin(responseFormat, user, serviceUpdate, audatingAction, ComponentTypeEnum.SERVICE);
             return Either.right(responseFormat);
         }
 
@@ -1386,7 +1449,9 @@
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateDescription(User user, Service currentService, Service serviceUpdate, AuditingActionEnum audatingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateDescription(User user, Service currentService,
+                                                                         Service serviceUpdate,
+                                                                         AuditingActionEnum audatingAction) {
         String descriptionUpdated = serviceUpdate.getDescription();
         String descriptionCurrent = currentService.getDescription();
         if (!descriptionCurrent.equals(descriptionUpdated)) {
@@ -1396,11 +1461,13 @@
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateProjectCode(User user, Service currentService, Service serviceUpdate, AuditingActionEnum audatingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateProjectCode(User user, Service currentService,
+                                                                         Service serviceUpdate,
+                                                                         AuditingActionEnum audatingAction) {
         String projectCodeUpdated = serviceUpdate.getProjectCode();
         String projectCodeCurrent = currentService.getProjectCode();
         if (StringUtils.isEmpty(projectCodeCurrent)
-                || !projectCodeCurrent.equals(projectCodeUpdated)) {
+            || !projectCodeCurrent.equals(projectCodeUpdated)) {
 
             try {
                 componentProjectCodeValidator.validateAndCorrectField(user, serviceUpdate, audatingAction);
@@ -1414,7 +1481,9 @@
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateIcon(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum audatingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateIcon(User user, Service currentService,
+                                                                  Service serviceUpdate, boolean hasBeenCertified,
+                                                                  AuditingActionEnum audatingAction) {
         String iconUpdated = serviceUpdate.getIcon();
         String iconCurrent = currentService.getIcon();
         if (!iconCurrent.equals(iconUpdated)) {
@@ -1423,14 +1492,18 @@
                 currentService.setIcon(iconUpdated);
             } else {
                 log.info("icon {} cannot be updated once the service has been certified once.", iconUpdated);
-                ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_ICON_CANNOT_BE_CHANGED);
+                ResponseFormat errorResponse = componentsUtils
+                    .getResponseFormat(ActionStatus.SERVICE_ICON_CANNOT_BE_CHANGED);
                 return Either.right(errorResponse);
             }
         }
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateServiceName(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum auditingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateServiceName(User user, Service currentService,
+                                                                         Service serviceUpdate,
+                                                                         boolean hasBeenCertified,
+                                                                         AuditingActionEnum auditingAction) {
         String serviceNameUpdated = serviceUpdate.getName();
         String serviceNameCurrent = currentService.getName();
         if (!serviceNameCurrent.equals(serviceNameUpdated)) {
@@ -1442,12 +1515,16 @@
                     return Either.right(exp.getResponseFormat());
                 }
                 currentService.setName(serviceNameUpdated);
-                currentService.getComponentMetadataDefinition().getMetadataDataDefinition().setNormalizedName(ValidationUtils.normaliseComponentName(serviceNameUpdated));
-                currentService.getComponentMetadataDefinition().getMetadataDataDefinition().setSystemName(ValidationUtils.convertToSystemName(serviceNameUpdated));
+                currentService.getComponentMetadataDefinition().getMetadataDataDefinition()
+                    .setNormalizedName(ValidationUtils.normaliseComponentName(serviceNameUpdated));
+                currentService.getComponentMetadataDefinition().getMetadataDataDefinition()
+                    .setSystemName(ValidationUtils.convertToSystemName(serviceNameUpdated));
 
             } else {
-                log.info("service name {} cannot be updated once the service has been certified once.", serviceNameUpdated);
-                ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NAME_CANNOT_BE_CHANGED);
+                log.info("service name {} cannot be updated once the service has been certified once.",
+                    serviceNameUpdated);
+                ResponseFormat errorResponse = componentsUtils
+                    .getResponseFormat(ActionStatus.SERVICE_NAME_CANNOT_BE_CHANGED);
                 return Either.right(errorResponse);
             }
         }
@@ -1480,7 +1557,9 @@
         }
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateServiceRole(User user, Service currentService, Service updatedService, AuditingActionEnum auditingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateServiceRole(User user, Service currentService,
+                                                                         Service updatedService,
+                                                                         AuditingActionEnum auditingAction) {
         String updatedServiceRole = updatedService.getServiceRole();
         String currentServiceRole = currentService.getServiceRole();
         if (!currentServiceRole.equals(updatedServiceRole)) {
@@ -1488,7 +1567,8 @@
                 serviceRoleValidator.validateAndCorrectField(user, updatedService, auditingAction);
             } catch (ComponentException exp) {
                 ResponseFormat errorResponse = exp.getResponseFormat();
-                componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, auditingAction, ComponentTypeEnum.SERVICE);
+                componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, auditingAction,
+                    ComponentTypeEnum.SERVICE);
                 return Either.right(errorResponse);
             }
             currentService.setServiceRole(updatedServiceRole);
@@ -1496,15 +1576,18 @@
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateInstantiationTypeValue(User user, Service currentService, Service updatedService, AuditingActionEnum auditingAction) {
-        String updatedInstaType= updatedService.getInstantiationType();
+    private Either<Boolean, ResponseFormat> validateAndUpdateInstantiationTypeValue(User user, Service currentService,
+                                                                                    Service updatedService,
+                                                                                    AuditingActionEnum auditingAction) {
+        String updatedInstaType = updatedService.getInstantiationType();
         String currentInstaType = currentService.getInstantiationType();
         if (!currentInstaType.equals(updatedInstaType)) {
             try {
                 serviceInstantiationTypeValidator.validateAndCorrectField(user, updatedService, auditingAction);
             } catch (ComponentException exp) {
                 ResponseFormat errorResponse = exp.getResponseFormat();
-                componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, auditingAction, ComponentTypeEnum.SERVICE);
+                componentsUtils.auditComponentAdmin(errorResponse, user, updatedService, auditingAction,
+                    ComponentTypeEnum.SERVICE);
                 return Either.right(errorResponse);
             }
             currentService.setInstantiationType(updatedInstaType);
@@ -1512,7 +1595,9 @@
         return Either.left(true);
     }
 
-    private Either<Boolean, ResponseFormat> validateAndUpdateCategory(User user, Service currentService, Service serviceUpdate, boolean hasBeenCertified, AuditingActionEnum audatingAction) {
+    private Either<Boolean, ResponseFormat> validateAndUpdateCategory(User user, Service currentService,
+                                                                      Service serviceUpdate, boolean hasBeenCertified,
+                                                                      AuditingActionEnum audatingAction) {
         try {
             List<CategoryDefinition> categoryUpdated = serviceUpdate.getCategories();
             List<CategoryDefinition> categoryCurrent = currentService.getCategories();
@@ -1521,8 +1606,10 @@
                 if (!hasBeenCertified) {
                     currentService.setCategories(categoryUpdated);
                 } else {
-                    log.info("category {} cannot be updated once the service has been certified once.", categoryUpdated);
-                    ResponseFormat errorResponse = componentsUtils.getResponseFormat(ActionStatus.SERVICE_CATEGORY_CANNOT_BE_CHANGED);
+                    log.info("category {} cannot be updated once the service has been certified once.",
+                        categoryUpdated);
+                    ResponseFormat errorResponse = componentsUtils
+                        .getResponseFormat(ActionStatus.SERVICE_CATEGORY_CANNOT_BE_CHANGED);
                     return Either.right(errorResponse);
                 }
             }
@@ -1535,10 +1622,11 @@
 
     public Either<ServiceRelations, ResponseFormat> getServiceComponentsRelations(String serviceId, User user) {
         Either<Service, ResponseFormat> serviceResponseFormatEither = getService(serviceId, user);
-        if (serviceResponseFormatEither.isRight()){
+        if (serviceResponseFormatEither.isRight()) {
             return Either.right(serviceResponseFormatEither.right().value());
         }
-        final ServiceRelations serviceRelations = new ForwardingPathUtils().convertServiceToServiceRelations(serviceResponseFormatEither.left().value());
+        final ServiceRelations serviceRelations = new ForwardingPathUtils()
+            .convertServiceToServiceRelations(serviceResponseFormatEither.left().value());
         return Either.left(serviceRelations);
 
 
@@ -1551,7 +1639,8 @@
         Either<Service, StorageOperationStatus> serviceStatus = toscaOperationFacade.getToscaElement(serviceId);
         if (serviceStatus.isRight()) {
             log.debug("failed to get service {}", serviceId);
-            return componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceStatus.right().value()), "");
+            return componentsUtils
+                .getResponseFormat(componentsUtils.convertFromStorageResponse(serviceStatus.right().value()), "");
         }
 
         Service service = serviceStatus.left().value();
@@ -1567,9 +1656,9 @@
                 responseFormat = componentsUtils.getResponseFormatByResource(actionStatus, service.getName());
             }
             return responseFormat;
-        }catch (ComponentException e){
+        } catch (ComponentException e) {
             return e.getResponseFormat();
-        }finally {
+        } finally {
             if (result == null || result != StorageOperationStatus.OK) {
                 log.warn("operation failed. do rollback");
                 BeEcompErrorManager.getInstance().logBeSystemError("Delete Service");
@@ -1607,10 +1696,10 @@
             }
             return responseFormat;
 
-        }catch (ComponentException e){
+        } catch (ComponentException e) {
             result = StorageOperationStatus.GENERAL_ERROR;
             return componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR);
-        }finally {
+        } finally {
             if (result == null || result != StorageOperationStatus.OK) {
                 log.warn("operation failed. do rollback");
                 BeEcompErrorManager.getInstance().logBeSystemError("Delete Service");
@@ -1631,26 +1720,32 @@
         Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaElement(serviceId);
         if (storageStatus.isRight()) {
             log.debug("failed to get service by id {}", serviceId);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), serviceId));
+            return Either.right(componentsUtils.getResponseFormat(
+                componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE),
+                serviceId));
         }
 
-        if(!(storageStatus.left().value() instanceof Service)){
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND), serviceId));
+        if (!(storageStatus.left().value() instanceof Service)) {
+            return Either.right(componentsUtils
+                .getResponseFormat(componentsUtils.convertFromStorageResponse(StorageOperationStatus.NOT_FOUND),
+                    serviceId));
         }
         Service service = storageStatus.left().value();
         return Either.left(service);
 
 
-
-
     }
 
-    public Either<Service, ResponseFormat> getServiceByNameAndVersion(String serviceName, String serviceVersion, String userId) {
+    public Either<Service, ResponseFormat> getServiceByNameAndVersion(String serviceName, String serviceVersion,
+                                                                      String userId) {
         validateUserExists(userId);
-        Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getComponentByNameAndVersion(ComponentTypeEnum.SERVICE, serviceName, serviceVersion);
+        Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade
+            .getComponentByNameAndVersion(ComponentTypeEnum.SERVICE, serviceName, serviceVersion);
         if (storageStatus.isRight()) {
             log.debug("failed to get service by name {} and version {}", serviceName, serviceVersion);
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), serviceName));
+            return Either.right(componentsUtils.getResponseFormat(
+                componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE),
+                serviceName));
         }
         Service service = storageStatus.left().value();
         return Either.left(service);
@@ -1664,11 +1759,14 @@
         // moved to ArtifactOperation
         String serviceUniqueId = service.getUniqueId();
         Map<String, ArtifactDefinition> artifactMap = service.getArtifacts();
-        if (artifactMap == null)
+        if (artifactMap == null) {
             artifactMap = new HashMap<>();
+        }
 
-        Map<String, Object> informationalServiceArtifacts = ConfigurationManager.getConfigurationManager().getConfiguration().getInformationalServiceArtifacts();
-        List<String> exludeServiceCategory = ConfigurationManager.getConfigurationManager().getConfiguration().getExcludeServiceCategory();
+        Map<String, Object> informationalServiceArtifacts = ConfigurationManager.getConfigurationManager()
+            .getConfiguration().getInformationalServiceArtifacts();
+        List<String> exludeServiceCategory = ConfigurationManager.getConfigurationManager().getConfiguration()
+            .getExcludeServiceCategory();
 
         String category = service.getCategories().get(0).getName();
         boolean isCreateArtifact = true;
@@ -1685,8 +1783,10 @@
         if (informationalServiceArtifacts != null && isCreateArtifact) {
             Set<String> keys = informationalServiceArtifacts.keySet();
             for (String informationalServiceArtifactName : keys) {
-                Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalServiceArtifacts.get(informationalServiceArtifactName);
-                ArtifactDefinition artifactDefinition = createArtifactDefinition(serviceUniqueId, informationalServiceArtifactName, artifactInfoMap, user, false);
+                Map<String, Object> artifactInfoMap = (Map<String, Object>) informationalServiceArtifacts
+                    .get(informationalServiceArtifactName);
+                ArtifactDefinition artifactDefinition = createArtifactDefinition(serviceUniqueId,
+                    informationalServiceArtifactName, artifactInfoMap, user, false);
                 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
 
             }
@@ -1695,9 +1795,13 @@
         }
     }
 
-    private ArtifactDefinition createArtifactDefinition(String serviceId, String logicalName, Map<String, Object> artifactInfoMap, User user, Boolean isServiceApi) {
+    private ArtifactDefinition createArtifactDefinition(String serviceId, String logicalName,
+                                                        Map<String, Object> artifactInfoMap, User user,
+                                                        Boolean isServiceApi) {
 
-        ArtifactDefinition artifactInfo = artifactsBusinessLogic.createArtifactPlaceHolderInfo(serviceId, logicalName, artifactInfoMap, user, ArtifactGroupTypeEnum.INFORMATIONAL);
+        ArtifactDefinition artifactInfo = artifactsBusinessLogic
+            .createArtifactPlaceHolderInfo(serviceId, logicalName, artifactInfoMap, user,
+                ArtifactGroupTypeEnum.INFORMATIONAL);
 
         if (isServiceApi) {
             artifactInfo.setMandatory(false);
@@ -1712,15 +1816,17 @@
         transitionEnum = DistributionTransitionEnum.getFromDisplayName(distributionTransition);
         if (transitionEnum == null) {
             BeEcompErrorManager.getInstance().logBeSystemError(CHANGE_SERVICE_DISTRIBUTION);
-            log.info("state operation is not valid. operations allowed are: {}", DistributionTransitionEnum.valuesAsString());
-            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.UNSUPPORTED_DISTRIBUTION_STATUS, distributionTransition));
+            log.info("state operation is not valid. operations allowed are: {}",
+                DistributionTransitionEnum.valuesAsString());
+            throw new ByResponseFormatComponentException(componentsUtils
+                .getResponseFormat(ActionStatus.UNSUPPORTED_DISTRIBUTION_STATUS, distributionTransition));
         }
 
         return transitionEnum;
     }
 
     private String validateComment(LifecycleChangeInfoWithAction comment) {
-        if (comment==null || StringUtils.isEmpty(comment.getUserRemarks())) {
+        if (comment == null || StringUtils.isEmpty(comment.getUserRemarks())) {
             return "";
         }
         String data = comment.getUserRemarks();
@@ -1732,34 +1838,43 @@
         if (!ValidationUtils.validateLength(data, ValidationUtils.COMMENT_MAX_LENGTH)) {
             BeEcompErrorManager.getInstance().logBeInvalidJsonInput(CHANGE_SERVICE_DISTRIBUTION);
             log.debug("user comment exceeds limit.");
-            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.EXCEEDS_LIMIT, "comment", String.valueOf(ValidationUtils.COMMENT_MAX_LENGTH)));
+            throw new ByResponseFormatComponentException(componentsUtils
+                .getResponseFormat(ActionStatus.EXCEEDS_LIMIT, "comment",
+                    String.valueOf(ValidationUtils.COMMENT_MAX_LENGTH)));
         }
         if (!ValidationUtils.validateCommentPattern(data)) {
-            throw new ByResponseFormatComponentException(componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
+            throw new ByResponseFormatComponentException(
+                componentsUtils.getResponseFormat(ActionStatus.INVALID_CONTENT));
         }
 
         return data;
     }
 
-    private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component, ResponseFormat responseFormat) {
+    private void createAudit(User user, AuditingActionEnum auditAction, String comment, Service component,
+                             ResponseFormat responseFormat) {
         log.debug(AUDIT_BEFORE_SENDING_RESPONSE);
-        componentsUtils.auditComponent(responseFormat, user, component, auditAction, new ResourceCommonInfo(ComponentTypeEnum.SERVICE.getValue()),
-                ResourceVersionInfo.newBuilder()
-                        .state(component.getLifecycleState().name())
-                        .version(component.getVersion())
-                        .build(),
-                comment);
+        componentsUtils.auditComponent(responseFormat, user, component, auditAction,
+            new ResourceCommonInfo(ComponentTypeEnum.SERVICE.getValue()),
+            ResourceVersionInfo.newBuilder()
+                .state(component.getLifecycleState().name())
+                .version(component.getVersion())
+                .build(),
+            comment);
     }
 
     private String getEnvNameFromConfiguration() {
-        String configuredEnvName = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getEnvironments().get(0);
+        String configuredEnvName = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration()
+            .getEnvironments().get(0);
         log.trace("Update environment name to be {}", configuredEnvName);
         return configuredEnvName;
     }
 
-    public Either<String, ResponseFormat> activateServiceOnTenantEnvironment(String serviceId, String envId, User modifier, ServiceDistributionReqInfo data) {
+    public Either<String, ResponseFormat> activateServiceOnTenantEnvironment(String serviceId, String envId,
+                                                                             User modifier,
+                                                                             ServiceDistributionReqInfo data) {
 
-        Either<ActivationRequestInformation, ResponseFormat> activationRequestInformationEither = serviceDistributionValidation.validateActivateServiceRequest(serviceId, envId, modifier, data);
+        Either<ActivationRequestInformation, ResponseFormat> activationRequestInformationEither = serviceDistributionValidation
+            .validateActivateServiceRequest(serviceId, envId, modifier, data);
         if (activationRequestInformationEither.isRight()) {
             return Either.right(activationRequestInformationEither.right().value());
         }
@@ -1769,14 +1884,18 @@
         Either<String, ResponseFormat> result = null;
         String did = ThreadLocalsHolder.getUuid();
         Service service = activationRequestInformation.getServiceToActivate();
-        result = buildAndSendServiceNotification(service, envId, did, activationRequestInformation.getWorkloadContext(), modifier);
+        result = buildAndSendServiceNotification(service, envId, did, activationRequestInformation.getWorkloadContext(),
+            modifier);
         return result;
     }
 
-    public Either<String, ResponseFormat> buildAndSendServiceNotification(Service service, String envId, String did, String workloadContext, User modifier) {
+    public Either<String, ResponseFormat> buildAndSendServiceNotification(Service service, String envId, String did,
+                                                                          String workloadContext, User modifier) {
         String envName = getEnvNameFromConfiguration();
-        INotificationData notificationData = distributionEngine.buildServiceForDistribution(service, did, workloadContext);
-        ActionStatus notifyServiceResponse = distributionEngine.notifyService(did, service, notificationData, envId, envName, modifier);
+        INotificationData notificationData = distributionEngine
+            .buildServiceForDistribution(service, did, workloadContext);
+        ActionStatus notifyServiceResponse = distributionEngine
+            .notifyService(did, service, notificationData, envId, envName, modifier);
         if (notifyServiceResponse == ActionStatus.OK) {
             return Either.left(did);
         } else {
@@ -1787,7 +1906,8 @@
         }
     }
 
-    public Either<Service, ResponseFormat> activateDistribution(String serviceId, String envName, User modifier, HttpServletRequest request) {
+    public Either<Service, ResponseFormat> activateDistribution(String serviceId, String envName, User modifier,
+                                                                HttpServletRequest request) {
 
         User user = validateUserExists(modifier.getUserId());
         validateUserRole(user, Collections.singletonList(Role.DESIGNER));
@@ -1795,8 +1915,9 @@
         ResponseFormat response;
         Service updatedService;
         String did = ThreadLocalsHolder.getUuid();
-         // DE194021
-        String configuredEnvName = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration().getEnvironments().get(0);
+        // DE194021
+        String configuredEnvName = ConfigurationManager.getConfigurationManager().getDistributionEngineConfiguration()
+            .getEnvironments().get(0);
         if (configuredEnvName != null && !configuredEnvName.equals(envName)) {
             log.trace("Update environment name to be {} instead of {}", configuredEnvName, envName);
             envName = configuredEnvName;
@@ -1815,22 +1936,28 @@
         Either<Service, StorageOperationStatus> serviceRes = toscaOperationFacade.getToscaElement(serviceId);
         if (serviceRes.isRight()) {
             log.debug("failed retrieving service");
-            response = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceRes.right().value(), ComponentTypeEnum.SERVICE), serviceId);
+            response = componentsUtils.getResponseFormat(
+                componentsUtils.convertFromStorageResponse(serviceRes.right().value(), ComponentTypeEnum.SERVICE),
+                serviceId);
             componentsUtils.auditComponent(response, user, null, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST,
-                    new ResourceCommonInfo(ComponentTypeEnum.SERVICE.getValue()),
-                    ResourceVersionInfo.newBuilder()
-                            .build(),
-                    did);
+                new ResourceCommonInfo(ComponentTypeEnum.SERVICE.getValue()),
+                ResourceVersionInfo.newBuilder()
+                    .build(),
+                did);
             return Either.right(response);
         }
         Service service = serviceRes.left().value();
         if (service.isArchived()) {
             log.info("Component is archived. Component id: {}", serviceId);
-            return Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, service.getName()));
+            return Either
+                .right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_IS_ARCHIVED, service.getName()));
         }
         if (service.getLifecycleState() != LifecycleStateEnum.CERTIFIED) {
-            log.info("service {} is  not available for distribution. Should be in certified state", service.getUniqueId());
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION, service.getVersion(), service.getName());
+            log.info("service {} is  not available for distribution. Should be in certified state",
+                service.getUniqueId());
+            ResponseFormat responseFormat = componentsUtils
+                .getResponseFormat(ActionStatus.SERVICE_NOT_AVAILABLE_FOR_DISTRIBUTION, service.getVersion(),
+                    service.getName());
             return Either.right(responseFormat);
         }
         String dcurrStatus = service.getDistributionStatus().name();
@@ -1838,9 +1965,11 @@
         StorageOperationStatus readyForDistribution = distributionEngine.isReadyForDistribution(envName);
         if (readyForDistribution == StorageOperationStatus.OK) {
             INotificationData notificationData = distributionEngine.buildServiceForDistribution(service, did, null);
-            ActionStatus notifyServiceResponse = distributionEngine.notifyService(did, service, notificationData, envName, user);
+            ActionStatus notifyServiceResponse = distributionEngine
+                .notifyService(did, service, notificationData, envName, user);
             if (notifyServiceResponse == ActionStatus.OK) {
-                Either<Service, ResponseFormat> updateStateRes = updateDistributionStatusForActivation(service, user, DistributionStatusEnum.DISTRIBUTED);
+                Either<Service, ResponseFormat> updateStateRes = updateDistributionStatusForActivation(service, user,
+                    DistributionStatusEnum.DISTRIBUTED);
                 if (updateStateRes.isLeft() && updateStateRes.left().value() != null) {
                     updatedService = updateStateRes.left().value();
                     updatedStatus = updatedService.getDistributionStatus().name();
@@ -1858,30 +1987,33 @@
                 result = Either.right(response);
             }
         } else {
-            response = componentsUtils.getResponseFormatByDE(componentsUtils.convertFromStorageResponse(readyForDistribution, ComponentTypeEnum.SERVICE), envName);
+            response = componentsUtils.getResponseFormatByDE(
+                componentsUtils.convertFromStorageResponse(readyForDistribution, ComponentTypeEnum.SERVICE), envName);
             result = Either.right(response);
         }
         componentsUtils.auditComponent(response, user, service, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST,
-                new ResourceCommonInfo(service.getName(),ComponentTypeEnum.SERVICE.getValue()),
-                ResourceVersionInfo.newBuilder()
-                        .distributionStatus(dcurrStatus)
-                        .build(),
-                ResourceVersionInfo.newBuilder()
-                        .distributionStatus(updatedStatus)
-                        .build(),
-                null, null, did);
+            new ResourceCommonInfo(service.getName(), ComponentTypeEnum.SERVICE.getValue()),
+            ResourceVersionInfo.newBuilder()
+                .distributionStatus(dcurrStatus)
+                .build(),
+            ResourceVersionInfo.newBuilder()
+                .distributionStatus(updatedStatus)
+                .build(),
+            null, null, did);
         return result;
     }
 
     // convert to private after deletion of temp url
-    public Either<Service, ResponseFormat> updateDistributionStatusForActivation(Service service, User user, DistributionStatusEnum state) {
+    public Either<Service, ResponseFormat> updateDistributionStatusForActivation(Service service, User user,
+                                                                                 DistributionStatusEnum state) {
 
         validateUserExists(user.getUserId());
 
         String serviceId = service.getUniqueId();
-         lockComponent(serviceId, service, "updateDistributionStatusForActivation");
+        lockComponent(serviceId, service, "updateDistributionStatusForActivation");
         try {
-            Either<Service, StorageOperationStatus> result = toscaOperationFacade.updateDistributionStatus(service, user, state);
+            Either<Service, StorageOperationStatus> result = toscaOperationFacade
+                .updateDistributionStatus(service, user, state);
             if (result.isRight()) {
                 janusGraphDao.rollback();
                 BeEcompErrorManager.getInstance().logBeSystemError("updateDistributionStatusForActivation");
@@ -1904,9 +2036,12 @@
         AuditingActionEnum auditAction = AuditingActionEnum.DISTRIBUTION_DEPLOY;
         Either<Service, StorageOperationStatus> getServiceResponse = toscaOperationFacade.getToscaElement(serviceId);
         if (getServiceResponse.isRight()) {
-            BeEcompErrorManager.getInstance().logBeComponentMissingError("markDistributionAsDeployed", ComponentTypeEnum.SERVICE.getValue(), serviceId);
+            BeEcompErrorManager.getInstance()
+                .logBeComponentMissingError("markDistributionAsDeployed", ComponentTypeEnum.SERVICE.getValue(),
+                    serviceId);
             log.debug("service {} not found", serviceId);
-            ResponseFormat responseFormat = auditDeployError(did, user, auditAction, null, componentsUtils.convertFromStorageResponse(getServiceResponse.right().value(), ComponentTypeEnum.SERVICE), "");
+            ResponseFormat responseFormat = auditDeployError(did, user, auditAction, null, componentsUtils
+                .convertFromStorageResponse(getServiceResponse.right().value(), ComponentTypeEnum.SERVICE), "");
 
             return Either.right(responseFormat);
         }
@@ -1917,16 +2052,19 @@
 
     }
 
-    public Either<Service, ResponseFormat> generateVfModuleArtifacts(Service service, User modifier, boolean shouldLock, boolean inTransaction) {
+    public Either<Service, ResponseFormat> generateVfModuleArtifacts(Service service, User modifier, boolean shouldLock,
+                                                                     boolean inTransaction) {
         Function<ComponentInstance, List<ArtifactGenerator<ArtifactDefinition>>> artifactTaskGeneratorCreator = ri ->
-                // Only one VF Module Artifact per instance - add it to a list of one
-                buildArtifactGenList(service, modifier, shouldLock, inTransaction, ri);
+            // Only one VF Module Artifact per instance - add it to a list of one
+            buildArtifactGenList(service, modifier, shouldLock, inTransaction, ri);
 
         return generateDeploymentArtifacts(service, artifactTaskGeneratorCreator);
 
     }
 
-    private List<ArtifactGenerator<ArtifactDefinition>> buildArtifactGenList(Service service, User modifier, boolean shouldLock, boolean inTransaction, ComponentInstance ri) {
+    private List<ArtifactGenerator<ArtifactDefinition>> buildArtifactGenList(Service service, User modifier,
+                                                                             boolean shouldLock, boolean inTransaction,
+                                                                             ComponentInstance ri) {
         List<ArtifactGenerator<ArtifactDefinition>> asList = new ArrayList<>();
 
         if (ri.getOriginType() == OriginTypeEnum.VF) {
@@ -1937,13 +2075,15 @@
 
     private List<GroupInstance> collectGroupsInstanceForCompInstance(ComponentInstance currVF) {
         Map<String, ArtifactDefinition> deploymentArtifacts = currVF.getDeploymentArtifacts();
-        if(currVF.getGroupInstances() != null){
+        if (currVF.getGroupInstances() != null) {
             currVF.getGroupInstances().forEach(gi -> gi.alignArtifactsUuid(deploymentArtifacts));
         }
         return currVF.getGroupInstances();
     }
 
-    private ArtifactDefinition getVfModuleInstArtifactForCompInstance(ComponentInstance currVF, Service service, Wrapper<String> payloadWrapper, Wrapper<ResponseFormat> responseWrapper) {
+    private ArtifactDefinition getVfModuleInstArtifactForCompInstance(ComponentInstance currVF, Service service,
+                                                                      Wrapper<String> payloadWrapper,
+                                                                      Wrapper<ResponseFormat> responseWrapper) {
         ArtifactDefinition vfModuleAertifact = null;
         if (MapUtils.isNotEmpty(currVF.getDeploymentArtifacts())) {
             final Optional<ArtifactDefinition> optionalVfModuleArtifact =
@@ -1955,7 +2095,8 @@
             }
         }
         if (vfModuleAertifact == null) {
-            Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact = createVfModuleArtifact(currVF, service, payloadWrapper.getInnerElement());
+            Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact = createVfModuleArtifact(currVF, service,
+                payloadWrapper.getInnerElement());
             if (createVfModuleArtifact.isLeft()) {
                 vfModuleAertifact = createVfModuleArtifact.left().value();
             } else {
@@ -1982,7 +2123,11 @@
 
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> generateVfModuleInstanceArtifact(User modifier, ComponentInstance currVFInstance, Service service, boolean shouldLock, boolean inTransaction) {
+    private Either<ArtifactDefinition, ResponseFormat> generateVfModuleInstanceArtifact(User modifier,
+                                                                                        ComponentInstance currVFInstance,
+                                                                                        Service service,
+                                                                                        boolean shouldLock,
+                                                                                        boolean inTransaction) {
         ArtifactDefinition vfModuleArtifact = null;
         Wrapper<ResponseFormat> responseWrapper = new Wrapper<>();
         Wrapper<String> payloadWrapper = new Wrapper<>();
@@ -1991,10 +2136,12 @@
             fillVfModuleInstHeatEnvPayload(groupsForCurrVF, payloadWrapper);
         }
         if (responseWrapper.isEmpty() && payloadWrapper.getInnerElement() != null) {
-            vfModuleArtifact = getVfModuleInstArtifactForCompInstance(currVFInstance, service, payloadWrapper, responseWrapper);
+            vfModuleArtifact = getVfModuleInstArtifactForCompInstance(currVFInstance, service, payloadWrapper,
+                responseWrapper);
         }
         if (responseWrapper.isEmpty() && vfModuleArtifact != null) {
-            vfModuleArtifact = fillVfModulePayload(modifier, currVFInstance, vfModuleArtifact, shouldLock, inTransaction, payloadWrapper, responseWrapper, service);
+            vfModuleArtifact = fillVfModulePayload(modifier, currVFInstance, vfModuleArtifact, shouldLock,
+                inTransaction, payloadWrapper, responseWrapper, service);
         }
 
         Either<ArtifactDefinition, ResponseFormat> result;
@@ -2007,10 +2154,16 @@
         return result;
     }
 
-    private ArtifactDefinition fillVfModulePayload(User modifier, ComponentInstance currVF, ArtifactDefinition vfModuleArtifact, boolean shouldLock, boolean inTransaction, Wrapper<String> payloadWrapper, Wrapper<ResponseFormat> responseWrapper, Service service) {
+    private ArtifactDefinition fillVfModulePayload(User modifier, ComponentInstance currVF,
+                                                   ArtifactDefinition vfModuleArtifact, boolean shouldLock,
+                                                   boolean inTransaction, Wrapper<String> payloadWrapper,
+                                                   Wrapper<ResponseFormat> responseWrapper, Service service) {
         ArtifactDefinition result = null;
-        Either<ArtifactDefinition, ResponseFormat> eitherPayload = artifactsBusinessLogic.generateArtifactPayload(vfModuleArtifact, ComponentTypeEnum.RESOURCE_INSTANCE, service, currVF.getName(), modifier, shouldLock, inTransaction, System::currentTimeMillis,
-                () -> Either.left(artifactsBusinessLogic.createEsArtifactData(vfModuleArtifact, payloadWrapper.getInnerElement().getBytes(StandardCharsets.UTF_8))), currVF.getUniqueId());
+        Either<ArtifactDefinition, ResponseFormat> eitherPayload = artifactsBusinessLogic
+            .generateArtifactPayload(vfModuleArtifact, ComponentTypeEnum.RESOURCE_INSTANCE, service, currVF.getName(),
+                modifier, shouldLock, inTransaction, System::currentTimeMillis,
+                () -> Either.left(artifactsBusinessLogic.createEsArtifactData(vfModuleArtifact,
+                    payloadWrapper.getInnerElement().getBytes(StandardCharsets.UTF_8))), currVF.getUniqueId());
         if (eitherPayload.isLeft()) {
             result = eitherPayload.left().value();
         } else {
@@ -2023,7 +2176,8 @@
         return result;
     }
 
-    private Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact(ComponentInstance currVF, Service service, String vfModulePayloadString) {
+    private Either<ArtifactDefinition, ResponseFormat> createVfModuleArtifact(ComponentInstance currVF, Service service,
+                                                                              String vfModulePayloadString) {
 
         ArtifactDefinition vfModuleArtifactDefinition = new ArtifactDefinition();
         String newCheckSum = null;
@@ -2041,47 +2195,60 @@
         }
         vfModuleArtifactDefinition.setArtifactChecksum(newCheckSum);
 
-        Either<ArtifactDefinition, StorageOperationStatus> addArtifactToComponent = artifactToscaOperation.addArtifactToComponent(
+        Either<ArtifactDefinition, StorageOperationStatus> addArtifactToComponent = artifactToscaOperation
+            .addArtifactToComponent(
                 vfModuleArtifactDefinition, service, NodeTypeEnum.ResourceInstance, true, currVF.getUniqueId());
 
         Either<ArtifactDefinition, ResponseFormat> result;
         if (addArtifactToComponent.isLeft()) {
             result = Either.left(addArtifactToComponent.left().value());
         } else {
-            result = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(addArtifactToComponent.right().value())));
+            result = Either.right(componentsUtils
+                .getResponseFormat(componentsUtils.convertFromStorageResponse(addArtifactToComponent.right().value())));
         }
 
         return result;
     }
 
-    public Either<Service, ResponseFormat> generateHeatEnvArtifacts(Service service, User modifier, boolean shouldLock, boolean inTransaction) {
+    public Either<Service, ResponseFormat> generateHeatEnvArtifacts(Service service, User modifier, boolean shouldLock,
+                                                                    boolean inTransaction) {
 
         Function<ComponentInstance, List<ArtifactGenerator<ArtifactDefinition>>> artifactTaskGeneratorCreator = resourceInstance ->
-                // Get All Deployment Artifacts
-                service.getComponentInstances().stream().filter(ri -> ri != null && ri == resourceInstance).filter(ri -> ri.getDeploymentArtifacts() != null).flatMap(ri -> ri.getDeploymentArtifacts().values().stream()).
-                        // Filter in Only Heat Env
-                                filter(depArtifact -> ArtifactTypeEnum.HEAT_ENV.getType().equals(depArtifact.getArtifactType())).
-                        // Create ArtifactGenerator from those Artifacts
-                                map(depArtifact -> new HeatEnvArtifactGenerator(depArtifact, service, resourceInstance.getName(), modifier, shouldLock, inTransaction, resourceInstance.getUniqueId())).collect(Collectors.toList());
+            // Get All Deployment Artifacts
+            service.getComponentInstances().stream().filter(ri -> ri != null && ri == resourceInstance)
+                .filter(ri -> ri.getDeploymentArtifacts() != null)
+                .flatMap(ri -> ri.getDeploymentArtifacts().values().stream()).
+                // Filter in Only Heat Env
+                    filter(depArtifact -> ArtifactTypeEnum.HEAT_ENV.getType().equals(depArtifact.getArtifactType())).
+                // Create ArtifactGenerator from those Artifacts
+                    map(depArtifact -> new HeatEnvArtifactGenerator(depArtifact, service, resourceInstance.getName(),
+                    modifier, shouldLock, inTransaction, resourceInstance.getUniqueId())).collect(Collectors.toList());
 
         return generateDeploymentArtifacts(service, artifactTaskGeneratorCreator);
 
     }
 
-    private <CallVal> Either<Service, ResponseFormat> generateDeploymentArtifacts(Service service, Function<ComponentInstance, List<ArtifactGenerator<CallVal>>> artifactTaskGeneratorCreator) {
+    private <CallVal> Either<Service, ResponseFormat> generateDeploymentArtifacts(Service service,
+                                                                                  Function<ComponentInstance, List<ArtifactGenerator<CallVal>>> artifactTaskGeneratorCreator) {
 
         // Get Flat List of (Callable) ArtifactGenerator for all the RI in the
         // service
         if (service.getComponentInstances() != null) {
-            List<ArtifactGenerator<CallVal>> artifactGenList = service.getComponentInstances().stream().flatMap(ri -> artifactTaskGeneratorCreator.apply(ri).stream()).collect(Collectors.toList());
+            List<ArtifactGenerator<CallVal>> artifactGenList = service.getComponentInstances().stream()
+                .flatMap(ri -> artifactTaskGeneratorCreator.apply(ri).stream()).collect(Collectors.toList());
             if (artifactGenList != null && !artifactGenList.isEmpty()) {
                 Either<Service, ResponseFormat> callRes = checkDeploymentArtifact(artifactGenList);
-                if (callRes != null) return callRes;
+                if (callRes != null) {
+                    return callRes;
+                }
             }
         }
-        Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade.getToscaFullElement(service.getUniqueId());
+        Either<Service, StorageOperationStatus> storageStatus = toscaOperationFacade
+            .getToscaFullElement(service.getUniqueId());
         if (storageStatus.isRight()) {
-            return Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE), ""));
+            return Either.right(componentsUtils.getResponseFormat(
+                componentsUtils.convertFromStorageResponse(storageStatus.right().value(), ComponentTypeEnum.SERVICE),
+                ""));
         }
 
         Service currentService = storageStatus.left().value();
@@ -2090,7 +2257,8 @@
 
     }
 
-    private <CallVal> Either<Service, ResponseFormat> checkDeploymentArtifact(List<ArtifactGenerator<CallVal>> artifactGenList) {
+    private <CallVal> Either<Service, ResponseFormat> checkDeploymentArtifact(
+        List<ArtifactGenerator<CallVal>> artifactGenList) {
         for (ArtifactGenerator<CallVal> entry : artifactGenList) {
             Either<CallVal, ResponseFormat> callRes;
             try {
@@ -2112,6 +2280,7 @@
     }
 
     class HeatEnvArtifactGenerator extends ArtifactGenerator<ArtifactDefinition> {
+
         ArtifactDefinition artifactDefinition;
         Service service;
         String resourceInstanceName;
@@ -2120,7 +2289,8 @@
         boolean shouldLock;
         boolean inTransaction;
 
-        HeatEnvArtifactGenerator(ArtifactDefinition artifactDefinition, Service service, String resourceInstanceName, User modifier, boolean shouldLock, boolean inTransaction, String instanceId) {
+        HeatEnvArtifactGenerator(ArtifactDefinition artifactDefinition, Service service, String resourceInstanceName,
+                                 User modifier, boolean shouldLock, boolean inTransaction, String instanceId) {
             this.artifactDefinition = artifactDefinition;
             this.service = service;
             this.resourceInstanceName = resourceInstanceName;
@@ -2132,7 +2302,9 @@
 
         @Override
         public Either<ArtifactDefinition, ResponseFormat> call() throws Exception {
-            return artifactsBusinessLogic.forceGenerateHeatEnvArtifact(artifactDefinition, ComponentTypeEnum.RESOURCE_INSTANCE, service, resourceInstanceName, modifier, shouldLock, inTransaction, instanceId);
+            return artifactsBusinessLogic
+                .forceGenerateHeatEnvArtifact(artifactDefinition, ComponentTypeEnum.RESOURCE_INSTANCE, service,
+                    resourceInstanceName, modifier, shouldLock, inTransaction, instanceId);
         }
 
         public ArtifactDefinition getArtifactDefinition() {
@@ -2142,6 +2314,7 @@
     }
 
     class VfModuleArtifactGenerator extends ArtifactGenerator<ArtifactDefinition> {
+
         private User user;
         private ComponentInstance componentInstance;
         private Service service;
@@ -2153,7 +2326,8 @@
             return generateVfModuleInstanceArtifact(user, componentInstance, service, shouldLock, inTransaction);
         }
 
-        private VfModuleArtifactGenerator(User user, ComponentInstance componentInstance, Service service, boolean shouldLock, boolean inTransaction) {
+        private VfModuleArtifactGenerator(User user, ComponentInstance componentInstance, Service service,
+                                          boolean shouldLock, boolean inTransaction) {
             super();
             this.user = user;
             this.componentInstance = componentInstance;
@@ -2164,23 +2338,29 @@
 
     }
 
-    private synchronized Either<Service, ResponseFormat> checkDistributionAndDeploy(String distributionId, User user, AuditingActionEnum auditAction, Service service) {
+    private synchronized Either<Service, ResponseFormat> checkDistributionAndDeploy(String distributionId, User user,
+                                                                                    AuditingActionEnum auditAction,
+                                                                                    Service service) {
         boolean isDeployed = isDistributionDeployed(distributionId);
         if (isDeployed) {
             return Either.left(service);
         }
-        Either<Boolean, ResponseFormat> distributionSuccess = checkDistributionSuccess(distributionId, user, auditAction, service);
+        Either<Boolean, ResponseFormat> distributionSuccess = checkDistributionSuccess(distributionId, user,
+            auditAction, service);
         if (distributionSuccess.isRight()) {
             return Either.right(distributionSuccess.right().value());
         }
 
         log.debug("mark distribution {} as deployed - success", distributionId);
-        componentsUtils.auditServiceDistributionDeployed(service.getName(), service.getVersion(), service.getUUID(), distributionId, STATUS_DEPLOYED, "OK", user);
+        componentsUtils.auditServiceDistributionDeployed(service.getName(), service.getVersion(), service.getUUID(),
+            distributionId, STATUS_DEPLOYED, "OK", user);
         return Either.left(service);
     }
 
     private boolean isDistributionDeployed(String distributionId) {
-        Either<List<DistributionDeployEvent>, ActionStatus> alreadyDeployed = auditCassandraDao.getDistributionDeployByStatus(distributionId, AuditingActionEnum.DISTRIBUTION_DEPLOY.getName(), STATUS_DEPLOYED);
+        Either<List<DistributionDeployEvent>, ActionStatus> alreadyDeployed = auditCassandraDao
+            .getDistributionDeployByStatus(distributionId, AuditingActionEnum.DISTRIBUTION_DEPLOY.getName(),
+                STATUS_DEPLOYED);
 
         boolean isDeployed = false;
         if (alreadyDeployed.isLeft() && !alreadyDeployed.left().value().isEmpty()) {
@@ -2191,14 +2371,18 @@
         return isDeployed;
     }
 
-    protected Either<Boolean, ResponseFormat> checkDistributionSuccess(String did, User user, AuditingActionEnum auditAction, Service service) {
+    protected Either<Boolean, ResponseFormat> checkDistributionSuccess(String did, User user,
+                                                                       AuditingActionEnum auditAction,
+                                                                       Service service) {
 
         log.trace("checkDistributionSuccess");
         // get all "DRequest" records for this distribution
 
-        Either<List<ResourceAdminEvent>, ActionStatus> distRequestsResponse = auditCassandraDao.getDistributionRequest(did, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName());
+        Either<List<ResourceAdminEvent>, ActionStatus> distRequestsResponse = auditCassandraDao
+            .getDistributionRequest(did, AuditingActionEnum.DISTRIBUTION_STATE_CHANGE_REQUEST.getName());
         if (distRequestsResponse.isRight()) {
-            ResponseFormat error = auditDeployError(did, user, auditAction, service, distRequestsResponse.right().value());
+            ResponseFormat error = auditDeployError(did, user, auditAction, service,
+                distRequestsResponse.right().value());
             return Either.right(error);
         }
 
@@ -2206,7 +2390,8 @@
         if (distributionRequests.isEmpty()) {
             BeEcompErrorManager.getInstance().logBeDistributionMissingError("markDistributionAsDeployed", did);
             log.info("distribution {} is not found", did);
-            ResponseFormat error = auditDeployError(did, user, auditAction, service, ActionStatus.DISTRIBUTION_REQUESTED_NOT_FOUND);
+            ResponseFormat error = auditDeployError(did, user, auditAction, service,
+                ActionStatus.DISTRIBUTION_REQUESTED_NOT_FOUND);
             return Either.right(error);
         }
         boolean isRequestSucceeded = false;
@@ -2219,9 +2404,11 @@
         }
 
         // get all "DNotify" records for this distribution
-        Either<List<DistributionNotificationEvent>, ActionStatus> distNotificationsResponse = auditCassandraDao.getDistributionNotify(did, AuditingActionEnum.DISTRIBUTION_NOTIFY.getName());
+        Either<List<DistributionNotificationEvent>, ActionStatus> distNotificationsResponse = auditCassandraDao
+            .getDistributionNotify(did, AuditingActionEnum.DISTRIBUTION_NOTIFY.getName());
         if (distNotificationsResponse.isRight()) {
-            ResponseFormat error = auditDeployError(did, user, auditAction, service, distNotificationsResponse.right().value());
+            ResponseFormat error = auditDeployError(did, user, auditAction, service,
+                distNotificationsResponse.right().value());
             return Either.right(error);
         }
 
@@ -2246,7 +2433,8 @@
         return Either.left(true);
     }
 
-    private ResponseFormat auditDeployError(String did, User user, AuditingActionEnum auditAction, Service service, ActionStatus status, String... params) {
+    private ResponseFormat auditDeployError(String did, User user, AuditingActionEnum auditAction, Service service,
+                                            ActionStatus status, String... params) {
 
         ResponseFormat error = componentsUtils.getResponseFormat(status, params);
         String message = "";
@@ -2256,9 +2444,12 @@
         message += error.getFormattedMessage();
 
         if (service != null) {
-            componentsUtils.auditServiceDistributionDeployed(service.getName(), service.getVersion(), service.getUUID(), did, error.getStatus().toString(), message, user);
+            componentsUtils
+                .auditServiceDistributionDeployed(service.getName(), service.getVersion(), service.getUUID(), did,
+                    error.getStatus().toString(), message, user);
         } else {
-            componentsUtils.auditServiceDistributionDeployed("", "", "", did, error.getStatus().toString(), message, user);
+            componentsUtils
+                .auditServiceDistributionDeployed("", "", "", did, error.getStatus().toString(), message, user);
         }
         return error;
     }
@@ -2269,9 +2460,9 @@
         List<Role> roles = new ArrayList<>();
         roles.add(Role.ADMIN);
         roles.add(Role.DESIGNER);
-        try{
+        try {
             validateUserRole(user, service, roles, auditAction, null);
-        } catch (ByActionStatusComponentException e){
+        } catch (ByActionStatusComponentException e) {
             log.info("role {} is not allowed to perform this action", user.getRole());
             auditDeployError(did, user, auditAction, service, e.getActionStatus());
             throw e;
@@ -2281,31 +2472,33 @@
 
     @Override
     public void setDeploymentArtifactsPlaceHolder(Component component, User user) {
-        if(component instanceof Service){
+        if (component instanceof Service) {
             Service service = (Service) component;
             Map<String, ArtifactDefinition> artifactMap = service.getDeploymentArtifacts();
             if (artifactMap == null) {
                 artifactMap = new HashMap<>();
             }
             service.setDeploymentArtifacts(artifactMap);
-        }else if(component instanceof Resource){
+        } else if (component instanceof Resource) {
             Resource resource = (Resource) component;
             Map<String, ArtifactDefinition> artifactMap = resource.getDeploymentArtifacts();
             if (artifactMap == null) {
                 artifactMap = new HashMap<>();
             }
             Map<String, Object> deploymentResourceArtifacts = ConfigurationManager.getConfigurationManager()
-                                                                      .getConfiguration().getDeploymentResourceArtifacts();
+                .getConfiguration().getDeploymentResourceArtifacts();
             if (deploymentResourceArtifacts != null) {
                 Map<String, ArtifactDefinition> finalArtifactMap = artifactMap;
-                deploymentResourceArtifacts.forEach((k, v)->processDeploymentResourceArtifacts(user, resource, finalArtifactMap, k,v));
+                deploymentResourceArtifacts
+                    .forEach((k, v) -> processDeploymentResourceArtifacts(user, resource, finalArtifactMap, k, v));
             }
             resource.setDeploymentArtifacts(artifactMap);
         }
 
     }
 
-    private void processDeploymentResourceArtifacts(User user, Resource resource, Map<String, ArtifactDefinition> artifactMap, String k, Object v) {
+    private void processDeploymentResourceArtifacts(User user, Resource resource,
+                                                    Map<String, ArtifactDefinition> artifactMap, String k, Object v) {
         Map<String, Object> artifactDetails = (Map<String, Object>) v;
         Object object = artifactDetails.get(PLACE_HOLDER_RESOURCE_TYPES);
         if (object != null) {
@@ -2315,14 +2508,14 @@
             }
         } else {
             log.info("resource types for artifact placeholder {} were not defined. default is all resources",
-                    k);
+                k);
         }
         if (artifactsBusinessLogic != null) {
             ArtifactDefinition artifactDefinition = artifactsBusinessLogic.createArtifactPlaceHolderInfo(
-                    resource.getUniqueId(), k, (Map<String, Object>) v,
-                    user, ArtifactGroupTypeEnum.DEPLOYMENT);
+                resource.getUniqueId(), k, (Map<String, Object>) v,
+                user, ArtifactGroupTypeEnum.DEPLOYMENT);
             if (artifactDefinition != null
-                    && !artifactMap.containsKey(artifactDefinition.getArtifactLabel())) {
+                && !artifactMap.containsKey(artifactDefinition.getArtifactLabel())) {
                 artifactMap.put(artifactDefinition.getArtifactLabel(), artifactDefinition);
             }
         }
@@ -2334,7 +2527,8 @@
     }
 
     private HealthCheckBusinessLogic getHealthCheckBL(ServletContext context) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         return webApplicationContext.getBean(HealthCheckBusinessLogic.class);
     }
@@ -2345,12 +2539,15 @@
     }
 
     @Override
-    public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId, String userId) {
+    public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(
+        String componentId, String userId) {
 
         validateUserExists(userId);
-        Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade.getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
+        Either<Component, StorageOperationStatus> getComponentRes = toscaOperationFacade
+            .getToscaElement(componentId, JsonParseFlagEnum.ParseAll);
         if (getComponentRes.isRight()) {
-            ResponseFormat responseFormat = componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(getComponentRes.right().value()));
+            ResponseFormat responseFormat = componentsUtils
+                .getResponseFormat(componentsUtils.convertFromStorageResponse(getComponentRes.right().value()));
             return Either.right(responseFormat);
         }
 
@@ -2365,36 +2562,49 @@
     }
 
     /**
-     * updates group instance with new property values in case of successful update of group instance related component instance will be updated with new modification time and related service will be updated with new last update date
-     *
+     * updates group instance with new property values in case of successful update of group instance related component
+     * instance will be updated with new modification time and related service will be updated with new last update
+     * date
      */
-    public Either<List<GroupInstanceProperty>, ResponseFormat> updateGroupInstancePropertyValues(User modifier, String serviceId, String componentInstanceId, String groupInstanceId, List<GroupInstanceProperty> newProperties) {
+    public Either<List<GroupInstanceProperty>, ResponseFormat> updateGroupInstancePropertyValues(User modifier,
+                                                                                                 String serviceId,
+                                                                                                 String componentInstanceId,
+                                                                                                 String groupInstanceId,
+                                                                                                 List<GroupInstanceProperty> newProperties) {
 
         Either<List<GroupInstanceProperty>, ResponseFormat> actionResult = null;
         Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponentRes;
         Component component = null;
         Either<Boolean, ResponseFormat> lockResult = null;
-        log.debug("Going to update group instance {} of service {} with new property values. ", groupInstanceId, serviceId);
+        log.debug("Going to update group instance {} of service {} with new property values. ", groupInstanceId,
+            serviceId);
         try {
             validateUserAndComponentRes = validateUserAndComponent(serviceId, modifier);
             if (validateUserAndComponentRes.isRight()) {
-                log.debug("Cannot update group instance {} of service {} with new property values. Validation failed.  ", groupInstanceId, serviceId);
+                log.debug(
+                    "Cannot update group instance {} of service {} with new property values. Validation failed.  ",
+                    groupInstanceId, serviceId);
                 actionResult = Either.right(validateUserAndComponentRes.right().value());
             }
             if (actionResult == null) {
                 component = validateUserAndComponentRes.left().value().getKey();
-                lockResult = lockComponentByName(component.getSystemName(), component, "Update Group Instance on Service");
+                lockResult = lockComponentByName(component.getSystemName(), component,
+                    "Update Group Instance on Service");
                 if (lockResult.isRight()) {
-                    log.debug(FAILED_TO_LOCK_SERVICE_RESPONSE_IS, component.getName(), lockResult.right().value().getFormattedMessage());
+                    log.debug(FAILED_TO_LOCK_SERVICE_RESPONSE_IS, component.getName(),
+                        lockResult.right().value().getFormattedMessage());
                     actionResult = Either.right(lockResult.right().value());
                 } else {
                     log.debug(THE_SERVICE_WITH_SYSTEM_NAME_LOCKED, component.getSystemName());
                 }
             }
             if (actionResult == null) {
-                actionResult = validateAndUpdateGroupInstancePropertyValuesAndContainingParents(component, componentInstanceId, groupInstanceId, newProperties);
+                actionResult = validateAndUpdateGroupInstancePropertyValuesAndContainingParents(component,
+                    componentInstanceId, groupInstanceId, newProperties);
                 if (actionResult.isRight()) {
-                    log.debug("Failed to validate and update group instance {} property values and containing parents. The message is {}. ", groupInstanceId, actionResult.right().value().getFormattedMessage());
+                    log.debug(
+                        "Failed to validate and update group instance {} property values and containing parents. The message is {}. ",
+                        groupInstanceId, actionResult.right().value().getFormattedMessage());
                 }
             }
         } catch (Exception e) {
@@ -2402,13 +2612,16 @@
             actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.GENERAL_ERROR));
         } finally {
             if (lockResult != null && lockResult.isLeft() && lockResult.left().value()) {
-                graphLockOperation.unlockComponentByName(component.getSystemName(), component.getUniqueId(), NodeTypeEnum.Service);
+                graphLockOperation
+                    .unlockComponentByName(component.getSystemName(), component.getUniqueId(), NodeTypeEnum.Service);
             }
         }
         return actionResult;
     }
 
-    private Either<List<GroupInstanceProperty>, ResponseFormat> validateAndUpdateGroupInstancePropertyValuesAndContainingParents(Component component, String componentInstanceId, String groupInstanceId, List<GroupInstanceProperty> newProperties) {
+    private Either<List<GroupInstanceProperty>, ResponseFormat> validateAndUpdateGroupInstancePropertyValuesAndContainingParents(
+        Component component, String componentInstanceId, String groupInstanceId,
+        List<GroupInstanceProperty> newProperties) {
 
         Either<List<GroupInstanceProperty>, ResponseFormat> actionResult = null;
         Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> findGroupInstanceRes;
@@ -2418,26 +2631,36 @@
         Either<GroupInstance, ResponseFormat> updateGroupInstanceResult = null;
         GroupInstance updatedGroupInstance = null;
         boolean inTransaction = true;
-        findGroupInstanceRes = findGroupInstanceOnRelatedComponentInstance(component, componentInstanceId, groupInstanceId);
+        findGroupInstanceRes = findGroupInstanceOnRelatedComponentInstance(component, componentInstanceId,
+            groupInstanceId);
         if (findGroupInstanceRes.isRight()) {
-            log.debug("#validateAndUpdateGroupInstancePropertyValuesAndContainingParents - Group instance {} not found. ", groupInstanceId);
+            log.debug(
+                "#validateAndUpdateGroupInstancePropertyValuesAndContainingParents - Group instance {} not found. ",
+                groupInstanceId);
             actionResult = Either.right(findGroupInstanceRes.right().value());
         }
         if (actionResult == null) {
             oldGroupInstance = findGroupInstanceRes.left().value().getValue();
             relatedComponentInstance = findGroupInstanceRes.left().value().getKey();
-            updateGroupInstanceResult = groupBusinessLogic.validateAndUpdateGroupInstancePropertyValues(component.getUniqueId(), componentInstanceId, oldGroupInstance, newProperties);
+            updateGroupInstanceResult = groupBusinessLogic
+                .validateAndUpdateGroupInstancePropertyValues(component.getUniqueId(), componentInstanceId,
+                    oldGroupInstance, newProperties);
             if (updateGroupInstanceResult.isRight()) {
-                log.debug("#validateAndUpdateGroupInstancePropertyValuesAndContainingParents - Failed to update group instance {} property values. ", oldGroupInstance.getName());
+                log.debug(
+                    "#validateAndUpdateGroupInstancePropertyValuesAndContainingParents - Failed to update group instance {} property values. ",
+                    oldGroupInstance.getName());
                 actionResult = Either.right(updateGroupInstanceResult.right().value());
             }
         }
         if (actionResult == null) {
             updatedGroupInstance = updateGroupInstanceResult.left().value();
             if (!oldGroupInstance.getModificationTime().equals(updatedGroupInstance.getModificationTime())) {
-                updateParentsModificationTimeRes = updateParentsModificationTimeAndCustomizationUuid(component, relatedComponentInstance, updatedGroupInstance, inTransaction);
+                updateParentsModificationTimeRes = updateParentsModificationTimeAndCustomizationUuid(component,
+                    relatedComponentInstance, updatedGroupInstance, inTransaction);
                 if (updateParentsModificationTimeRes.isRight()) {
-                    log.debug("#validateAndUpdateGroupInstancePropertyValuesAndContainingParents - Failed to update modification time for group instance {}. ", oldGroupInstance.getName());
+                    log.debug(
+                        "#validateAndUpdateGroupInstancePropertyValuesAndContainingParents - Failed to update modification time for group instance {}. ",
+                        oldGroupInstance.getName());
                     actionResult = Either.right(updateParentsModificationTimeRes.right().value());
                 }
             }
@@ -2448,36 +2671,47 @@
         return actionResult;
     }
 
-    private Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> updateParentsModificationTimeAndCustomizationUuid(Component component, ComponentInstance relatedComponentInstance, GroupInstance updatedGroupInstance,
-                                                                                                                                                  boolean inTranscation) {
+    private Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> updateParentsModificationTimeAndCustomizationUuid(
+        Component component, ComponentInstance relatedComponentInstance, GroupInstance updatedGroupInstance,
+        boolean inTranscation) {
 
         Either<ImmutablePair<ComponentMetadataData, ComponentInstanceData>, ResponseFormat> actionResult;
         Either<ComponentMetadataData, StorageOperationStatus> serviceMetadataUpdateResult;
-        Either<ComponentInstanceData, ResponseFormat> updateComponentInstanceRes = componentInstanceBusinessLogic.updateComponentInstanceModificationTimeAndCustomizationUuid(relatedComponentInstance, NodeTypeEnum.ResourceInstance,
+        Either<ComponentInstanceData, ResponseFormat> updateComponentInstanceRes = componentInstanceBusinessLogic
+            .updateComponentInstanceModificationTimeAndCustomizationUuid(relatedComponentInstance,
+                NodeTypeEnum.ResourceInstance,
                 updatedGroupInstance.getModificationTime(), inTranscation);
         if (updateComponentInstanceRes.isRight()) {
-            log.debug("Failed to update component instance {} after update of group instance {}. ", relatedComponentInstance.getName(), updatedGroupInstance.getName());
+            log.debug("Failed to update component instance {} after update of group instance {}. ",
+                relatedComponentInstance.getName(), updatedGroupInstance.getName());
             actionResult = Either.right(updateComponentInstanceRes.right().value());
         } else {
             serviceMetadataUpdateResult = toscaOperationFacade.updateComponentLastUpdateDateOnGraph(component);
             if (serviceMetadataUpdateResult.isRight()) {
-                log.debug("Failed to update service {} after update of component instance {} with new property values of group instance {}. ", component.getName(), relatedComponentInstance.getName(), updatedGroupInstance.getName());
-                actionResult = Either.right(componentsUtils.getResponseFormat(componentsUtils.convertFromStorageResponse(serviceMetadataUpdateResult.right().value())));
+                log.debug(
+                    "Failed to update service {} after update of component instance {} with new property values of group instance {}. ",
+                    component.getName(), relatedComponentInstance.getName(), updatedGroupInstance.getName());
+                actionResult = Either.right(componentsUtils.getResponseFormat(
+                    componentsUtils.convertFromStorageResponse(serviceMetadataUpdateResult.right().value())));
             } else {
-                actionResult = Either.left(new ImmutablePair<>(serviceMetadataUpdateResult.left().value(), updateComponentInstanceRes.left().value()));
+                actionResult = Either.left(new ImmutablePair<>(serviceMetadataUpdateResult.left().value(),
+                    updateComponentInstanceRes.left().value()));
             }
         }
         return actionResult;
     }
 
-    private Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponent(String serviceId, User modifier) {
+    private Either<ImmutablePair<Component, User>, ResponseFormat> validateUserAndComponent(String serviceId,
+                                                                                            User modifier) {
 
         Either<ImmutablePair<Component, User>, ResponseFormat> result = null;
         User currUser = null;
         Component component = null;
-        Either<User, ResponseFormat> validationUserResult = validateUserIgnoreAudit(modifier, "updateGroupInstancePropertyValues");
+        Either<User, ResponseFormat> validationUserResult = validateUserIgnoreAudit(modifier,
+            "updateGroupInstancePropertyValues");
         if (validationUserResult.isRight()) {
-            log.debug("#validateUserAndComponent - Failed to validate user with userId {}, for update service {}. ", modifier.getUserId(), serviceId);
+            log.debug("#validateUserAndComponent - Failed to validate user with userId {}, for update service {}. ",
+                modifier.getUserId(), serviceId);
             result = Either.right(validationUserResult.right().value());
         }
         if (result == null) {
@@ -2485,7 +2719,8 @@
             try {
                 component = validateComponentExists(serviceId, ComponentTypeEnum.SERVICE, null);
                 if (!ComponentValidationUtils.canWorkOnComponent(component, currUser.getUserId())) {
-                    log.info("#validateUserAndComponent - Restricted operation for user: {}, on service: {}", currUser.getUserId(), component.getCreatorUserId());
+                    log.info("#validateUserAndComponent - Restricted operation for user: {}, on service: {}",
+                        currUser.getUserId(), component.getCreatorUserId());
                     return Either.right(componentsUtils.getResponseFormat(ActionStatus.RESTRICTED_OPERATION));
                 }
             } catch (ComponentException e) {
@@ -2500,20 +2735,26 @@
         return result;
     }
 
-    private Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> findGroupInstanceOnRelatedComponentInstance(Component component, String componentInstanceId, String groupInstanceId) {
+    private Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> findGroupInstanceOnRelatedComponentInstance(
+        Component component, String componentInstanceId, String groupInstanceId) {
 
         Either<ImmutablePair<ComponentInstance, GroupInstance>, ResponseFormat> actionResult = null;
         GroupInstance groupInstance = null;
         ComponentInstance foundComponentInstance = findRelatedComponentInstance(component, componentInstanceId);
         if (foundComponentInstance == null) {
             log.debug("Component instance {} not found on service {}. ", componentInstanceId, component.getName());
-            actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstanceId, "resource instance", "service", component.getName()));
-        }
-        else if (isNotEmpty(foundComponentInstance.getGroupInstances())) {
-            groupInstance = foundComponentInstance.getGroupInstances().stream().filter(gi -> gi.getUniqueId().equals(groupInstanceId)).findFirst().orElse(null);
+            actionResult = Either.right(componentsUtils
+                .getResponseFormat(ActionStatus.COMPONENT_INSTANCE_NOT_FOUND_ON_CONTAINER, componentInstanceId,
+                    "resource instance", "service", component.getName()));
+        } else if (isNotEmpty(foundComponentInstance.getGroupInstances())) {
+            groupInstance = foundComponentInstance.getGroupInstances().stream()
+                .filter(gi -> gi.getUniqueId().equals(groupInstanceId)).findFirst().orElse(null);
             if (groupInstance == null) {
-                log.debug("Group instance {} not found on component instance {}. ", groupInstanceId, foundComponentInstance.getName());
-                actionResult = Either.right(componentsUtils.getResponseFormat(ActionStatus.GROUP_INSTANCE_NOT_FOUND_ON_COMPONENT_INSTANCE, groupInstanceId, foundComponentInstance.getName()));
+                log.debug("Group instance {} not found on component instance {}. ", groupInstanceId,
+                    foundComponentInstance.getName());
+                actionResult = Either.right(componentsUtils
+                    .getResponseFormat(ActionStatus.GROUP_INSTANCE_NOT_FOUND_ON_COMPONENT_INSTANCE, groupInstanceId,
+                        foundComponentInstance.getName()));
             }
         }
         if (actionResult == null) {
@@ -2525,7 +2766,8 @@
     private ComponentInstance findRelatedComponentInstance(Component component, String componentInstanceId) {
         ComponentInstance componentInstance = null;
         if (isNotEmpty(component.getComponentInstances())) {
-            componentInstance = component.getComponentInstances().stream().filter(ci -> ci.getUniqueId().equals(componentInstanceId)).findFirst().orElse(null);
+            componentInstance = component.getComponentInstances().stream()
+                .filter(ci -> ci.getUniqueId().equals(componentInstanceId)).findFirst().orElse(null);
         }
         return componentInstance;
     }
@@ -2539,29 +2781,39 @@
         return Either.left(user);
     }
 
-    public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String serviceId, List<String> dataParamsToReturn) {
+    public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String serviceId,
+                                                                                                   List<String> dataParamsToReturn) {
 
         ComponentParametersView paramsToReturn = new ComponentParametersView(dataParamsToReturn);
         paramsToReturn.setIgnoreComponentInstancesProperties(false);
-        Either<Service, StorageOperationStatus> serviceResultEither = toscaOperationFacade.getToscaElement(serviceId, paramsToReturn);
+        Either<Service, StorageOperationStatus> serviceResultEither = toscaOperationFacade
+            .getToscaElement(serviceId, paramsToReturn);
 
         if (serviceResultEither.isRight()) {
-            if(serviceResultEither.right().value() == StorageOperationStatus.NOT_FOUND) {
+            if (serviceResultEither.right().value() == StorageOperationStatus.NOT_FOUND) {
                 log.debug("#getUiComponentDataTransferByComponentId - Failed to find service with id {} ", serviceId);
                 return Either.right(componentsUtils.getResponseFormat(ActionStatus.SERVICE_NOT_FOUND, serviceId));
             }
 
-            log.debug("#getUiComponentDataTransferByComponentId - failed to get service by id {} with filters {}", serviceId, dataParamsToReturn);
-            return Either.right(componentsUtils.getResponseFormatByResource(componentsUtils.convertFromStorageResponse(serviceResultEither.right().value()), ""));
+            log.debug("#getUiComponentDataTransferByComponentId - failed to get service by id {} with filters {}",
+                serviceId, dataParamsToReturn);
+            return Either.right(componentsUtils.getResponseFormatByResource(
+                componentsUtils.convertFromStorageResponse(serviceResultEither.right().value()), ""));
         }
 
         Service service = serviceResultEither.left().value();
-		if (dataParamsToReturn.contains(ComponentFieldsEnum.INPUTS.getValue())) {
-			ListUtils.emptyIfNull(service.getInputs())
-					.forEach(input -> input.setConstraints(setInputConstraint(input)));
-		}
+        if (dataParamsToReturn.contains(ComponentFieldsEnum.INPUTS.getValue())) {
+            ListUtils.emptyIfNull(service.getInputs())
+                .forEach(input -> input.setConstraints(setInputConstraint(input)));
+        }
 
-        UiComponentDataTransfer dataTransfer = uiComponentDataConverter.getUiDataTransferFromServiceByParams(service, dataParamsToReturn);
+        if (dataParamsToReturn.contains(ComponentFieldsEnum.OUTPUTS.getValue())) {
+            ListUtils.emptyIfNull(service.getOutputs())
+                .forEach(output -> output.setConstraints(setOutputConstraint(output)));
+        }
+
+        UiComponentDataTransfer dataTransfer = uiComponentDataConverter
+            .getUiDataTransferFromServiceByParams(service, dataParamsToReturn);
         return Either.left(dataTransfer);
     }
 
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/input/ComponentInputsMergeBL.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/input/ComponentInputsMergeBL.java
index 0e88c8f..aec3ede 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/input/ComponentInputsMergeBL.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/merge/input/ComponentInputsMergeBL.java
@@ -20,6 +20,14 @@
 
 package org.openecomp.sdc.be.components.merge.input;
 
+import static java.util.stream.Collectors.toMap;
+import static org.openecomp.sdc.be.components.merge.resource.ResourceDataMergeBusinessLogic.PENULTIMATE_COMMAND;
+import static org.openecomp.sdc.be.utils.PropertyDefinitionUtils.convertListOfProperties;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.stream.Stream;
 import org.openecomp.sdc.be.components.merge.VspComponentsMergeCommand;
 import org.openecomp.sdc.be.dao.api.ActionStatus;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
@@ -29,15 +37,6 @@
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.springframework.core.annotation.Order;
 
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.stream.Stream;
-
-import static java.util.stream.Collectors.toMap;
-import static org.openecomp.sdc.be.components.merge.resource.ResourceDataMergeBusinessLogic.PENULTIMATE_COMMAND;
-import static org.openecomp.sdc.be.utils.PropertyDefinitionUtils.convertListOfProperties;
-
 @org.springframework.stereotype.Component
 @Order(PENULTIMATE_COMMAND)//must run after all properties values were merged but before component instance relations merge
 public class ComponentInputsMergeBL extends InputsMergeCommand implements VspComponentsMergeCommand {
@@ -65,6 +64,7 @@
     Map<String, List<PropertyDataDefinition>> getProperties(Component component) {
         return Stream.of(component.safeGetComponentInstancesProperties(),
                          component.safeGetComponentInstancesInputs(),
+                         component.safeGetComponentInstancesOutputs(),
                          component.safeGetGroupsProperties(),
                          component.safeGetPolicyProperties())
                 .flatMap(map -> map.entrySet().stream())
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclarator.java
index c7d9cfb..2bdc5bf 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclarator.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,7 +20,15 @@
 
 package org.openecomp.sdc.be.components.property;
 
+import static org.apache.commons.collections.CollectionUtils.isEmpty;
+import static org.openecomp.sdc.be.model.utils.ComponentUtilities.getInputAnnotations;
+
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.utils.ExceptionUtils;
 import org.openecomp.sdc.be.datatypes.elements.Annotation;
@@ -32,29 +40,26 @@
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
 import org.openecomp.sdc.be.model.ComponentParametersView;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
-import static org.apache.commons.collections.CollectionUtils.isEmpty;
-import static org.openecomp.sdc.be.model.utils.ComponentUtilities.getInputAnnotations;
-
 @org.springframework.stereotype.Component
-public class ComponentInstanceInputPropertyDeclarator extends DefaultPropertyDeclarator<ComponentInstance, ComponentInstanceInput> {
+public class ComponentInstanceInputPropertyDeclarator extends
+    DefaultPropertyDeclarator<ComponentInstance, ComponentInstanceInput> {
 
     private static final Logger log = Logger.getLogger(ComponentInstanceInputPropertyDeclarator.class);
     private final ToscaOperationFacade toscaOperationFacade;
     private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
     private final ExceptionUtils exceptionUtils;
 
-    public ComponentInstanceInputPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation, ToscaOperationFacade toscaOperationFacade, ComponentInstanceBusinessLogic componentInstanceBusinessLogic, ExceptionUtils exceptionUtils) {
+    public ComponentInstanceInputPropertyDeclarator(ComponentsUtils componentsUtils,
+                                                    PropertyOperation propertyOperation,
+                                                    ToscaOperationFacade toscaOperationFacade,
+                                                    ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
+                                                    ExceptionUtils exceptionUtils) {
         super(componentsUtils, propertyOperation);
         this.toscaOperationFacade = toscaOperationFacade;
         this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
@@ -67,22 +72,25 @@
     }
 
     @Override
-    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String cmptInstanceId, List<ComponentInstanceInput> properties) {
-        log.debug("#updatePropertiesValues - updating component instance inputs for instance {} on component {}", cmptInstanceId, component.getUniqueId());
+    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String cmptInstanceId,
+                                                                    List<ComponentInstanceInput> properties) {
+        log.debug("#updatePropertiesValues - updating component instance inputs for instance {} on component {}",
+            cmptInstanceId, component.getUniqueId());
         Map<String, List<ComponentInstanceInput>> instProperties = Collections.singletonMap(cmptInstanceId, properties);
         return toscaOperationFacade.addComponentInstanceInputsToComponent(component, instProperties);
     }
 
     @Override
     public Optional<ComponentInstance> resolvePropertiesOwner(Component component, String propertiesOwnerId) {
-        log.debug("#resolvePropertiesOwner - fetching component instance {} of component {}", propertiesOwnerId, component.getUniqueId());
+        log.debug("#resolvePropertiesOwner - fetching component instance {} of component {}", propertiesOwnerId,
+            component.getUniqueId());
         return component.getComponentInstanceById(propertiesOwnerId);
     }
 
     @Override
     public void addPropertiesListToInput(ComponentInstanceInput declaredProp, InputDefinition input) {
         List<ComponentInstanceInput> inputsValueList = input.getInputs();
-        if(inputsValueList == null) {
+        if (inputsValueList == null) {
             inputsValueList = new ArrayList<>(); // adding the property with the new value for UI
         }
         inputsValueList.add(declaredProp);
@@ -91,43 +99,54 @@
 
     @Override
     public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition input) {
-        List<ComponentInstanceInput> componentInstanceInputsByInputId = componentInstanceBusinessLogic.getComponentInstanceInputsByInputId(component, input.getUniqueId());
+        List<ComponentInstanceInput> componentInstanceInputsByInputId = componentInstanceBusinessLogic
+            .getComponentInstanceInputsByInputId(component, input.getUniqueId());
         if (isEmpty(componentInstanceInputsByInputId)) {
             return StorageOperationStatus.OK;
         }
-        componentInstanceInputsByInputId.forEach(cmptInstanceInput -> prepareValueBeforeDelete(input, cmptInstanceInput, cmptInstanceInput.getPath()));
-        return toscaOperationFacade.updateComponentInstanceInputs(component, componentInstanceInputsByInputId.get(0).getComponentInstanceId(), componentInstanceInputsByInputId);
+        componentInstanceInputsByInputId.forEach(
+            cmptInstanceInput -> prepareValueBeforeDelete(input, cmptInstanceInput, cmptInstanceInput.getPath()));
+        return toscaOperationFacade
+            .updateComponentInstanceInputs(component, componentInstanceInputsByInputId.get(0).getComponentInstanceId(),
+                componentInstanceInputsByInputId);
     }
 
     @Override
     public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition input) {
-        List<ComponentInstanceInput> componentInstanceInputsByInputId = componentInstanceBusinessLogic.getComponentInstanceInputsByInputId(component, input.getUniqueId());
+        List<ComponentInstanceInput> componentInstanceInputsByInputId = componentInstanceBusinessLogic
+            .getComponentInstanceInputsByInputId(component, input.getUniqueId());
         if (isEmpty(componentInstanceInputsByInputId)) {
             return StorageOperationStatus.OK;
         }
-        componentInstanceInputsByInputId.forEach(cmptInstanceInput -> prepareValueBeforeDelete(input, cmptInstanceInput, cmptInstanceInput.getPath()));
-        return toscaOperationFacade.updateComponentInstanceInputs(component, componentInstanceInputsByInputId.get(0).getComponentInstanceId(), componentInstanceInputsByInputId);
+        componentInstanceInputsByInputId.forEach(
+            cmptInstanceInput -> prepareValueBeforeDelete(input, cmptInstanceInput, cmptInstanceInput.getPath()));
+        return toscaOperationFacade
+            .updateComponentInstanceInputs(component, componentInstanceInputsByInputId.get(0).getComponentInstanceId(),
+                componentInstanceInputsByInputId);
     }
 
     @Override
-    InputDefinition createInputFromProperty(String componentId, ComponentInstance propertiesOwner, String inputName, ComponentInstancePropInput propInput, PropertyDataDefinition prop) {
-        InputDefinition inputFromProperty = super.createInputFromProperty(componentId, propertiesOwner, inputName, propInput, prop);
+    InputDefinition createInputFromProperty(String componentId, ComponentInstance propertiesOwner, String inputName,
+                                            ComponentInstancePropInput propInput, PropertyDataDefinition prop) {
+        InputDefinition inputFromProperty = super
+            .createInputFromProperty(componentId, propertiesOwner, inputName, propInput, prop);
         Component propertiesOwnerNodeType = getInstanceOriginType(propertiesOwner);
         enrichInputWithAnnotations(prop, inputFromProperty, propertiesOwnerNodeType);
         return inputFromProperty;
     }
 
-    private void enrichInputWithAnnotations(PropertyDataDefinition prop, InputDefinition inputFromProperty, Component propertiesOwnerNodeType) {
+    private void enrichInputWithAnnotations(PropertyDataDefinition prop, InputDefinition inputFromProperty,
+                                            Component propertiesOwnerNodeType) {
         List<Annotation> inputAnnotations = getInputAnnotations(propertiesOwnerNodeType, prop.getName());
-        if(!isEmpty(inputAnnotations)){
+        if (!isEmpty(inputAnnotations)) {
             inputFromProperty.setAnnotations(inputAnnotations);
         }
     }
 
     private Component getInstanceOriginType(ComponentInstance propertiesOwner) {
         return toscaOperationFacade.getToscaElement(propertiesOwner.getActualComponentUid(), getFilterComponentInputs())
-                    .left()
-                    .on(err -> exceptionUtils.rollBackAndThrow(err, propertiesOwner.getActualComponentUid()));
+            .left()
+            .on(err -> exceptionUtils.rollBackAndThrow(err, propertiesOwner.getActualComponentUid()));
     }
 
     private ComponentParametersView getFilterComponentInputs() {
@@ -135,4 +154,11 @@
         filterInputs.setIgnoreInputs(false);
         return filterInputs;
     }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstanceOutputPropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstanceOutputPropertyDeclarator.java
new file mode 100644
index 0000000..5745f39
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstanceOutputPropertyDeclarator.java
@@ -0,0 +1,167 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.property;
+
+import static org.apache.commons.collections.CollectionUtils.isEmpty;
+import static org.openecomp.sdc.be.model.utils.ComponentUtilities.getOutputAnnotations;
+
+import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
+import org.openecomp.sdc.be.components.impl.utils.ExceptionUtils;
+import org.openecomp.sdc.be.datatypes.elements.Annotation;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.ComponentInstanceOutput;
+import org.openecomp.sdc.be.model.ComponentInstancePropOutput;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+
+@org.springframework.stereotype.Component
+public class ComponentInstanceOutputPropertyDeclarator extends
+    DefaultPropertyDeclarator<ComponentInstance, ComponentInstanceOutput> {
+
+    private static final Logger log = Logger.getLogger(ComponentInstanceOutputPropertyDeclarator.class);
+    private final ToscaOperationFacade toscaOperationFacade;
+    private final ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
+    private final ExceptionUtils exceptionUtils;
+
+    public ComponentInstanceOutputPropertyDeclarator(final ComponentsUtils componentsUtils,
+                                                     final PropertyOperation propertyOperation,
+                                                     final ToscaOperationFacade toscaOperationFacade,
+                                                     final ComponentInstanceBusinessLogic componentInstanceBusinessLogic,
+                                                     final ExceptionUtils exceptionUtils) {
+        super(componentsUtils, propertyOperation);
+        this.toscaOperationFacade = toscaOperationFacade;
+        this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
+        this.exceptionUtils = exceptionUtils;
+    }
+
+    @Override
+    public ComponentInstanceOutput createDeclaredProperty(final PropertyDataDefinition propertyDataDefinition) {
+        return new ComponentInstanceOutput(propertyDataDefinition);
+    }
+
+    @Override
+    public Either<?, StorageOperationStatus> updatePropertiesValues(final Component component,
+                                                                    final String componentInstanceId,
+                                                                    final List<ComponentInstanceOutput> properties) {
+        log.debug("#updatePropertiesValues - updating component instance outputs for instance {} on component {}",
+            componentInstanceId, component.getUniqueId());
+        final Map<String, List<ComponentInstanceOutput>> instProperties = Collections
+            .singletonMap(componentInstanceId, properties);
+        return toscaOperationFacade.addComponentInstanceOutputsToComponent(component, instProperties);
+    }
+
+    @Override
+    public Optional<ComponentInstance> resolvePropertiesOwner(final Component component,
+                                                              final String propertiesOwnerId) {
+        log.debug("#resolvePropertiesOwner - fetching component instance {} of component {}", propertiesOwnerId,
+            component.getUniqueId());
+        return component.getComponentInstanceById(propertiesOwnerId);
+    }
+
+    @Override
+    OutputDefinition createOutputFromProperty(final String componentId, final ComponentInstance propertiesOwner,
+                                              final String generateOutputName, final List<String> outputName,
+                                              final ComponentInstancePropOutput componentInstancePropOutput,
+                                              final PropertyDataDefinition propertyDataDefinition) {
+        final OutputDefinition outputFromProperty = super
+            .createOutputFromProperty(componentId, propertiesOwner, generateOutputName, outputName,
+                componentInstancePropOutput, propertyDataDefinition);
+        final Component propertiesOwnerNodeType = getInstanceOriginType(propertiesOwner);
+        enrichOutputWithAnnotations(propertyDataDefinition, outputFromProperty, propertiesOwnerNodeType);
+        return outputFromProperty;
+    }
+
+    private void enrichOutputWithAnnotations(final PropertyDataDefinition propertyDataDefinition,
+                                             final OutputDefinition outputDefinition,
+                                             final Component component) {
+        final List<Annotation> outputAnnotations =
+            getOutputAnnotations(component, propertyDataDefinition.getName());
+        if (!isEmpty(outputAnnotations)) {
+            outputDefinition.setAnnotations(outputAnnotations);
+        }
+    }
+
+    private Component getInstanceOriginType(final ComponentInstance componentInstance) {
+        return toscaOperationFacade
+            .getToscaElement(componentInstance.getActualComponentUid(), getFilterComponentOutputs())
+            .left()
+            .on(err -> exceptionUtils.rollBackAndThrow(err, componentInstance.getActualComponentUid()));
+    }
+
+    private ComponentParametersView getFilterComponentOutputs() {
+        final ComponentParametersView filterOutputs = new ComponentParametersView(true);
+        filterOutputs.setIgnoreOutputs(false);
+        return filterOutputs;
+    }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        return unDeclareOutputProperty(component, outputDefinition);
+    }
+
+    private StorageOperationStatus unDeclareOutputProperty(final Component component,
+                                                           final OutputDefinition outputDefinition) {
+        final List<ComponentInstanceOutput> componentInstanceOutputs = componentInstanceBusinessLogic
+            .getComponentInstanceOutputsByOutputId(component, outputDefinition.getUniqueId());
+        if (isEmpty(componentInstanceOutputs)) {
+            return StorageOperationStatus.OK;
+        }
+        componentInstanceOutputs.forEach(
+            componentInstanceOutput -> prepareOutputValueBeforeDelete(outputDefinition, componentInstanceOutput,
+                componentInstanceOutput.getPath()));
+        return toscaOperationFacade.updateComponentInstanceOutputs(component,
+            componentInstanceOutputs.get(0).getComponentInstanceId(), componentInstanceOutputs);
+    }
+
+
+    @Override
+    protected void addPropertiesListToInput(final ComponentInstanceOutput componentInstanceOutput,
+                                            final InputDefinition input) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsInputs(final Component component,
+                                                              final InputDefinition inputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsListInputs(final Component component,
+                                                                  final InputDefinition inputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclarator.java
index 1d8a23e..662c222 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclarator.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,6 +21,11 @@
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import org.apache.commons.collections.CollectionUtils;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.utils.PropertiesUtils;
@@ -31,25 +36,23 @@
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
 @org.springframework.stereotype.Component
-public class ComponentInstancePropertyDeclarator extends DefaultPropertyDeclarator<ComponentInstance, ComponentInstanceProperty> {
+public class ComponentInstancePropertyDeclarator extends
+    DefaultPropertyDeclarator<ComponentInstance, ComponentInstanceProperty> {
 
     private static final Logger log = Logger.getLogger(ComponentInstancePropertyDeclarator.class);
     private ToscaOperationFacade toscaOperationFacade;
     private ComponentInstanceBusinessLogic componentInstanceBusinessLogic;
 
-    public ComponentInstancePropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation, ToscaOperationFacade toscaOperationFacade, ComponentInstanceBusinessLogic componentInstanceBusinessLogic) {
+    public ComponentInstancePropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation,
+                                               ToscaOperationFacade toscaOperationFacade,
+                                               ComponentInstanceBusinessLogic componentInstanceBusinessLogic) {
         super(componentsUtils, propertyOperation);
         this.toscaOperationFacade = toscaOperationFacade;
         this.componentInstanceBusinessLogic = componentInstanceBusinessLogic;
@@ -61,22 +64,26 @@
     }
 
     @Override
-    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String cmptInstanceId, List<ComponentInstanceProperty> properties) {
-        log.debug("#updatePropertiesValues - updating component instance properties for instance {} on component {}", cmptInstanceId, component.getUniqueId());
-        Map<String, List<ComponentInstanceProperty>> instProperties = Collections.singletonMap(cmptInstanceId, properties);
+    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String cmptInstanceId,
+                                                                    List<ComponentInstanceProperty> properties) {
+        log.debug("#updatePropertiesValues - updating component instance properties for instance {} on component {}",
+            cmptInstanceId, component.getUniqueId());
+        Map<String, List<ComponentInstanceProperty>> instProperties = Collections
+            .singletonMap(cmptInstanceId, properties);
         return toscaOperationFacade.addComponentInstancePropertiesToComponent(component, instProperties);
     }
 
     @Override
     public Optional<ComponentInstance> resolvePropertiesOwner(Component component, String propertiesOwnerId) {
-        log.debug("#resolvePropertiesOwner - fetching component instance {} of component {}", propertiesOwnerId, component.getUniqueId());
+        log.debug("#resolvePropertiesOwner - fetching component instance {} of component {}", propertiesOwnerId,
+            component.getUniqueId());
         return component.getComponentInstanceById(propertiesOwnerId);
     }
 
     @Override
     public void addPropertiesListToInput(ComponentInstanceProperty declaredProp, InputDefinition input) {
         List<ComponentInstanceProperty> propertiesList = input.getProperties();
-        if(propertiesList == null) {
+        if (propertiesList == null) {
             propertiesList = new ArrayList<>(); // adding the property with the new value for UI
         }
         propertiesList.add(declaredProp);
@@ -87,42 +94,55 @@
     public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition input) {
 
         Optional<ComponentInstanceProperty> propertyByInputId = PropertiesUtils.getPropertyByInputId(component,
-                input.getUniqueId());
-        if(propertyByInputId.isPresent()) {
+            input.getUniqueId());
+        if (propertyByInputId.isPresent()) {
             List<ComponentInstanceProperty> capabilityPropertyDeclaredAsInput =
-                   PropertiesUtils.getCapabilityProperty(propertyByInputId.get(), input.getUniqueId());
+                PropertiesUtils.getCapabilityProperty(propertyByInputId.get(), input.getUniqueId());
             capabilityPropertyDeclaredAsInput.forEach(cmptInstanceProperty -> prepareValueBeforeDeleteOfCapProp(input,
-                    cmptInstanceProperty));
+                cmptInstanceProperty));
 
-            Optional<CapabilityDefinition> propertyCapabilityOptional = PropertiesUtils.getPropertyCapabilityOfChildInstance(
+            Optional<CapabilityDefinition> propertyCapabilityOptional = PropertiesUtils
+                .getPropertyCapabilityOfChildInstance(
                     capabilityPropertyDeclaredAsInput.get(0).getParentUniqueId(), component.getCapabilities());
-            if(!propertyCapabilityOptional.isPresent()) {
+            if (!propertyCapabilityOptional.isPresent()) {
                 return StorageOperationStatus.OK;
             }
 
             return toscaOperationFacade.updateInstanceCapabilityProperty(component, input.getInstanceUniqueId(),
-                    capabilityPropertyDeclaredAsInput.get(0), propertyCapabilityOptional.get() );
+                capabilityPropertyDeclaredAsInput.get(0), propertyCapabilityOptional.get());
         } else {
             List<ComponentInstanceProperty> componentInstancePropertiesDeclaredAsInput = componentInstanceBusinessLogic
-                    .getComponentInstancePropertiesByInputId(component, input.getUniqueId());
+                .getComponentInstancePropertiesByInputId(component, input.getUniqueId());
             if (CollectionUtils.isEmpty(componentInstancePropertiesDeclaredAsInput)) {
                 return StorageOperationStatus.OK;
             }
             componentInstancePropertiesDeclaredAsInput.forEach(cmptInstanceProperty -> prepareValueBeforeDelete(input,
-                    cmptInstanceProperty, cmptInstanceProperty.getPath()));
+                cmptInstanceProperty, cmptInstanceProperty.getPath()));
             return toscaOperationFacade.updateComponentInstanceProperties(component,
-                    componentInstancePropertiesDeclaredAsInput.get(0).getComponentInstanceId(),
-                    componentInstancePropertiesDeclaredAsInput);
+                componentInstancePropertiesDeclaredAsInput.get(0).getComponentInstanceId(),
+                componentInstancePropertiesDeclaredAsInput);
         }
     }
 
     @Override
     public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition input) {
-        List<ComponentInstanceProperty> componentInstancePropertiesDeclaredAsInput = componentInstanceBusinessLogic.getComponentInstancePropertiesByInputId(component, input.getUniqueId());
+        List<ComponentInstanceProperty> componentInstancePropertiesDeclaredAsInput = componentInstanceBusinessLogic
+            .getComponentInstancePropertiesByInputId(component, input.getUniqueId());
         if (CollectionUtils.isEmpty(componentInstancePropertiesDeclaredAsInput)) {
             return StorageOperationStatus.OK;
         }
-        componentInstancePropertiesDeclaredAsInput.forEach(cmptInstanceProperty -> prepareValueBeforeDelete(input, cmptInstanceProperty, cmptInstanceProperty.getPath()));
-        return toscaOperationFacade.updateComponentInstanceProperties(component, componentInstancePropertiesDeclaredAsInput.get(0).getComponentInstanceId(), componentInstancePropertiesDeclaredAsInput);
+        componentInstancePropertiesDeclaredAsInput.forEach(
+            cmptInstanceProperty -> prepareValueBeforeDelete(input, cmptInstanceProperty,
+                cmptInstanceProperty.getPath()));
+        return toscaOperationFacade.updateComponentInstanceProperties(component,
+            componentInstancePropertiesDeclaredAsInput.get(0).getComponentInstanceId(),
+            componentInstancePropertiesDeclaredAsInput);
     }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclarator.java
index 14479d4..0dce2cd 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclarator.java
@@ -17,6 +17,10 @@
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
 import org.apache.commons.collections.CollectionUtils;
 import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
@@ -25,188 +29,190 @@
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
 @org.springframework.stereotype.Component
 public class ComponentPropertyDeclarator extends DefaultPropertyDeclarator<Component, PropertyDataDefinition> {
 
-  private ToscaOperationFacade toscaOperationFacade;
-  PropertyBusinessLogic propertyBL;
+    private ToscaOperationFacade toscaOperationFacade;
+    PropertyBusinessLogic propertyBL;
 
 
-  public ComponentPropertyDeclarator(ComponentsUtils componentsUtils,
-                                     PropertyOperation propertyOperation,
-                                     ToscaOperationFacade toscaOperationFacade,
-                                     PropertyBusinessLogic propertyBL) {
-    super(componentsUtils, propertyOperation);
-    this.toscaOperationFacade = toscaOperationFacade;
-    this.propertyBL = propertyBL;
-  }
+    public ComponentPropertyDeclarator(ComponentsUtils componentsUtils,
+                                       PropertyOperation propertyOperation,
+                                       ToscaOperationFacade toscaOperationFacade,
+                                       PropertyBusinessLogic propertyBL) {
+        super(componentsUtils, propertyOperation);
+        this.toscaOperationFacade = toscaOperationFacade;
+        this.propertyBL = propertyBL;
+    }
 
-  @Override
-  public PropertyDataDefinition createDeclaredProperty(PropertyDataDefinition prop) {
-    return new PropertyDataDefinition(prop);
-  }
+    @Override
+    public PropertyDataDefinition createDeclaredProperty(PropertyDataDefinition prop) {
+        return new PropertyDataDefinition(prop);
+    }
 
-  @Override
-  public Either<?, StorageOperationStatus> updatePropertiesValues(Component component,
-                                                           String propertiesOwnerId,
-                                                           List<PropertyDataDefinition> properties) {
-    if(CollectionUtils.isNotEmpty(properties)) {
-      for(PropertyDataDefinition property : properties) {
-        Either<PropertyDefinition, StorageOperationStatus>
-            storageStatus = toscaOperationFacade
-            .updatePropertyOfComponent(component, new PropertyDefinition(property));
-        if(storageStatus.isRight()) {
-          return Either.right(storageStatus.right().value());
+    @Override
+    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component,
+                                                                    String propertiesOwnerId,
+                                                                    List<PropertyDataDefinition> properties) {
+        if (CollectionUtils.isNotEmpty(properties)) {
+            for (PropertyDataDefinition property : properties) {
+                Either<PropertyDefinition, StorageOperationStatus>
+                    storageStatus = toscaOperationFacade
+                    .updatePropertyOfComponent(component, new PropertyDefinition(property));
+                if (storageStatus.isRight()) {
+                    return Either.right(storageStatus.right().value());
+                }
+            }
         }
-      }
-    }
-    return Either.left(properties);
-  }
-
-  @Override
-  public Optional<Component> resolvePropertiesOwner(Component component, String propertiesOwnerId) {
-    return Optional.of(component);
-  }
-
-  @Override
-  public void addPropertiesListToInput(PropertyDataDefinition declaredProp,
-                                InputDefinition input) {
-
-    List<ComponentInstanceProperty> propertiesList = input.getProperties();
-    if(propertiesList == null) {
-      propertiesList = new ArrayList<>(); // adding the property with the new value for UI
-    }
-    propertiesList.add(new ComponentInstanceProperty(declaredProp));
-    input.setProperties(propertiesList);
-  }
-
-  @Override
-  public StorageOperationStatus unDeclarePropertiesAsInputs(Component component,
-                                                            InputDefinition input) {
-    PropertyDefinition propertyDefinition = new PropertyDefinition(input);
-
-    if(propertyBL.isPropertyUsedByOperation(component, propertyDefinition)) {
-      return StorageOperationStatus.DECLARED_INPUT_USED_BY_OPERATION;
+        return Either.left(properties);
     }
 
-    Optional<PropertyDefinition> propertyToUpdateCandidate =
-        getDeclaredPropertyByInputId(component, input.getUniqueId());
-
-    if(propertyToUpdateCandidate.isPresent()) {
-      PropertyDefinition propertyToUpdate = propertyToUpdateCandidate.get();
-      return unDeclareInput(component, input, propertyToUpdate);
+    @Override
+    public Optional<Component> resolvePropertiesOwner(Component component, String propertiesOwnerId) {
+        return Optional.of(component);
     }
 
+    @Override
+    public void addPropertiesListToInput(PropertyDataDefinition declaredProp,
+                                         InputDefinition input) {
 
-    return StorageOperationStatus.OK;
-  }
-
-  @Override
-  public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component,
-                                                            InputDefinition input) {
-    PropertyDefinition propertyDefinition = new PropertyDefinition(input);
-
-    if(propertyBL.isPropertyUsedByOperation(component, propertyDefinition)) {
-      return StorageOperationStatus.DECLARED_INPUT_USED_BY_OPERATION;
+        List<ComponentInstanceProperty> propertiesList = input.getProperties();
+        if (propertiesList == null) {
+            propertiesList = new ArrayList<>(); // adding the property with the new value for UI
+        }
+        propertiesList.add(new ComponentInstanceProperty(declaredProp));
+        input.setProperties(propertiesList);
     }
 
-    Optional<List <PropertyDefinition>> propertyToUpdateCandidate =
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsInputs(Component component,
+                                                              InputDefinition input) {
+        PropertyDefinition propertyDefinition = new PropertyDefinition(input);
+
+        if (propertyBL.isPropertyUsedByOperation(component, propertyDefinition)) {
+            return StorageOperationStatus.DECLARED_INPUT_USED_BY_OPERATION;
+        }
+
+        Optional<PropertyDefinition> propertyToUpdateCandidate =
+            getDeclaredPropertyByInputId(component, input.getUniqueId());
+
+        if (propertyToUpdateCandidate.isPresent()) {
+            PropertyDefinition propertyToUpdate = propertyToUpdateCandidate.get();
+            return unDeclareInput(component, input, propertyToUpdate);
+        }
+
+        return StorageOperationStatus.OK;
+    }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component,
+                                                                  InputDefinition input) {
+        PropertyDefinition propertyDefinition = new PropertyDefinition(input);
+
+        if (propertyBL.isPropertyUsedByOperation(component, propertyDefinition)) {
+            return StorageOperationStatus.DECLARED_INPUT_USED_BY_OPERATION;
+        }
+
+        Optional<List<PropertyDefinition>> propertyToUpdateCandidate =
             getDeclaredPropertiesByInputId(component, input.getUniqueId());
 
-    if(propertyToUpdateCandidate.isPresent()) {
-      List<PropertyDefinition> propertiesToUpdate = propertyToUpdateCandidate.get();
-      if (!propertiesToUpdate.isEmpty()) {
-        return unDeclareInputs(component, input, propertiesToUpdate);
-      }
+        if (propertyToUpdateCandidate.isPresent()) {
+            List<PropertyDefinition> propertiesToUpdate = propertyToUpdateCandidate.get();
+            if (!propertiesToUpdate.isEmpty()) {
+                return unDeclareInputs(component, input, propertiesToUpdate);
+            }
+        }
+
+        return StorageOperationStatus.OK;
     }
 
-    return StorageOperationStatus.OK;
-  }
-
-  private StorageOperationStatus unDeclareInputs(Component component,
-                                                 InputDefinition input,
-                                                 List <PropertyDefinition> propertiesToUpdate) {
-    for (PropertyDefinition propertyToUpdate : propertiesToUpdate) {
-      StorageOperationStatus storageOperationStatus = unDeclareInput(component, input, propertyToUpdate);
-      if (StorageOperationStatus.OK != storageOperationStatus) {
-        return storageOperationStatus;
-      }
-    }
-    return StorageOperationStatus.OK;
-  }
-
-  private StorageOperationStatus unDeclareInput(Component component,
-                                                InputDefinition input,
-                                                PropertyDefinition propertyToUpdate) {
-    prepareValueBeforeDelete(input, propertyToUpdate, Collections.emptyList());
-    propertyToUpdate.setValue(input.getDefaultValue());
-    Either<PropertyDefinition, StorageOperationStatus> status = toscaOperationFacade
-        .updatePropertyOfComponent(component, propertyToUpdate);
-    if(status.isRight()) {
-      return status.right().value();
+    private StorageOperationStatus unDeclareInputs(Component component,
+                                                   InputDefinition input,
+                                                   List<PropertyDefinition> propertiesToUpdate) {
+        for (PropertyDefinition propertyToUpdate : propertiesToUpdate) {
+            StorageOperationStatus storageOperationStatus = unDeclareInput(component, input, propertyToUpdate);
+            if (StorageOperationStatus.OK != storageOperationStatus) {
+                return storageOperationStatus;
+            }
+        }
+        return StorageOperationStatus.OK;
     }
 
-    return StorageOperationStatus.OK;
-  }
+    private StorageOperationStatus unDeclareInput(Component component,
+                                                  InputDefinition input,
+                                                  PropertyDefinition propertyToUpdate) {
+        prepareValueBeforeDelete(input, propertyToUpdate, Collections.emptyList());
+        propertyToUpdate.setValue(input.getDefaultValue());
+        Either<PropertyDefinition, StorageOperationStatus> status = toscaOperationFacade
+            .updatePropertyOfComponent(component, propertyToUpdate);
+        if (status.isRight()) {
+            return status.right().value();
+        }
 
-  private Optional<PropertyDefinition> getDeclaredPropertyByInputId(Component component, String inputId) {
-    List<PropertyDefinition> properties = component.getProperties();
-
-    if (CollectionUtils.isEmpty(properties)) {
-      return Optional.empty();
+        return StorageOperationStatus.OK;
     }
 
-    for (PropertyDefinition propertyDefinition : properties) {
-      List<GetInputValueDataDefinition> getInputValues = propertyDefinition.getGetInputValues();
-      if (CollectionUtils.isEmpty(getInputValues)) {
-        continue;
-      }
+    private Optional<PropertyDefinition> getDeclaredPropertyByInputId(Component component, String inputId) {
+        List<PropertyDefinition> properties = component.getProperties();
 
-      Optional<GetInputValueDataDefinition> getInputCandidate =
-              getInputValues.stream().filter(getInput -> getInput.getInputId().equals(inputId)).findAny();
+        if (CollectionUtils.isEmpty(properties)) {
+            return Optional.empty();
+        }
 
-      if (getInputCandidate.isPresent()) {
-        return Optional.of(propertyDefinition);
-      }
+        for (PropertyDefinition propertyDefinition : properties) {
+            List<GetInputValueDataDefinition> getInputValues = propertyDefinition.getGetInputValues();
+            if (CollectionUtils.isEmpty(getInputValues)) {
+                continue;
+            }
+
+            Optional<GetInputValueDataDefinition> getInputCandidate =
+                getInputValues.stream().filter(getInput -> getInput.getInputId().equals(inputId)).findAny();
+
+            if (getInputCandidate.isPresent()) {
+                return Optional.of(propertyDefinition);
+            }
+        }
+
+        return Optional.empty();
     }
 
-    return Optional.empty();
-  }
+    private Optional<List<PropertyDefinition>> getDeclaredPropertiesByInputId(Component component,
+                                                                              String inputId) {
+        List<PropertyDefinition> properties = component.getProperties();
+        List<PropertyDefinition> propertiesToUpdate = new ArrayList<>();
 
-  private Optional<List <PropertyDefinition>> getDeclaredPropertiesByInputId(Component component,
-                                                                    String inputId) {
-    List<PropertyDefinition> properties = component.getProperties();
-    List<PropertyDefinition> propertiesToUpdate = new ArrayList<>();
+        if (CollectionUtils.isEmpty(properties)) {
+            return Optional.empty();
+        }
 
-    if(CollectionUtils.isEmpty(properties)) {
-      return Optional.empty();
+        for (PropertyDefinition propertyDefinition : properties) {
+            List<GetInputValueDataDefinition> getInputValues = propertyDefinition.getGetInputValues();
+            if (CollectionUtils.isEmpty(getInputValues)) {
+                continue;
+            }
+
+            Optional<GetInputValueDataDefinition> getInputCandidate =
+                getInputValues.stream().filter(getInput -> getInput.getInputId().equals(inputId))
+                    .findAny();
+
+            if (getInputCandidate.isPresent()) {
+                propertiesToUpdate.add(propertyDefinition);
+            }
+        }
+
+        return Optional.of(propertiesToUpdate);
     }
 
-    for(PropertyDefinition propertyDefinition : properties) {
-      List<GetInputValueDataDefinition> getInputValues = propertyDefinition.getGetInputValues();
-      if(CollectionUtils.isEmpty(getInputValues)) {
-        continue;
-      }
-
-      Optional<GetInputValueDataDefinition> getInputCandidate =
-              getInputValues.stream().filter(getInput -> getInput.getInputId().equals(inputId))
-                      .findAny();
-
-      if(getInputCandidate.isPresent()) {
-        propertiesToUpdate.add(propertyDefinition);
-      }
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        throw new UnsupportedOperationException();
     }
 
-    return Optional.of(propertiesToUpdate);
-  }
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/DefaultPropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/DefaultPropertyDeclarator.java
index 030fc46..25b1327 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/DefaultPropertyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/DefaultPropertyDeclarator.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,8 +20,24 @@
 
 package org.openecomp.sdc.be.components.property;
 
+import static org.openecomp.sdc.common.api.Constants.GET_ATTRIBUTE;
+import static org.openecomp.sdc.common.api.Constants.GET_INPUT;
+import static org.openecomp.sdc.common.api.Constants.GET_POLICY;
+
 import com.google.gson.Gson;
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Collectors;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang.StringUtils;
@@ -29,6 +45,7 @@
 import org.openecomp.sdc.be.components.utils.PropertiesUtils;
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
 import org.openecomp.sdc.be.datatypes.elements.GetInputValueDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GetAttributeValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.PropertiesOwner;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
@@ -36,8 +53,10 @@
 import org.openecomp.sdc.be.model.CapabilityDefinition;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
+import org.openecomp.sdc.be.model.ComponentInstancePropOutput;
 import org.openecomp.sdc.be.model.IComponentInstanceConnectedElement;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
@@ -48,22 +67,8 @@
 import org.openecomp.sdc.exception.ResponseFormat;
 import org.yaml.snakeyaml.Yaml;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.openecomp.sdc.common.api.Constants.GET_INPUT;
-import static org.openecomp.sdc.common.api.Constants.GET_POLICY;
-
-public abstract class DefaultPropertyDeclarator<PROPERTYOWNER extends PropertiesOwner, PROPERTYTYPE extends PropertyDataDefinition> implements PropertyDeclarator {
+public abstract class DefaultPropertyDeclarator<PROPERTYOWNER extends PropertiesOwner, PROPERTYTYPE extends PropertyDataDefinition> implements
+    PropertyDeclarator {
 
     private static final Logger log = Logger.getLogger(DefaultPropertyDeclarator.class);
     private static final short LOOP_PROTECTION_LEVEL = 10;
@@ -72,23 +77,42 @@
     private ComponentsUtils componentsUtils;
     private PropertyOperation propertyOperation;
     private static final String GET_INPUT_INDEX = "INDEX";
+    private static final String GET_ATTRIBUTE_INDEX = "INDEX";
 
-    public DefaultPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation) {
+    protected DefaultPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation) {
         this.componentsUtils = componentsUtils;
         this.propertyOperation = propertyOperation;
     }
 
     @Override
-    public Either<List<InputDefinition>, StorageOperationStatus> declarePropertiesAsInputs(Component component, String propertiesOwnerId, List<ComponentInstancePropInput> propsToDeclare) {
-        log.debug("#declarePropertiesAsInputs - declaring properties as inputs for component {} from properties owner {}", component.getUniqueId(), propertiesOwnerId);
+    public Either<List<InputDefinition>, StorageOperationStatus> declarePropertiesAsInputs(Component component,
+                                                                                           String propertiesOwnerId,
+                                                                                           List<ComponentInstancePropInput> propsToDeclare) {
+        log.debug(
+            "#declarePropertiesAsInputs - declaring properties as inputs for component {} from properties owner {}",
+            component.getUniqueId(), propertiesOwnerId);
         return resolvePropertiesOwner(component, propertiesOwnerId)
-                .map(propertyOwner -> declarePropertiesAsInputs(component, propertyOwner, propsToDeclare))
-                .orElse(Either.right(onPropertiesOwnerNotFound(component.getUniqueId(), propertiesOwnerId)));
+            .map(propertyOwner -> declarePropertiesAsInputs(component, propertyOwner, propsToDeclare))
+            .orElse(Either.right(onPropertiesOwnerNotFound(component.getUniqueId(), propertiesOwnerId)));
+    }
+
+    @Override
+    public Either<List<OutputDefinition>, StorageOperationStatus> declarePropertiesAsOutputs(final Component component,
+                                                                                             final String propertiesOwnerId,
+                                                                                             final List<ComponentInstancePropOutput> propsToDeclare) {
+        log.debug(
+            "#declarePropertiesAsOutputs - declaring properties as outputs for component {} from properties owner {}",
+            component.getUniqueId(), propertiesOwnerId);
+        return resolvePropertiesOwner(component, propertiesOwnerId)
+            .map(propertyOwner -> declarePropertiesAsOutputs(component, propertyOwner, propsToDeclare))
+            .orElse(Either.right(onPropertiesOwnerNotFound(component.getUniqueId(), propertiesOwnerId)));
     }
 
     protected abstract PROPERTYTYPE createDeclaredProperty(PropertyDataDefinition prop);
 
-    protected abstract Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String propertiesOwnerId, List<PROPERTYTYPE> properties);
+    protected abstract Either<?, StorageOperationStatus> updatePropertiesValues(Component component,
+                                                                                String propertiesOwnerId,
+                                                                                List<PROPERTYTYPE> properties);
 
     protected abstract Optional<PROPERTYOWNER> resolvePropertiesOwner(Component component, String propertiesOwnerId);
 
@@ -96,17 +120,24 @@
 
     @Override
     public Either<List<PolicyDefinition>, StorageOperationStatus> declarePropertiesAsPolicies(Component component,
-            String propertiesOwnerId,
-            List<ComponentInstancePropInput> propsToDeclare) {
-        log.debug("#declarePropertiesAsPolicies - declaring properties as policies for component {} from properties owner {}", component.getUniqueId(), propertiesOwnerId);
+                                                                                              String propertiesOwnerId,
+                                                                                              List<ComponentInstancePropInput> propsToDeclare) {
+        log.debug(
+            "#declarePropertiesAsPolicies - declaring properties as policies for component {} from properties owner {}",
+            component.getUniqueId(), propertiesOwnerId);
         return resolvePropertiesOwner(component, propertiesOwnerId)
-                       .map(propertyOwner -> declarePropertiesAsPolicies(component, propertyOwner, propsToDeclare))
-                       .orElse(Either.right(onPropertiesOwnerNotFound(component.getUniqueId(), propertiesOwnerId)));
+            .map(propertyOwner -> declarePropertiesAsPolicies(component, propertyOwner, propsToDeclare))
+            .orElse(Either.right(onPropertiesOwnerNotFound(component.getUniqueId(), propertiesOwnerId)));
     }
 
     @Override
-    public Either<InputDefinition, StorageOperationStatus> declarePropertiesAsListInput(Component component, String propertiesOwnerId, List<ComponentInstancePropInput> propsToDeclare, InputDefinition input) {
-        log.debug("#declarePropertiesAsListInput - declaring properties as inputs for component {} from properties owner {}", component.getUniqueId(), propertiesOwnerId);
+    public Either<InputDefinition, StorageOperationStatus> declarePropertiesAsListInput(Component component,
+                                                                                        String propertiesOwnerId,
+                                                                                        List<ComponentInstancePropInput> propsToDeclare,
+                                                                                        InputDefinition input) {
+        log.debug(
+            "#declarePropertiesAsListInput - declaring properties as inputs for component {} from properties owner {}",
+            component.getUniqueId(), propertiesOwnerId);
         Optional<PROPERTYOWNER> propertyOwner = resolvePropertiesOwner(component, propertiesOwnerId);
         if (propertyOwner.isPresent()) {
             return declarePropertiesAsListInput(component, propertyOwner.get(), propsToDeclare, input);
@@ -119,33 +150,58 @@
         return StorageOperationStatus.OK;
     }
 
-    private Either<List<PolicyDefinition>, StorageOperationStatus> declarePropertiesAsPolicies(Component component, PROPERTYOWNER propertiesOwner, List<ComponentInstancePropInput> propsToDeclare) {
-        PropertiesDeclarationData policyProperties = createPoliciesAndOverridePropertiesValues(propertiesOwner.getUniqueId(), propertiesOwner, propsToDeclare);
-        return updatePropertiesValues(component, propertiesOwner.getUniqueId(), policyProperties.getPropertiesToUpdate())
-                       .left()
-                       .map(updatePropsRes -> policyProperties.getPoliciesToCreate());
+    private Either<List<PolicyDefinition>, StorageOperationStatus> declarePropertiesAsPolicies(Component component,
+                                                                                               PROPERTYOWNER propertiesOwner,
+                                                                                               List<ComponentInstancePropInput> propsToDeclare) {
+        PropertiesDeclarationData policyProperties = createPoliciesAndOverridePropertiesValues(
+            propertiesOwner.getUniqueId(), propertiesOwner, propsToDeclare);
+        return updatePropertiesValues(component, propertiesOwner.getUniqueId(),
+            policyProperties.getPropertiesToUpdate())
+            .left()
+            .map(updatePropsRes -> policyProperties.getPoliciesToCreate());
     }
 
     private StorageOperationStatus onPropertiesOwnerNotFound(String componentId, String propertiesOwnerId) {
-        log.debug("#declarePropertiesAsInputs - properties owner {} was not found on component {}", propertiesOwnerId, componentId);
+        log.debug("#declarePropertiesAsInputs - properties owner {} was not found on component {}", propertiesOwnerId,
+            componentId);
         return StorageOperationStatus.NOT_FOUND;
     }
 
-    private Either<List<InputDefinition>, StorageOperationStatus> declarePropertiesAsInputs(Component component, PROPERTYOWNER propertiesOwner, List<ComponentInstancePropInput> propsToDeclare) {
-        PropertiesDeclarationData inputsProperties = createInputsAndOverridePropertiesValues(component, propertiesOwner, propsToDeclare);
-        return updatePropertiesValues(component, propertiesOwner.getUniqueId(), inputsProperties.getPropertiesToUpdate())
-                .left()
-                .map(updatePropsRes -> inputsProperties.getInputsToCreate());
+    private Either<List<InputDefinition>, StorageOperationStatus> declarePropertiesAsInputs(Component component,
+                                                                                            PROPERTYOWNER propertiesOwner,
+                                                                                            List<ComponentInstancePropInput> propsToDeclare) {
+        PropertiesDeclarationData inputsProperties = createInputsAndOverridePropertiesValues(component, propertiesOwner,
+            propsToDeclare);
+        return updatePropertiesValues(component, propertiesOwner.getUniqueId(),
+            inputsProperties.getPropertiesToUpdate())
+            .left()
+            .map(updatePropsRes -> inputsProperties.getInputsToCreate());
     }
-    private PropertiesDeclarationData createPoliciesAndOverridePropertiesValues(String componentId, PROPERTYOWNER propertiesOwner, List<ComponentInstancePropInput> propsToDeclare) {
+
+    private Either<List<OutputDefinition>, StorageOperationStatus> declarePropertiesAsOutputs(final Component component,
+                                                                                              final PROPERTYOWNER propertiesOwner,
+                                                                                              final List<ComponentInstancePropOutput> outputPropertiesToDeclare) {
+        final PropertiesDeclarationData outputsProperties = createOutputsAndOverridePropertiesValues(component,
+            propertiesOwner,
+            outputPropertiesToDeclare);
+        return updatePropertiesValues(component, propertiesOwner.getUniqueId(),
+            outputsProperties.getPropertiesToUpdate())
+            .left()
+            .map(updatePropsRes -> outputsProperties.getOutputsToCreate());
+    }
+
+    private PropertiesDeclarationData createPoliciesAndOverridePropertiesValues(String componentId,
+                                                                                PROPERTYOWNER propertiesOwner,
+                                                                                List<ComponentInstancePropInput> propsToDeclare) {
         List<PROPERTYTYPE> declaredProperties = new ArrayList<>();
         List<PolicyDefinition> policies = new ArrayList<>();
-        propsToDeclare.forEach(property -> policies.add(declarePropertyPolicy(componentId, declaredProperties, property)));
-        return new PropertiesDeclarationData(null, policies, declaredProperties);
+        propsToDeclare
+            .forEach(property -> policies.add(declarePropertyPolicy(componentId, declaredProperties, property)));
+        return new PropertiesDeclarationData(null, null, policies, declaredProperties);
     }
 
     private PolicyDefinition declarePropertyPolicy(String componentId, List<PROPERTYTYPE> declaredProperties,
-            ComponentInstancePropInput propInput) {
+                                                   ComponentInstancePropInput propInput) {
         PropertyDataDefinition prop = resolveProperty(declaredProperties, propInput);
         propInput.setOwnerId(null);
         propInput.setParentUniqueId(null);
@@ -159,8 +215,7 @@
         changePropertyValueToGetPolicy(prop, policyDefinition);
         PROPERTYTYPE declaredProperty = createDeclaredProperty(prop);
 
-
-        if(!declaredProperties.contains(declaredProperty)){
+        if (!declaredProperties.contains(declaredProperty)) {
             declaredProperties.add(declaredProperty);
         }
 
@@ -175,7 +230,7 @@
         prop.setValue(jsonObject.toJSONString());
         policyDefinition.setValue(jsonObject.toJSONString());
 
-        if(CollectionUtils.isEmpty(prop.getGetPolicyValues())){
+        if (CollectionUtils.isEmpty(prop.getGetPolicyValues())) {
             prop.setGetPolicyValues(new ArrayList<>());
         }
         List<GetPolicyValueDataDefinition> getPolicyValues = prop.getGetPolicyValues();
@@ -193,7 +248,10 @@
     }
 
 
-    private Either<InputDefinition, StorageOperationStatus> declarePropertiesAsListInput(Component component, PROPERTYOWNER propertiesOwner, List<ComponentInstancePropInput> propsToDeclare, InputDefinition input) {
+    private Either<InputDefinition, StorageOperationStatus> declarePropertiesAsListInput(Component component,
+                                                                                         PROPERTYOWNER propertiesOwner,
+                                                                                         List<ComponentInstancePropInput> propsToDeclare,
+                                                                                         InputDefinition input) {
         List<PROPERTYTYPE> declaredProperties = new ArrayList<>();
         for (ComponentInstancePropInput propInput : propsToDeclare) {
             if (StringUtils.isNotEmpty(propInput.getPropertiesName()) && propInput.getInput() != null) {
@@ -223,28 +281,51 @@
             }
         }
         return updatePropertiesValues(component, propertiesOwner.getUniqueId(), declaredProperties)
-                .left().map(x -> input);
+            .left().map(x -> input);
     }
 
-    private PropertiesDeclarationData createInputsAndOverridePropertiesValues(Component component, PROPERTYOWNER propertiesOwner, List<ComponentInstancePropInput> propsToDeclare) {
+    private PropertiesDeclarationData createInputsAndOverridePropertiesValues(Component component,
+                                                                              PROPERTYOWNER propertiesOwner,
+                                                                              List<ComponentInstancePropInput> propsToDeclare) {
         List<PROPERTYTYPE> declaredProperties = new ArrayList<>();
         List<InputDefinition> createdInputs = propsToDeclare.stream()
-                .map(propInput -> declarePropertyInput(component, propertiesOwner, declaredProperties, propInput))
-                .collect(Collectors.toList());
-        return new PropertiesDeclarationData(createdInputs, null, declaredProperties);
+            .map(propInput -> declarePropertyInput(component, propertiesOwner, declaredProperties, propInput))
+            .collect(Collectors.toList());
+        return new PropertiesDeclarationData(createdInputs, null, null, declaredProperties);
     }
 
-    private InputDefinition declarePropertyInput(Component component, PROPERTYOWNER propertiesOwner, List<PROPERTYTYPE> declaredProperties, ComponentInstancePropInput propInput) {
+    private PropertiesDeclarationData createOutputsAndOverridePropertiesValues(final Component component,
+                                                                               final PROPERTYOWNER propertiesOwner,
+                                                                               final List<ComponentInstancePropOutput> propertiesToDeclare) {
+        final List<PROPERTYTYPE> declaredProperties = new ArrayList<>();
+        final List<OutputDefinition> createdOutputs = propertiesToDeclare.stream()
+            .map(propOutput -> declarePropertyOutput(component, propertiesOwner, declaredProperties, propOutput))
+            .collect(Collectors.toList());
+        return new PropertiesDeclarationData(null, createdOutputs, null, declaredProperties);
+    }
+
+    private InputDefinition declarePropertyInput(Component component, PROPERTYOWNER propertiesOwner,
+                                                 List<PROPERTYTYPE> declaredProperties,
+                                                 ComponentInstancePropInput propInput) {
         PropertyDataDefinition prop = resolveProperty(declaredProperties, propInput);
         InputDefinition inputDefinition = createInput(component, propertiesOwner, propInput, prop);
         PROPERTYTYPE declaredProperty = createDeclaredProperty(prop);
-        if(!declaredProperties.contains(declaredProperty)){
+        if (!declaredProperties.contains(declaredProperty)) {
             declaredProperties.add(declaredProperty);
         }
         addPropertiesListToInput(declaredProperty, inputDefinition);
         return inputDefinition;
     }
 
+    private OutputDefinition declarePropertyOutput(final Component component,
+                                                   final PROPERTYOWNER propertiesOwner,
+                                                   final List<PROPERTYTYPE> declaredProperties,
+                                                   final ComponentInstancePropOutput componentInstancePropOutput) {
+        final PropertyDataDefinition propertyDataDefinition =
+            resolveOutputProperty(declaredProperties, componentInstancePropOutput);
+        return createOutput(component, propertiesOwner, componentInstancePropOutput, propertyDataDefinition);
+    }
+
     private InputDefinition createInput(Component component, PROPERTYOWNER propertiesOwner,
                                         ComponentInstancePropInput propInput, PropertyDataDefinition prop) {
         String generatedInputPrefix = propertiesOwner.getNormalizedName();
@@ -253,27 +334,62 @@
             generatedInputPrefix = null;
         }
 
-        Optional<CapabilityDefinition> propertyCapability = PropertiesUtils.getPropertyCapabilityOfChildInstance(propInput
+        Optional<CapabilityDefinition> propertyCapability = PropertiesUtils
+            .getPropertyCapabilityOfChildInstance(propInput
                 .getParentUniqueId(), component.getCapabilities());
         if (propertyCapability.isPresent()) {
             String capName = propertyCapability.get().getName();
-            if(capName.contains(".")) {
+            if (capName.contains(".")) {
                 capName = capName.replaceAll("\\.", UNDERSCORE);
             }
-            generatedInputPrefix = generatedInputPrefix ==  null || generatedInputPrefix.isEmpty()?
-                    capName : generatedInputPrefix + UNDERSCORE + capName;
+            generatedInputPrefix = generatedInputPrefix == null || generatedInputPrefix.isEmpty() ?
+                capName : generatedInputPrefix + UNDERSCORE + capName;
         }
 
         String generatedInputName = generateInputName(generatedInputPrefix, propInput);
-        log.debug("createInput: propOwner.uniqueId={}, propInput.parentUniqueId={}", propertiesOwner.getUniqueId(), propInput.getParentUniqueId());
+        log.debug("createInput: propOwner.uniqueId={}, propInput.parentUniqueId={}", propertiesOwner.getUniqueId(),
+            propInput.getParentUniqueId());
         return createInputFromProperty(component.getUniqueId(), propertiesOwner, generatedInputName, propInput, prop);
     }
 
+
+    private OutputDefinition createOutput(final Component component, final PROPERTYOWNER propertiesOwner,
+                                          final ComponentInstancePropOutput componentInstancePropOutput,
+                                          final PropertyDataDefinition propertyDataDefinition) {
+
+        String generatedOutputPrefix = propertiesOwner.getNormalizedName();
+        if (propertiesOwner.getUniqueId().equals(componentInstancePropOutput.getParentUniqueId())) {
+            generatedOutputPrefix = null;
+        }
+        final Optional<CapabilityDefinition> propertyCapability = PropertiesUtils
+            .getPropertyCapabilityOfChildInstance(componentInstancePropOutput
+                .getParentUniqueId(), component.getCapabilities());
+        if (propertyCapability.isPresent()) {
+            String capName = propertyCapability.get().getName();
+            if (capName.contains(".")) {
+                capName = capName.replaceAll("\\.", UNDERSCORE);
+            }
+            generatedOutputPrefix = generatedOutputPrefix == null || generatedOutputPrefix.isEmpty() ?
+                capName : generatedOutputPrefix + UNDERSCORE + capName;
+        }
+
+        final String generateOutputName = generateOutputName(generatedOutputPrefix, componentInstancePropOutput);
+        log.debug("createOutput: propOwner.uniqueId={}, propertyDataDefinition.parentUniqueId={}",
+            propertiesOwner.getUniqueId(), componentInstancePropOutput.getParentUniqueId());
+
+        final List<String> outputPropertyValue = new LinkedList<>();
+        outputPropertyValue.add(propertiesOwner.getName());
+        outputPropertyValue.add(componentInstancePropOutput.getName());
+
+        return createOutputFromProperty(component.getUniqueId(), propertiesOwner, generateOutputName,
+            outputPropertyValue, componentInstancePropOutput, propertyDataDefinition);
+    }
+
     private String generateInputName(String inputName, ComponentInstancePropInput propInput) {
         String declaredInputName;
         String[] parsedPropNames = propInput.getParsedPropNames();
 
-        if(parsedPropNames != null){
+        if (parsedPropNames != null) {
             declaredInputName = handleInputName(inputName, parsedPropNames);
         } else {
             String[] propName = {propInput.getName()};
@@ -283,11 +399,25 @@
         return declaredInputName;
     }
 
+    private String generateOutputName(final String outputPropertyName,
+                                      final ComponentInstancePropOutput componentInstancePropOutput) {
+        String declaredOutputName;
+        final String[] parsedPropNames = componentInstancePropOutput.getParsedPropNames();
+
+        if (parsedPropNames != null) {
+            declaredOutputName = handleInputName(outputPropertyName, parsedPropNames);
+        } else {
+            final String[] propertyName = {componentInstancePropOutput.getName()};
+            declaredOutputName = handleInputName(outputPropertyName, propertyName);
+        }
+        return declaredOutputName;
+    }
+
     private String handleInputName(String inputName, String[] parsedPropNames) {
         StringBuilder prefix = new StringBuilder();
         int startingIndex;
 
-        if(Objects.isNull(inputName)) {
+        if (Objects.isNull(inputName)) {
             prefix.append(parsedPropNames[0]);
             startingIndex = 1;
         } else {
@@ -295,33 +425,43 @@
             startingIndex = 0;
         }
 
-        while(startingIndex < parsedPropNames.length){
+        while (startingIndex < parsedPropNames.length) {
             prefix.append(UNDERSCORE);
             prefix.append(parsedPropNames[startingIndex]);
-            startingIndex ++;
+            startingIndex++;
         }
 
         return prefix.toString();
     }
 
-    private PropertyDataDefinition resolveProperty(List<PROPERTYTYPE> propertiesToCreate, ComponentInstancePropInput propInput) {
+    private PropertyDataDefinition resolveProperty(List<PROPERTYTYPE> propertiesToCreate,
+                                                   ComponentInstancePropInput propInput) {
         Optional<PROPERTYTYPE> resolvedProperty = propertiesToCreate.stream()
-                .filter(p -> p.getName().equals(propInput.getName()))
-                .findFirst();
+            .filter(p -> p.getName().equals(propInput.getName()))
+            .findFirst();
         return resolvedProperty.isPresent() ? resolvedProperty.get() : propInput;
     }
 
-    InputDefinition createInputFromProperty(String componentId, PROPERTYOWNER propertiesOwner, String inputName, ComponentInstancePropInput propInput, PropertyDataDefinition prop) {
-        String propertiesName = propInput.getPropertiesName() ;
+    private PropertyDataDefinition resolveOutputProperty(final List<PROPERTYTYPE> propertiesToCreate,
+                                                         final ComponentInstancePropOutput componentInstancePropOutput) {
+        final Optional<PROPERTYTYPE> resolvedProperty = propertiesToCreate.stream()
+            .filter(p -> p.getName().equals(componentInstancePropOutput.getName()))
+            .findFirst();
+        return resolvedProperty.isPresent() ? resolvedProperty.get() : componentInstancePropOutput;
+    }
+
+    InputDefinition createInputFromProperty(String componentId, PROPERTYOWNER propertiesOwner, String inputName,
+                                            ComponentInstancePropInput propInput, PropertyDataDefinition prop) {
+        String propertiesName = propInput.getPropertiesName();
         PropertyDefinition selectedProp = propInput.getInput();
         String[] parsedPropNames = propInput.getParsedPropNames();
         InputDefinition input;
         boolean complexProperty = false;
-        if(propertiesName != null && !propertiesName.isEmpty() && selectedProp != null){
+        if (propertiesName != null && !propertiesName.isEmpty() && selectedProp != null) {
             complexProperty = true;
             input = new InputDefinition(selectedProp);
             input.setDefaultValue(selectedProp.getValue());
-        }else{
+        } else {
             input = new InputDefinition(prop);
             input.setDefaultValue(prop.getValue());
         }
@@ -330,17 +470,17 @@
         input.setInputPath(propertiesName);
         input.setInstanceUniqueId(propertiesOwner.getUniqueId());
         input.setPropertyId(propInput.getUniqueId());
-		if (Objects.isNull(input.getSubPropertyInputPath())
-				|| (Objects.nonNull(propertiesName)
-				&& input.getSubPropertyInputPath().substring(input.getSubPropertyInputPath().lastIndexOf('#'))
-				.equals(propertiesName.substring(propertiesName.lastIndexOf('#'))))) {
-			input.setParentPropertyType(propInput.getType());
-			input.setSubPropertyInputPath(propertiesName);
-		}
+        if (Objects.isNull(input.getSubPropertyInputPath())
+            || (Objects.nonNull(propertiesName)
+            && input.getSubPropertyInputPath().substring(input.getSubPropertyInputPath().lastIndexOf('#'))
+            .equals(propertiesName.substring(propertiesName.lastIndexOf('#'))))) {
+            input.setParentPropertyType(propInput.getType());
+            input.setSubPropertyInputPath(propertiesName);
+        }
 
         changePropertyValueToGetInputValue(inputName, parsedPropNames, input, prop, complexProperty);
 
-        if(prop instanceof IComponentInstanceConnectedElement) {
+        if (prop instanceof IComponentInstanceConnectedElement) {
             ((IComponentInstanceConnectedElement) prop)
                 .setComponentInstanceId(propertiesOwner.getUniqueId());
             ((IComponentInstanceConnectedElement) prop)
@@ -349,32 +489,78 @@
         return input;
     }
 
-    private void changePropertyValueToGetInputValue(String inputName, String[] parsedPropNames, InputDefinition input, PropertyDataDefinition prop, boolean complexProperty) {
+    OutputDefinition createOutputFromProperty(final String componentId,
+                                              final PROPERTYOWNER propertiesOwner,
+                                              final String outputPropertyName,
+                                              final List<String> outputPropertyValue,
+                                              final ComponentInstancePropOutput componentInstancePropOutput,
+                                              final PropertyDataDefinition propertyDataDefinition) {
+        final String propertiesName = componentInstancePropOutput.getPropertiesName();
+        final PropertyDefinition selectedProp = componentInstancePropOutput.getOutput();
+        final String[] parsedPropNames = componentInstancePropOutput.getParsedPropNames();
+        OutputDefinition output;
+        boolean complexProperty = false;
+        if (propertiesName != null && !propertiesName.isEmpty() && selectedProp != null) {
+            complexProperty = true;
+            output = new OutputDefinition(selectedProp);
+            output.setDefaultValue(selectedProp.getValue());
+        } else {
+            output = new OutputDefinition(propertyDataDefinition);
+            output.setDefaultValue(propertyDataDefinition.getValue());
+        }
+        output.setName(outputPropertyName);
+        output.setUniqueId(UniqueIdBuilder.buildPropertyUniqueId(componentId, output.getName()));
+        output.setOutputPath(propertiesName);
+        output.setInstanceUniqueId(propertiesOwner.getUniqueId());
+        output.setPropertyId(componentInstancePropOutput.getUniqueId());
+        if (Objects.isNull(output.getSubPropertyOutputPath())
+            || (Objects.nonNull(propertiesName)
+            && output.getSubPropertyOutputPath().substring(output.getSubPropertyOutputPath().lastIndexOf('#'))
+            .equals(propertiesName.substring(propertiesName.lastIndexOf('#'))))) {
+            output.setParentPropertyType(componentInstancePropOutput.getType());
+            output.setSubPropertyOutputPath(propertiesName);
+        }
+
+        setOutputPropertyAsGetAttributeFunction(outputPropertyValue, parsedPropNames, output, propertyDataDefinition,
+            complexProperty);
+
+        if (propertyDataDefinition instanceof IComponentInstanceConnectedElement) {
+            ((IComponentInstanceConnectedElement) propertyDataDefinition)
+                .setComponentInstanceId(propertiesOwner.getUniqueId());
+            ((IComponentInstanceConnectedElement) propertyDataDefinition)
+                .setComponentInstanceName(propertiesOwner.getName());
+        }
+        return output;
+    }
+
+    private void changePropertyValueToGetInputValue(String inputName, String[] parsedPropNames, InputDefinition input,
+                                                    PropertyDataDefinition prop, boolean complexProperty) {
         JSONObject jsonObject = new JSONObject();
         String value = prop.getValue();
-        if(value == null || value.isEmpty()){
-            if(complexProperty){
+        if (value == null || value.isEmpty()) {
+            if (complexProperty) {
 
-                jsonObject = createJSONValueForProperty(parsedPropNames.length -1, parsedPropNames, jsonObject, inputName);
+                jsonObject = createJSONValueForProperty(parsedPropNames.length - 1, parsedPropNames, jsonObject,
+                    inputName);
                 prop.setValue(jsonObject.toJSONString());
 
-            }else{
+            } else {
 
                 jsonObject.put(GET_INPUT, input.getName());
                 prop.setValue(jsonObject.toJSONString());
 
             }
 
-        }else{
+        } else {
 
-            Object objValue =  new Yaml().load(value);
-            if( objValue instanceof Map || objValue  instanceof List){
-                if(!complexProperty){
+            Object objValue = new Yaml().load(value);
+            if (objValue instanceof Map || objValue instanceof List) {
+                if (!complexProperty) {
                     jsonObject.put(GET_INPUT, input.getName());
                     prop.setValue(jsonObject.toJSONString());
 
 
-                }else{
+                } else {
                     Map<String, Object> mappedToscaTemplate = (Map<String, Object>) objValue;
                     createInputValue(mappedToscaTemplate, 1, parsedPropNames, inputName);
 
@@ -383,7 +569,7 @@
 
                 }
 
-            }else{
+            } else {
                 jsonObject.put(GET_INPUT, input.getName());
                 prop.setValue(jsonObject.toJSONString());
 
@@ -391,7 +577,7 @@
 
         }
 
-        if(CollectionUtils.isEmpty(prop.getGetInputValues())){
+        if (CollectionUtils.isEmpty(prop.getGetInputValues())) {
             prop.setGetInputValues(new ArrayList<>());
         }
         List<GetInputValueDataDefinition> getInputValues = prop.getGetInputValues();
@@ -402,20 +588,44 @@
         getInputValues.add(getInputValueDataDefinition);
     }
 
-    private  JSONObject createJSONValueForProperty (int i, String [] parsedPropNames, JSONObject ooj, String inputName){
+    private void setOutputPropertyAsGetAttributeFunction(final List<String> outputPropertyValue,
+                                                         final String[] parsedPropNames,
+                                                         final OutputDefinition output,
+                                                         final PropertyDataDefinition prop,
+                                                         final boolean complexProperty) {
+        JSONObject jsonObject = new JSONObject();
+        if (complexProperty) {
+            jsonObject = createJSONValueForOutputProperty(parsedPropNames.length - 1, parsedPropNames,
+                jsonObject, outputPropertyValue);
+        } else {
+            jsonObject.put(GET_ATTRIBUTE, outputPropertyValue);
+        }
+        output.setValue(jsonObject.toJSONString());
+        if (CollectionUtils.isEmpty(prop.getGetAttributeValues())) {
+            prop.setGetAttributeValues(new ArrayList<>());
+        }
 
-        while(i >= 1){
-            if( i == parsedPropNames.length -1){
+        final List<GetAttributeValueDataDefinition> getOutputValues = prop.getGetAttributeValues();
+        GetAttributeValueDataDefinition getAttributeValueDataDefinition = new GetAttributeValueDataDefinition();
+        getAttributeValueDataDefinition.setOutputId(output.getUniqueId());
+        getAttributeValueDataDefinition.setOutputName(output.getName());
+        getOutputValues.add(getAttributeValueDataDefinition);
+    }
+
+    private JSONObject createJSONValueForProperty(int i, String[] parsedPropNames, JSONObject ooj, String inputName) {
+
+        while (i >= 1) {
+            if (i == parsedPropNames.length - 1) {
                 JSONObject jobProp = new JSONObject();
                 jobProp.put(GET_INPUT, inputName);
                 ooj.put(parsedPropNames[i], jobProp);
                 i--;
-                return createJSONValueForProperty (i, parsedPropNames, ooj, inputName);
-            }else{
+                return createJSONValueForProperty(i, parsedPropNames, ooj, inputName);
+            } else {
                 JSONObject res = new JSONObject();
                 res.put(parsedPropNames[i], ooj);
-                i --;
-                res =  createJSONValueForProperty (i, parsedPropNames, res, inputName);
+                i--;
+                res = createJSONValueForProperty(i, parsedPropNames, res, inputName);
                 return res;
             }
         }
@@ -423,40 +633,62 @@
         return ooj;
     }
 
-    private  Map<String, Object> createInputValue(Map<String, Object> lhm1, int index, String[] inputNames, String inputName){
-        while(index < inputNames.length){
-            if(lhm1.containsKey(inputNames[index])){
+    private JSONObject createJSONValueForOutputProperty(int i, final String[] parsedPropNames, final JSONObject ooj,
+                                                        final List<String> outputPropertyValue) {
+
+        while (i >= 1) {
+            if (i == parsedPropNames.length - 1) {
+                JSONObject jobProp = new JSONObject();
+                jobProp.put(GET_ATTRIBUTE, outputPropertyValue);
+                ooj.put(parsedPropNames[i], jobProp);
+                i--;
+                return createJSONValueForOutputProperty(i, parsedPropNames, ooj, outputPropertyValue);
+            } else {
+                JSONObject res = new JSONObject();
+                res.put(parsedPropNames[i], ooj);
+                i--;
+                res = createJSONValueForOutputProperty(i, parsedPropNames, res, outputPropertyValue);
+                return res;
+            }
+        }
+        return ooj;
+    }
+
+    private Map<String, Object> createInputValue(Map<String, Object> lhm1, int index, String[] inputNames,
+                                                 String inputName) {
+        while (index < inputNames.length) {
+            if (lhm1.containsKey(inputNames[index])) {
                 Object value = lhm1.get(inputNames[index]);
-                if (value instanceof Map){
-                    if(index == inputNames.length -1){
+                if (value instanceof Map) {
+                    if (index == inputNames.length - 1) {
                         ((Map) value).put(GET_INPUT, inputName);
                         return (Map) value;
 
-                    }else{
+                    } else {
                         index++;
-                        return  createInputValue((Map)value, index, inputNames, inputName);
+                        return createInputValue((Map) value, index, inputNames, inputName);
                     }
-                }else{
+                } else {
                     Map<String, Object> jobProp = new HashMap<>();
-                    if(index == inputNames.length -1){
+                    if (index == inputNames.length - 1) {
                         jobProp.put(GET_INPUT, inputName);
                         lhm1.put(inputNames[index], jobProp);
                         return lhm1;
-                    }else{
+                    } else {
                         lhm1.put(inputNames[index], jobProp);
                         index++;
-                        return  createInputValue(jobProp, index, inputNames, inputName);
+                        return createInputValue(jobProp, index, inputNames, inputName);
                     }
                 }
-            }else{
+            } else {
                 Map<String, Object> jobProp = new HashMap<>();
                 lhm1.put(inputNames[index], jobProp);
-                if(index == inputNames.length -1){
+                if (index == inputNames.length - 1) {
                     jobProp.put(GET_INPUT, inputName);
                     return jobProp;
-                }else{
+                } else {
                     index++;
-                    return  createInputValue(jobProp, index, inputNames, inputName);
+                    return createInputValue(jobProp, index, inputNames, inputName);
                 }
             }
         }
@@ -464,12 +696,16 @@
     }
 
     private class PropertiesDeclarationData {
+
         private List<InputDefinition> inputsToCreate;
+        private List<OutputDefinition> outputsToCreate;
         private List<PolicyDefinition> policiesToCreate;
         private List<PROPERTYTYPE> propertiesToUpdate;
 
-        PropertiesDeclarationData(List<InputDefinition> inputsToCreate, List<PolicyDefinition> policiesToCreate, List<PROPERTYTYPE> propertiesToUpdate) {
+        PropertiesDeclarationData(List<InputDefinition> inputsToCreate, List<OutputDefinition> outputsToCreate,
+                                  List<PolicyDefinition> policiesToCreate, List<PROPERTYTYPE> propertiesToUpdate) {
             this.inputsToCreate = inputsToCreate;
+            this.outputsToCreate = outputsToCreate;
             this.policiesToCreate = policiesToCreate;
             this.propertiesToUpdate = propertiesToUpdate;
         }
@@ -478,14 +714,22 @@
             return inputsToCreate;
         }
 
-        public List<PolicyDefinition> getPoliciesToCreate() { return policiesToCreate; }
+        public List<OutputDefinition> getOutputsToCreate() {
+            return outputsToCreate;
+        }
+
+        public List<PolicyDefinition> getPoliciesToCreate() {
+            return policiesToCreate;
+        }
 
         List<PROPERTYTYPE> getPropertiesToUpdate() {
             return propertiesToUpdate;
         }
     }
 
-    Either<InputDefinition, ResponseFormat>  prepareValueBeforeDelete(InputDefinition inputForDelete, PropertyDataDefinition inputValue, List<String> pathOfComponentInstances) {
+    Either<InputDefinition, ResponseFormat> prepareValueBeforeDelete(InputDefinition inputForDelete,
+                                                                     PropertyDataDefinition inputValue,
+                                                                     List<String> pathOfComponentInstances) {
         Either<InputDefinition, ResponseFormat> deleteEither = prepareValueBeforeDelete(inputForDelete, inputValue);
 
         Either<String, JanusGraphOperationStatus> findDefaultValue = propertyOperation
@@ -493,7 +737,8 @@
                 (String) inputValue.getDefaultValue());
         if (findDefaultValue.isRight()) {
             deleteEither = Either.right(componentsUtils.getResponseFormat(componentsUtils
-                .convertFromStorageResponse(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(findDefaultValue.right().value()))));
+                .convertFromStorageResponse(
+                    DaoStatusConverter.convertJanusGraphStatusToStorageStatus(findDefaultValue.right().value()))));
             return deleteEither;
 
         }
@@ -503,8 +748,31 @@
         return deleteEither;
     }
 
-    Either<InputDefinition, ResponseFormat>  prepareValueBeforeDeleteOfCapProp(InputDefinition inputForDelete,
-                                                                               PropertyDataDefinition inputValue) {
+    Either<OutputDefinition, ResponseFormat> prepareOutputValueBeforeDelete(final OutputDefinition outputForDelete,
+                                                                            final PropertyDataDefinition outputValue,
+                                                                            final List<String> pathOfComponentInstances) {
+
+        Either<OutputDefinition, ResponseFormat> deleteEither = prepareOutputValueBeforeDelete(outputForDelete,
+            outputValue);
+
+        final Either<String, JanusGraphOperationStatus> findDefaultValue = propertyOperation
+            .findDefaultValueFromSecondPosition(pathOfComponentInstances, outputValue.getUniqueId(),
+                (String) outputValue.getDefaultValue());
+        if (findDefaultValue.isRight()) {
+            deleteEither = Either.right(componentsUtils.getResponseFormat(componentsUtils
+                .convertFromStorageResponse(
+                    DaoStatusConverter.convertJanusGraphStatusToStorageStatus(findDefaultValue.right().value()))));
+            return deleteEither;
+
+        }
+        String defaultValue = findDefaultValue.left().value();
+        outputValue.setDefaultValue(defaultValue);
+        log.debug("The returned default value in ResourceInstanceProperty is {}", defaultValue);
+        return deleteEither;
+    }
+
+    Either<InputDefinition, ResponseFormat> prepareValueBeforeDeleteOfCapProp(InputDefinition inputForDelete,
+                                                                              PropertyDataDefinition inputValue) {
         Either<InputDefinition, ResponseFormat> deleteEither = prepareValueBeforeDelete(inputForDelete, inputValue);
         inputValue.setDefaultValue(inputForDelete.getDefaultValue());
         log.debug("The returned default value in ResourceInstanceProperty is {}", inputForDelete.getDefaultValue());
@@ -527,25 +795,58 @@
                 modifiedMappedToscaTemplate = (Map) result.left().value();
             } else {
                 log.warn("Map cleanup failed -> " + result.right().value()
-                        .toString());    //continue, don't break operation
+                    .toString());    //continue, don't break operation
             }
             value = gson.toJson(modifiedMappedToscaTemplate);
         }
         inputValue.setValue(value);
 
-
         List<GetInputValueDataDefinition> getInputsValues = inputValue.getGetInputValues();
         if (getInputsValues != null && !getInputsValues.isEmpty()) {
             Optional<GetInputValueDataDefinition> op =
-                    getInputsValues.stream().filter(gi -> gi.getInputId().equals(inputForDelete.getUniqueId()))
-                            .findAny();
+                getInputsValues.stream().filter(gi -> gi.getInputId().equals(inputForDelete.getUniqueId()))
+                    .findAny();
             op.ifPresent(getInputsValues::remove);
         }
         inputValue.setGetInputValues(getInputsValues);
         return deleteEither;
     }
 
-    private void resetInputName(Map<String, Object> lhm1, String inputName){
+    private Either<OutputDefinition, ResponseFormat> prepareOutputValueBeforeDelete(
+        final OutputDefinition outputForDelete,
+        final PropertyDataDefinition outputValue) {
+        final Either<OutputDefinition, ResponseFormat> deleteEither = Either.left(outputForDelete);
+        String value = outputValue.getValue();
+        final Map<String, Object> mappedToscaTemplate = (Map<String, Object>) new Yaml().load(value);
+
+        resetOutputName(mappedToscaTemplate, outputForDelete.getName());
+
+        value = "";
+        if (!mappedToscaTemplate.isEmpty()) {
+            final Either result = cleanNestedMap(mappedToscaTemplate, true);
+            Map modifiedMappedToscaTemplate = mappedToscaTemplate;
+            if (result.isLeft()) {
+                modifiedMappedToscaTemplate = (Map) result.left().value();
+            } else {
+                log.debug("Map cleanup failed -> " + result.right().value()
+                    .toString());
+            }
+            value = gson.toJson(modifiedMappedToscaTemplate);
+        }
+        outputValue.setValue(value);
+
+        final List<GetAttributeValueDataDefinition> getOutputsValues = outputValue.getGetAttributeValues();
+        if (getOutputsValues != null && !getOutputsValues.isEmpty()) {
+            Optional<GetAttributeValueDataDefinition> op =
+                getOutputsValues.stream().filter(gi -> gi.getOutputId().equals(outputForDelete.getUniqueId()))
+                    .findAny();
+            op.ifPresent(getOutputsValues::remove);
+        }
+        outputValue.setGetAttributeValues(getOutputsValues);
+        return deleteEither;
+    }
+
+    private void resetInputName(Map<String, Object> lhm1, String inputName) {
         for (Map.Entry<String, Object> entry : lhm1.entrySet()) {
             String key = entry.getKey();
             Object value = entry.getValue();
@@ -553,29 +854,44 @@
                 value = "";
                 lhm1.remove(key);
             } else if (value instanceof Map) {
-                Map<String, Object> subMap = (Map<String, Object>)value;
+                Map<String, Object> subMap = (Map<String, Object>) value;
                 resetInputName(subMap, inputName);
             } else if (value instanceof List && ((List) value).contains(inputName) && key.equals(GET_INPUT)) {
                 value = "";
                 lhm1.remove(key);
-            } else {
-                continue;
             }
 
         }
     }
 
-    private Either cleanNestedMap( Map mappedToscaTemplate , boolean deepClone  ){
-        if (MapUtils.isNotEmpty( mappedToscaTemplate ) ){
-            if (deepClone){
-                if (!(mappedToscaTemplate instanceof HashMap))
-                    return Either.right("expecting mappedToscaTemplate as HashMap ,recieved "+ mappedToscaTemplate.getClass().getSimpleName() );
-                else
-                    mappedToscaTemplate = (HashMap)((HashMap) mappedToscaTemplate).clone();
+    private void resetOutputName(final Map<String, Object> mappedToscaTemplate, final String outputName) {
+        for (Map.Entry<String, Object> entry : mappedToscaTemplate.entrySet()) {
+            final String key = entry.getKey();
+            final Object value = entry.getValue();
+            if (value instanceof String && ((String) value).equalsIgnoreCase(outputName) && key.equals(GET_ATTRIBUTE)) {
+                mappedToscaTemplate.remove(key);
+            } else if (value instanceof Map) {
+                Map<String, Object> subMap = (Map<String, Object>) value;
+                resetOutputName(subMap, outputName);
+            } else if (value instanceof List && ((List) value).contains(outputName) && key.equals(GET_ATTRIBUTE)) {
+                mappedToscaTemplate.remove(key);
             }
-            return Either.left( (Map) cleanEmptyNestedValuesInMap( mappedToscaTemplate , LOOP_PROTECTION_LEVEL ) );
         }
-        else {
+    }
+
+    private Either cleanNestedMap(Map mappedToscaTemplate, boolean deepClone) {
+        if (MapUtils.isNotEmpty(mappedToscaTemplate)) {
+            if (deepClone) {
+                if (!(mappedToscaTemplate instanceof HashMap)) {
+                    return Either.right(
+                        "expecting mappedToscaTemplate as HashMap ,recieved " + mappedToscaTemplate.getClass()
+                            .getSimpleName());
+                } else {
+                    mappedToscaTemplate = (HashMap) ((HashMap) mappedToscaTemplate).clone();
+                }
+            }
+            return Either.left((Map) cleanEmptyNestedValuesInMap(mappedToscaTemplate, LOOP_PROTECTION_LEVEL));
+        } else {
             log.debug("mappedToscaTemplate is empty ");
             return Either.right("mappedToscaTemplate is empty ");
         }
@@ -588,43 +904,46 @@
      *        @param  toscaElement - expected map of tosca values
      *        @return mutated @param toscaElement , where empty maps are deleted , return null for empty map.
      **/
-    private Object cleanEmptyNestedValuesInMap(Object toscaElement , short loopProtectionLevel ){
-        if (loopProtectionLevel<=0 || toscaElement==null || !(toscaElement instanceof  Map))
+    private Object cleanEmptyNestedValuesInMap(Object toscaElement, short loopProtectionLevel) {
+        if (loopProtectionLevel <= 0 || toscaElement == null || !(toscaElement instanceof Map)) {
             return toscaElement;
-        if ( MapUtils.isNotEmpty( (Map)toscaElement ) ) {
+        }
+        if (MapUtils.isNotEmpty((Map) toscaElement)) {
             Object ret;
-            Set<Object> keysToRemove = new HashSet<>();                                                                 // use different set to avoid ConcurrentModificationException
-            for( Object key : ((Map)toscaElement).keySet() ) {
+            Set<Object> keysToRemove = new HashSet<>(); // use different set to avoid ConcurrentModificationException
+            for (Object key : ((Map) toscaElement).keySet()) {
                 Object value = ((Map) toscaElement).get(key);
-                ret = cleanEmptyNestedValuesInMap(value , --loopProtectionLevel );
-                if ( ret == null )
+                ret = cleanEmptyNestedValuesInMap(value, --loopProtectionLevel);
+                if (ret == null) {
                     keysToRemove.add(key);
+                }
             }
             Collection set = ((Map) toscaElement).keySet();
-            if (CollectionUtils.isNotEmpty(set))
+            if (CollectionUtils.isNotEmpty(set)) {
                 set.removeAll(keysToRemove);
+            }
 
-            if ( isEmptyNestedMap(toscaElement) )
+            if (isEmptyNestedMap(toscaElement)) {
                 return null;
-        }
-        else
+            }
+        } else {
             return null;
+        }
         return toscaElement;
     }
 
     //@returns true iff map nested maps are all empty
     //ignores other collection objects
-    private boolean isEmptyNestedMap(Object element){
+    private boolean isEmptyNestedMap(Object element) {
         boolean isEmpty = true;
-        if (element != null){
-            if ( element instanceof Map ){
-                if (MapUtils.isEmpty((Map)element))
+        if (element != null) {
+            if (element instanceof Map) {
+                if (MapUtils.isEmpty((Map) element)) {
                     isEmpty = true;
-                else
-                {
-                    for( Object key : ((Map)(element)).keySet() ){
-                        Object value =  ((Map)(element)).get(key);
-                        isEmpty &= isEmptyNestedMap( value );
+                } else {
+                    for (Object key : ((Map) (element)).keySet()) {
+                        Object value = ((Map) (element)).get(key);
+                        isEmpty &= isEmptyNestedMap(value);
                     }
                 }
             } else {
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/GetOutputUtils.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/GetOutputUtils.java
new file mode 100644
index 0000000..85789d7
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/GetOutputUtils.java
@@ -0,0 +1,34 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.components.property;
+
+import org.openecomp.sdc.be.datatypes.elements.GetAttributeValueDataDefinition;
+
+public class GetOutputUtils {
+
+    private GetOutputUtils() {
+    }
+
+    public static boolean isGetOutputValueForOutput(final GetAttributeValueDataDefinition outputValueDataDefinition,
+                                                    final String outputId) {
+        return outputValueDataDefinition.getOutputId().equals(outputId) || (outputValueDataDefinition.getGetAttributeIndex() != null &&
+            outputValueDataDefinition.getGetAttributeIndex().getOutputId().equals(outputId));
+    }
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclarator.java
index b27cbee..5258ec3 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclarator.java
@@ -20,7 +20,16 @@
 
 package org.openecomp.sdc.be.components.property;
 
+import static java.util.stream.Collectors.toList;
+import static org.apache.commons.collections.CollectionUtils.isEmpty;
+import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
+
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Objects;
+import java.util.Optional;
 import org.apache.commons.collections.CollectionUtils;
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.impl.ComponentsUtils;
@@ -28,28 +37,20 @@
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.GroupOperation;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Objects;
-import java.util.Optional;
-
-import static java.util.stream.Collectors.toList;
-import static org.apache.commons.collections.CollectionUtils.isEmpty;
-import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
-
 @org.springframework.stereotype.Component
 public class GroupPropertyDeclarator extends DefaultPropertyDeclarator<GroupDefinition, PropertyDataDefinition> {
 
     private static final Logger log = Logger.getLogger(GroupPropertyDeclarator.class);
     private GroupOperation groupOperation;
 
-    public GroupPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation, GroupOperation groupOperation) {
+    public GroupPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation,
+                                   GroupOperation groupOperation) {
         super(componentsUtils, propertyOperation);
         this.groupOperation = groupOperation;
     }
@@ -60,8 +61,10 @@
     }
 
     @Override
-    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String groupId, List<PropertyDataDefinition> properties) {
-        log.debug("#updatePropertiesValues - updating group properties for group {} on component {}", groupId, component.getUniqueId());
+    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String groupId,
+                                                                    List<PropertyDataDefinition> properties) {
+        log.debug("#updatePropertiesValues - updating group properties for group {} on component {}", groupId,
+            component.getUniqueId());
         StorageOperationStatus updateStatus = groupOperation.updateGroupProperties(component, groupId, properties);
         return updateStatus == StorageOperationStatus.OK ? Either.left(updateStatus) : Either.right(updateStatus);
     }
@@ -75,7 +78,7 @@
     @Override
     public void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
         List<ComponentInstanceProperty> propertiesList = input.getProperties();
-        if(propertiesList == null) {
+        if (propertiesList == null) {
             propertiesList = new ArrayList<>(); // adding the property with the new value for UI
         }
         propertiesList.add(new ComponentInstanceProperty(declaredProp));
@@ -86,18 +89,19 @@
     @Override
     public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition inputForDelete) {
         return getGroupPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
-                .map(groupProperties -> unDeclareGroupProperties(component, inputForDelete, groupProperties))
-                .orElse(StorageOperationStatus.OK);
+            .map(groupProperties -> unDeclareGroupProperties(component, inputForDelete, groupProperties))
+            .orElse(StorageOperationStatus.OK);
     }
 
     @Override
     public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition inputForDelete) {
         return getGroupPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
-                .map(groupProperties -> unDeclareGroupProperties(component, inputForDelete, groupProperties))
-                .orElse(StorageOperationStatus.OK);
+            .map(groupProperties -> unDeclareGroupProperties(component, inputForDelete, groupProperties))
+            .orElse(StorageOperationStatus.OK);
     }
 
-    private StorageOperationStatus unDeclareGroupProperties(Component container, InputDefinition input, GroupProperties groupProperties) {
+    private StorageOperationStatus unDeclareGroupProperties(Component container, InputDefinition input,
+                                                            GroupProperties groupProperties) {
         String groupId = groupProperties.getGroupId();
         List<PropertyDataDefinition> propsDeclaredAsInput = groupProperties.getProperties();
         propsDeclaredAsInput.forEach(groupProp -> prepareValueBeforeDelete(input, groupProp, Collections.emptyList()));
@@ -109,19 +113,19 @@
             return Optional.empty();
         }
         return container.getGroups()
-                .stream()
-                .filter(group -> Objects.nonNull(group.getProperties()))
-                .map(grp -> getGroupPropertiesDeclaredAsInput(grp, inputId))
-                .filter(GroupProperties::isNotEmpty)
-                .findFirst();
+            .stream()
+            .filter(group -> Objects.nonNull(group.getProperties()))
+            .map(grp -> getGroupPropertiesDeclaredAsInput(grp, inputId))
+            .filter(GroupProperties::isNotEmpty)
+            .findFirst();
     }
 
 
     private GroupProperties getGroupPropertiesDeclaredAsInput(GroupDefinition group, String inputId) {
         List<PropertyDataDefinition> propertyDataDefinitions = group.getProperties()
-                .stream()
-                .filter(prop -> isPropertyDeclaredAsInputByInputId(prop, inputId))
-                .collect(toList());
+            .stream()
+            .filter(prop -> isPropertyDeclaredAsInputByInputId(prop, inputId))
+            .collect(toList());
         return new GroupProperties(group.getUniqueId(), propertyDataDefinitions);
     }
 
@@ -130,18 +134,19 @@
             return false;
         }
         return property.getGetInputValues().stream()
-                .filter(Objects::nonNull)
-                .anyMatch(getInputVal -> isGetInputValueForInput(getInputVal, inputId));
+            .filter(Objects::nonNull)
+            .anyMatch(getInputVal -> isGetInputValueForInput(getInputVal, inputId));
     }
 
 
     private class GroupProperties {
+
         private String groupId;
         private List<PropertyDataDefinition> properties;
 
         GroupProperties(String groupId, List<PropertyDataDefinition> properties) {
             this.groupId = groupId;
-            this.properties = (properties == null)? null :new ArrayList<>(properties);
+            this.properties = (properties == null) ? null : new ArrayList<>(properties);
         }
 
         String getGroupId() {
@@ -156,4 +161,11 @@
             return CollectionUtils.isNotEmpty(properties);
         }
     }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclarator.java
index eb7dd68..130fa31 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclarator.java
@@ -19,27 +19,27 @@
  */
 package org.openecomp.sdc.be.components.property;
 
-import fj.data.Either;
-import org.apache.commons.collections.CollectionUtils;
-import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
-import org.openecomp.sdc.be.impl.ComponentsUtils;
-import org.openecomp.sdc.be.model.Component;
-import org.openecomp.sdc.be.model.ComponentInstanceProperty;
-import org.openecomp.sdc.be.model.InputDefinition;
-import org.openecomp.sdc.be.model.PolicyDefinition;
-import org.openecomp.sdc.be.model.jsonjanusgraph.operations.PolicyOperation;
-import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
-import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
-import org.openecomp.sdc.common.log.wrappers.Logger;
+import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
 
+import fj.data.Either;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
-
-import static org.openecomp.sdc.be.components.property.GetInputUtils.isGetInputValueForInput;
+import org.apache.commons.collections.CollectionUtils;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.model.PolicyDefinition;
+import org.openecomp.sdc.be.model.jsonjanusgraph.operations.PolicyOperation;
+import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
+import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
+import org.openecomp.sdc.common.log.wrappers.Logger;
 
 @org.springframework.stereotype.Component
 public class PolicyPropertyDeclarator extends DefaultPropertyDeclarator<PolicyDefinition, PropertyDataDefinition> {
@@ -47,7 +47,8 @@
     private static final Logger log = Logger.getLogger(PolicyPropertyDeclarator.class);
     private PolicyOperation policyOperation;
 
-    public PolicyPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation, PolicyOperation policyOperation) {
+    public PolicyPropertyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation,
+                                    PolicyOperation policyOperation) {
         super(componentsUtils, propertyOperation);
         this.policyOperation = policyOperation;
     }
@@ -58,8 +59,10 @@
     }
 
     @Override
-    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String policyId, List<PropertyDataDefinition> properties) {
-        log.debug("#updatePropertiesValues - updating policies properties for policy {} on component {}", policyId, component.getUniqueId());
+    public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String policyId,
+                                                                    List<PropertyDataDefinition> properties) {
+        log.debug("#updatePropertiesValues - updating policies properties for policy {} on component {}", policyId,
+            component.getUniqueId());
         StorageOperationStatus updateStatus = policyOperation.updatePolicyProperties(component, policyId, properties);
         return updateStatus == StorageOperationStatus.OK ? Either.left(updateStatus) : Either.right(updateStatus);
     }
@@ -73,7 +76,7 @@
     @Override
     public void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
         List<ComponentInstanceProperty> propertiesList = input.getProperties();
-        if(propertiesList == null) {
+        if (propertiesList == null) {
             propertiesList = new ArrayList<>(); // adding the property with the new value for UI
         }
         propertiesList.add(new ComponentInstanceProperty(declaredProp));
@@ -84,21 +87,23 @@
     @Override
     public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition inputForDelete) {
         return getPolicyPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
-                .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
-                .orElse(StorageOperationStatus.OK);
+            .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
+            .orElse(StorageOperationStatus.OK);
     }
 
     @Override
     public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition inputForDelete) {
         return getPolicyPropertiesDeclaredAsInput(component, inputForDelete.getUniqueId())
-                .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
-                .orElse(StorageOperationStatus.OK);
+            .map(policyProperties -> unDeclarePolicyProperties(component, inputForDelete, policyProperties))
+            .orElse(StorageOperationStatus.OK);
     }
 
-    private StorageOperationStatus unDeclarePolicyProperties(Component container, InputDefinition input, PolicyProperties policyProperties) {
+    private StorageOperationStatus unDeclarePolicyProperties(Component container, InputDefinition input,
+                                                             PolicyProperties policyProperties) {
         String policyId = policyProperties.getPolicyId();
         List<PropertyDataDefinition> propsDeclaredAsInput = policyProperties.getProperties();
-        propsDeclaredAsInput.forEach(policyProp -> prepareValueBeforeDelete(input, policyProp, Collections.emptyList()));
+        propsDeclaredAsInput
+            .forEach(policyProp -> prepareValueBeforeDelete(input, policyProp, Collections.emptyList()));
         return policyOperation.updatePolicyProperties(container, policyId, propsDeclaredAsInput);
     }
 
@@ -107,12 +112,12 @@
             return Optional.empty();
         }
         return container.getPolicies()
-                .values()
-                .stream()
-                .filter(policy -> Objects.nonNull(policy.getProperties()))
-                .map(policy -> getPolicyPropertiesDeclaredAsInput(policy, inputId))
-                .filter(PolicyProperties::isNotEmpty)
-                .findFirst();
+            .values()
+            .stream()
+            .filter(policy -> Objects.nonNull(policy.getProperties()))
+            .map(policy -> getPolicyPropertiesDeclaredAsInput(policy, inputId))
+            .filter(PolicyProperties::isNotEmpty)
+            .findFirst();
     }
 
     private boolean isPropertyDeclaredAsInputByInputId(PropertyDataDefinition property, String inputId) {
@@ -120,26 +125,27 @@
             return false;
         }
         return property.getGetInputValues().stream()
-                .filter(Objects::nonNull)
-                .anyMatch(getInputVal -> isGetInputValueForInput(getInputVal, inputId));
+            .filter(Objects::nonNull)
+            .anyMatch(getInputVal -> isGetInputValueForInput(getInputVal, inputId));
     }
 
     private PolicyProperties getPolicyPropertiesDeclaredAsInput(PolicyDefinition policy, String inputId) {
         List<PropertyDataDefinition> collect = policy.getProperties()
-                .stream()
-                .filter(prop -> isPropertyDeclaredAsInputByInputId(prop, inputId))
-                .collect(Collectors.toList());
+            .stream()
+            .filter(prop -> isPropertyDeclaredAsInputByInputId(prop, inputId))
+            .collect(Collectors.toList());
         return new PolicyProperties(policy.getUniqueId(), collect);
 
     }
 
     private class PolicyProperties {
+
         private String policyId;
         private List<PropertyDataDefinition> properties;
 
         PolicyProperties(String policyId, List<PropertyDataDefinition> properties) {
             this.policyId = policyId;
-            this.properties = (properties == null)? null : new ArrayList<>(properties);
+            this.properties = (properties == null) ? null : new ArrayList<>(properties);
         }
 
         String getPolicyId() {
@@ -154,4 +160,11 @@
             return CollectionUtils.isNotEmpty(properties);
         }
     }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarationOrchestrator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarationOrchestrator.java
index c60c8f2..ff35bf1 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarationOrchestrator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarationOrchestrator.java
@@ -20,7 +20,14 @@
 
 package org.openecomp.sdc.be.components.property;
 
+import static org.apache.commons.collections.MapUtils.isNotEmpty;
+
 import fj.data.Either;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.openecomp.sdc.be.components.property.propertytopolicydeclarators.ComponentInstancePropertyToPolicyDeclarator;
@@ -28,48 +35,54 @@
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstInputsMap;
+import org.openecomp.sdc.be.model.ComponentInstOutputsMap;
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
+import org.openecomp.sdc.be.model.ComponentInstancePropOutput;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Collectors;
-
-import static org.apache.commons.collections.MapUtils.isNotEmpty;
-
 @org.springframework.stereotype.Component
 public class PropertyDeclarationOrchestrator {
 
     private static final Logger log = Logger.getLogger(PropertyDeclarationOrchestrator.class);
     private ComponentInstanceInputPropertyDeclarator componentInstanceInputPropertyDeclarator;
+    private ComponentInstanceOutputPropertyDeclarator componentInstanceOutputPropertyDeclarator;
     private ComponentInstancePropertyDeclarator componentInstancePropertyDeclarator;
     private PolicyPropertyDeclarator policyPropertyDeclarator;
     private GroupPropertyDeclarator groupPropertyDeclarator;
     private ComponentPropertyDeclarator servicePropertyDeclarator;
     private List<PropertyDeclarator> propertyDeclaratorsToInput;
+    private List<PropertyDeclarator> propertyDeclaratorsToOutput;
     private List<PropertyDeclarator> propertyDeclaratorsToPolicy;
     private ComponentPropertyToPolicyDeclarator componentPropertyToPolicyDeclarator;
     private ComponentInstancePropertyToPolicyDeclarator componentInstancePropertyToPolicyDeclarator;
 
-    public PropertyDeclarationOrchestrator(ComponentInstanceInputPropertyDeclarator componentInstanceInputPropertyDeclarator,
-            ComponentInstancePropertyDeclarator componentInstancePropertyDeclarator, PolicyPropertyDeclarator policyPropertyDeclarator,
-            GroupPropertyDeclarator groupPropertyDeclarator, ComponentPropertyDeclarator servicePropertyDeclarator,
-            ComponentPropertyToPolicyDeclarator componentPropertyToPolicyDeclarator,
-            ComponentInstancePropertyToPolicyDeclarator componentInstancePropertyToPolicyDeclarator) {
+    public PropertyDeclarationOrchestrator(
+        ComponentInstanceInputPropertyDeclarator componentInstanceInputPropertyDeclarator,
+        ComponentInstanceOutputPropertyDeclarator componentInstanceOutputPropertyDeclarator,
+        ComponentInstancePropertyDeclarator componentInstancePropertyDeclarator,
+        PolicyPropertyDeclarator policyPropertyDeclarator,
+        GroupPropertyDeclarator groupPropertyDeclarator, ComponentPropertyDeclarator servicePropertyDeclarator,
+        ComponentPropertyToPolicyDeclarator componentPropertyToPolicyDeclarator,
+        ComponentInstancePropertyToPolicyDeclarator componentInstancePropertyToPolicyDeclarator) {
         this.componentInstanceInputPropertyDeclarator = componentInstanceInputPropertyDeclarator;
+        this.componentInstanceOutputPropertyDeclarator = componentInstanceOutputPropertyDeclarator;
         this.componentInstancePropertyDeclarator = componentInstancePropertyDeclarator;
         this.policyPropertyDeclarator = policyPropertyDeclarator;
         this.groupPropertyDeclarator = groupPropertyDeclarator;
         this.servicePropertyDeclarator = servicePropertyDeclarator;
         this.componentPropertyToPolicyDeclarator = componentPropertyToPolicyDeclarator;
         this.componentInstancePropertyToPolicyDeclarator = componentInstancePropertyToPolicyDeclarator;
-        propertyDeclaratorsToInput = Arrays.asList(componentInstanceInputPropertyDeclarator, componentInstancePropertyDeclarator, policyPropertyDeclarator, groupPropertyDeclarator, servicePropertyDeclarator);
-        propertyDeclaratorsToPolicy = Arrays.asList(componentPropertyToPolicyDeclarator, componentInstancePropertyToPolicyDeclarator);
+        propertyDeclaratorsToInput = Arrays
+            .asList(componentInstanceInputPropertyDeclarator, componentInstancePropertyDeclarator,
+                policyPropertyDeclarator, groupPropertyDeclarator, servicePropertyDeclarator);
+        propertyDeclaratorsToOutput = Arrays
+            .asList(componentInstanceOutputPropertyDeclarator);
+        propertyDeclaratorsToPolicy = Arrays
+            .asList(componentPropertyToPolicyDeclarator, componentInstancePropertyToPolicyDeclarator);
     }
 
     public Either<List<InputDefinition>, StorageOperationStatus> declarePropertiesToInputs(Component component, ComponentInstInputsMap componentInstInputsMap) {
@@ -79,6 +92,14 @@
         return propertyDeclarator.declarePropertiesAsInputs(component, propsToDeclare.getLeft(), propsToDeclare.getRight());
     }
 
+    public Either<List<OutputDefinition>, StorageOperationStatus> declarePropertiesToOutputs(final Component component,
+                                                                                             final ComponentInstOutputsMap componentInstOutputsMap) {
+        updateOutputPropertiesConstraints(component, componentInstOutputsMap);
+        final PropertyDeclarator propertyDeclarator = getOutputPropertyDeclarator(componentInstOutputsMap);
+        final Pair<String, List<ComponentInstancePropOutput>> propsToDeclare = componentInstOutputsMap.resolvePropertiesToDeclare();
+        return propertyDeclarator.declarePropertiesAsOutputs(component, propsToDeclare.getLeft(), propsToDeclare.getRight());
+    }
+
     private void updatePropertiesConstraints(Component component, ComponentInstInputsMap componentInstInputsMap) {
         componentInstInputsMap.getComponentInstanceProperties().forEach((k, v) -> updatePropsConstraints(component.safeGetComponentInstancesProperties(), k, v));
         componentInstInputsMap.getComponentInstanceInputsMap().forEach((k, v) -> updatePropsConstraints(component.safeGetComponentInstancesInputs(), k, v));
@@ -86,6 +107,12 @@
         componentInstInputsMap.getPolicyProperties().forEach((k, v) -> updatePropsConstraints(component.safeGetGroupsProperties(), k, v));
     }
 
+    private void updateOutputPropertiesConstraints(final Component component,
+                                                   final ComponentInstOutputsMap componentInstOutputsMap) {
+        componentInstOutputsMap.getComponentInstanceProperties().forEach((k, v) -> updateOutputPropsConstraints(component.safeGetComponentInstancesProperties(), k, v));
+        componentInstOutputsMap.getComponentInstanceOutputsMap().forEach((k, v) -> updateOutputPropsConstraints(component.safeGetComponentInstancesOutputs(), k, v));
+    }
+
     public Either<List<PolicyDefinition>, StorageOperationStatus> declarePropertiesToPolicies(Component component, ComponentInstInputsMap componentInstInputsMap) {
         PropertyDeclarator propertyDeclarator = getPropertyDeclarator(componentInstInputsMap);
         Pair<String, List<ComponentInstancePropInput>> propsToDeclare = componentInstInputsMap.resolvePropertiesToDeclare();
@@ -116,6 +143,24 @@
         }
     }
 
+    private <T extends PropertyDataDefinition> void updateOutputPropsConstraints(final Map<String, List<T>> instancesProperties ,
+                                                                                 final String ownerId,
+                                                                                 final List<ComponentInstancePropOutput> outputs) {
+        final Optional<List<T>> propertiesOpt = instancesProperties.entrySet()
+            .stream()
+            .filter(e -> e.getKey().equals(ownerId))
+            .map(Map.Entry::getValue)
+            .findFirst();
+        if(propertiesOpt.isPresent()){
+            final Map<String, PropertyDataDefinition> instProps = propertiesOpt.get()
+                .stream()
+                .collect(Collectors.toMap(PropertyDataDefinition::getName, p->p));
+            outputs.stream()
+                .filter(i->instProps.containsKey(i.getName()))
+                .forEach(i->updatePropConstraints(i, instProps.get(i.getName())));
+        }
+    }
+
     private void updatePropConstraints(PropertyDataDefinition input, PropertyDataDefinition property) {
         if(CollectionUtils.isNotEmpty(property.getPropertyConstraints())){
             input.setPropertyConstraints(property.getPropertyConstraints());
@@ -137,6 +182,23 @@
         return StorageOperationStatus.OK;
 
     }
+
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputToDelete) {
+        log.debug("#unDeclarePropertiesAsOutputs - removing output declaration for output {} on component {}", outputToDelete
+            .getName(), component.getUniqueId());
+        for (final PropertyDeclarator propertyDeclarator : propertyDeclaratorsToOutput) {
+            final StorageOperationStatus storageOperationStatus = propertyDeclarator.unDeclarePropertiesAsOutputs(component,
+                outputToDelete);
+            if (StorageOperationStatus.OK != storageOperationStatus) {
+                log.debug("#unDeclarePropertiesAsOutputs - failed to remove output declaration for output {} on component {}. reason {}", outputToDelete
+                    .getName(), component.getUniqueId(), storageOperationStatus);
+                return storageOperationStatus;
+            }
+        }
+        return StorageOperationStatus.OK;
+
+    }
     /**
      * Un declare properties declared as list type input
      *
@@ -168,6 +230,17 @@
         return propsToDeclare.getLeft();
     }
 
+    /**
+     * Get properties owner id
+     *
+     * @param componentInstOutputsMap
+     * @return
+     */
+    public String getOutputPropOwnerId(final ComponentInstOutputsMap componentInstOutputsMap) {
+        return componentInstOutputsMap.resolvePropertiesToDeclare().getLeft();
+    }
+
+
     public StorageOperationStatus unDeclarePropertiesAsPolicies(Component component, PolicyDefinition policyToDelete) {
         log.debug("#unDeclarePropertiesAsInputs - removing policy declaration for input {} on component {}", policyToDelete
                                                                                                                      .getName(), component.getUniqueId());
@@ -211,4 +284,14 @@
 
     }
 
+    private PropertyDeclarator getOutputPropertyDeclarator(final ComponentInstOutputsMap componentInstOutputsMap) {
+        if (isNotEmpty(componentInstOutputsMap.getComponentInstanceOutputsMap())) {
+            return componentInstanceOutputPropertyDeclarator;
+        }
+        if (isNotEmpty(componentInstOutputsMap.getComponentInstanceProperties())) {
+            return componentInstancePropertyDeclarator;
+        }
+        throw new IllegalStateException("there are no properties selected for declaration");
+    }
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarator.java
index e067b0c..0072dc3 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/PropertyDeclarator.java
@@ -21,14 +21,15 @@
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
+import java.util.List;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
+import org.openecomp.sdc.be.model.ComponentInstancePropOutput;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 
-import java.util.List;
-
 public interface PropertyDeclarator {
 
     /**
@@ -41,6 +42,15 @@
     Either<List<InputDefinition>, StorageOperationStatus> declarePropertiesAsInputs(Component component, String propertiesOwnerId, List<ComponentInstancePropInput> propsToDeclare);
 
     /**
+     * creates a list of outputs from the given list of properties and updates the properties accordingly
+     * @param component the container
+     * @param propertiesOwnerId the id of the owner of the properties to declare (e.g ComponentInstance, Policy, Group etc)
+     * @param propsToDeclare the list of properties that are being declared as outputs
+     * @return the list of outputs that were created from the given properties
+     */
+    Either<List<OutputDefinition>, StorageOperationStatus> declarePropertiesAsOutputs(Component component, String propertiesOwnerId, List<ComponentInstancePropOutput> propsToDeclare);
+
+    /**
      * returns the values of declared properties to each original state before it was declared as an input.
      * this function is to be called when an input, that was created by declaring a property, is deleted.
      * @param component the container of the input to be deleted
@@ -49,6 +59,14 @@
     StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition input);
 
     /**
+     * returns the values of declared properties to each original state before it was declared as an output.
+     * this function is to be called when an output, that was created by declaring a property, is deleted.
+     * @param component the container of the output to be deleted
+     * @param output the output to be deleted
+     */
+    StorageOperationStatus unDeclarePropertiesAsOutputs(Component component, OutputDefinition output);
+
+    /**
      * creates a list of policies from the given list of properties and updates the properties accordingly
      * @param component the container
      * @param propertiesOwnerId the id of the owner of the properties to declare (e.g ComponentInstance, Policy, Group etc)
@@ -82,4 +100,5 @@
      * @param input the input to be deleted
      */
     StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition input);
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentInstancePropertyToPolicyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentInstancePropertyToPolicyDeclarator.java
index f8e0ea0..cd00e40 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentInstancePropertyToPolicyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentInstancePropertyToPolicyDeclarator.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,6 +21,10 @@
 package org.openecomp.sdc.be.components.property.propertytopolicydeclarators;
 
 import fj.data.Either;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Optional;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
 import org.openecomp.sdc.be.components.property.DefaultPropertyDeclarator;
@@ -30,27 +34,25 @@
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
 
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Optional;
-
 @org.springframework.stereotype.Component
 public class ComponentInstancePropertyToPolicyDeclarator extends
-        DefaultPropertyDeclarator<ComponentInstance, ComponentInstanceProperty> {
+    DefaultPropertyDeclarator<ComponentInstance, ComponentInstanceProperty> {
 
     private ToscaOperationFacade toscaOperationFacade;
     PropertyBusinessLogic propertyBl;
     private ComponentInstanceBusinessLogic componentInstanceBl;
 
     public ComponentInstancePropertyToPolicyDeclarator(ComponentsUtils componentsUtils,
-            PropertyOperation propertyOperation, ToscaOperationFacade toscaOperationFacade,
-            PropertyBusinessLogic propertyBl, ComponentInstanceBusinessLogic componentInstanceBl) {
+                                                       PropertyOperation propertyOperation,
+                                                       ToscaOperationFacade toscaOperationFacade,
+                                                       PropertyBusinessLogic propertyBl,
+                                                       ComponentInstanceBusinessLogic componentInstanceBl) {
         super(componentsUtils, propertyOperation);
         this.toscaOperationFacade = toscaOperationFacade;
         this.propertyBl = propertyBl;
@@ -64,9 +66,9 @@
 
     @Override
     protected Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String componentInstanceId,
-            List<ComponentInstanceProperty> properties) {
+                                                                       List<ComponentInstanceProperty> properties) {
         Map<String, List<ComponentInstanceProperty>>
-                instProperties = Collections.singletonMap(componentInstanceId, properties);
+            instProperties = Collections.singletonMap(componentInstanceId, properties);
         return toscaOperationFacade.addComponentInstancePropertiesToComponent(component, instProperties);
     }
 
@@ -77,7 +79,6 @@
 
     @Override
     protected void addPropertiesListToInput(ComponentInstanceProperty declaredProp, InputDefinition input) {
-        return;
     }
 
     @Override
@@ -94,14 +95,20 @@
     public StorageOperationStatus unDeclarePropertiesAsPolicies(Component component, PolicyDefinition policy) {
 
         Optional<ComponentInstanceProperty> propertyCandidate =
-                componentInstanceBl.getComponentInstancePropertyByPolicyId(component, policy);
+            componentInstanceBl.getComponentInstancePropertyByPolicyId(component, policy);
 
-
-        if(propertyCandidate.isPresent()) {
+        if (propertyCandidate.isPresent()) {
             return toscaOperationFacade
-                           .updateComponentInstanceProperty(component, policy.getInstanceUniqueId(), propertyCandidate.get());
+                .updateComponentInstanceProperty(component, policy.getInstanceUniqueId(), propertyCandidate.get());
         }
 
         return StorageOperationStatus.OK;
     }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclarator.java b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclarator.java
index 9ac38c3..a6fd9f4 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclarator.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclarator.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -21,6 +21,8 @@
 package org.openecomp.sdc.be.components.property.propertytopolicydeclarators;
 
 import fj.data.Either;
+import java.util.List;
+import java.util.Optional;
 import org.apache.commons.collections4.CollectionUtils;
 import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
 import org.openecomp.sdc.be.components.property.DefaultPropertyDeclarator;
@@ -29,15 +31,13 @@
 import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.jsonjanusgraph.operations.ToscaOperationFacade;
 import org.openecomp.sdc.be.model.operations.api.StorageOperationStatus;
 import org.openecomp.sdc.be.model.operations.impl.PropertyOperation;
 
-import java.util.List;
-import java.util.Optional;
-
 @org.springframework.stereotype.Component
 public class ComponentPropertyToPolicyDeclarator extends DefaultPropertyDeclarator<Component, PropertyDataDefinition> {
 
@@ -46,7 +46,8 @@
 
 
     public ComponentPropertyToPolicyDeclarator(ComponentsUtils componentsUtils, PropertyOperation propertyOperation,
-            ToscaOperationFacade toscaOperationFacade, PropertyBusinessLogic propertyBusinessLogic) {
+                                               ToscaOperationFacade toscaOperationFacade,
+                                               PropertyBusinessLogic propertyBusinessLogic) {
         super(componentsUtils, propertyOperation);
         this.toscaOperationFacade = toscaOperationFacade;
         this.propertyBL = propertyBusinessLogic;
@@ -59,13 +60,13 @@
 
     @Override
     public Either<?, StorageOperationStatus> updatePropertiesValues(Component component, String policyId,
-            List<PropertyDataDefinition> properties) {
-        if(CollectionUtils.isNotEmpty(properties)) {
-            for(PropertyDataDefinition property : properties) {
+                                                                    List<PropertyDataDefinition> properties) {
+        if (CollectionUtils.isNotEmpty(properties)) {
+            for (PropertyDataDefinition property : properties) {
                 Either<PropertyDefinition, StorageOperationStatus>
-                        storageStatus = toscaOperationFacade
-                                                .updatePropertyOfComponent(component, new PropertyDefinition(property));
-                if(storageStatus.isRight()) {
+                    storageStatus = toscaOperationFacade
+                    .updatePropertyOfComponent(component, new PropertyDefinition(property));
+                if (storageStatus.isRight()) {
                     return Either.right(storageStatus.right().value());
                 }
             }
@@ -80,40 +81,24 @@
     }
 
     @Override
-    public StorageOperationStatus unDeclarePropertiesAsInputs(Component component, InputDefinition input) {
-        // no need for implementation since we are in a policy scenario
-        return StorageOperationStatus.OK;
-    }
-
-    @Override
-    public StorageOperationStatus unDeclarePropertiesAsListInputs(Component component, InputDefinition input) {
-        // no need for implementation since we are in a policy scenario
-        return StorageOperationStatus.OK;
-    }
-
-    @Override
-    public void addPropertiesListToInput(PropertyDataDefinition declaredProp, InputDefinition input) {
-        // no need for implementation since we are in a policy scenario
-    }
-
-    @Override
     public StorageOperationStatus unDeclarePropertiesAsPolicies(Component component, PolicyDefinition policy) {
         Optional<PropertyDefinition> propertyToUpdateCandidate =
-                getDeclaredPropertyByPolicyId(component, policy.getUniqueId());
+            getDeclaredPropertyByPolicyId(component, policy.getUniqueId());
 
-        if(propertyToUpdateCandidate.isPresent()) {
+        if (propertyToUpdateCandidate.isPresent()) {
             return unDeclarePolicy(component, propertyToUpdateCandidate.get(), policy);
         }
 
         return StorageOperationStatus.OK;
     }
 
-    private StorageOperationStatus unDeclarePolicy(Component component, PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
+    private StorageOperationStatus unDeclarePolicy(Component component, PropertyDefinition propertyToUpdate,
+                                                   PolicyDefinition policy) {
         updatePropertyAfterUndeclaration(propertyToUpdate, policy);
 
         Either<PropertyDefinition, StorageOperationStatus> status = toscaOperationFacade
-                                                                            .updatePropertyOfComponent(component, propertyToUpdate);
-        if(status.isRight()) {
+            .updatePropertyOfComponent(component, propertyToUpdate);
+        if (status.isRight()) {
             return status.right().value();
         }
 
@@ -123,9 +108,9 @@
     private void updatePropertyAfterUndeclaration(PropertyDefinition propertyToUpdate, PolicyDefinition policy) {
         List<GetPolicyValueDataDefinition> getPolicyValues = propertyToUpdate.getGetPolicyValues();
         Optional<GetPolicyValueDataDefinition> getPolicyCandidateToRemove = getPolicyValues.stream()
-                                                                                    .filter(getPolicyValue -> getPolicyValue.getPolicyId()
-                                                                                                                      .equals(policy.getUniqueId()))
-                                                                                    .findAny();
+            .filter(getPolicyValue -> getPolicyValue.getPolicyId()
+                .equals(policy.getUniqueId()))
+            .findAny();
 
         getPolicyCandidateToRemove.ifPresent(getPolicyValue -> {
             getPolicyValues.remove(getPolicyValue);
@@ -134,24 +119,23 @@
     }
 
     private Optional<PropertyDefinition> getDeclaredPropertyByPolicyId(Component component,
-            String policyId) {
+                                                                       String policyId) {
         List<PropertyDefinition> properties = component.getProperties();
 
-        if(CollectionUtils.isEmpty(properties)) {
+        if (CollectionUtils.isEmpty(properties)) {
             return Optional.empty();
         }
 
-        for(PropertyDefinition propertyDefinition : properties) {
+        for (PropertyDefinition propertyDefinition : properties) {
             List<GetPolicyValueDataDefinition> getPolicyValues = propertyDefinition.getGetPolicyValues();
-            if(CollectionUtils.isEmpty(getPolicyValues)) {
+            if (CollectionUtils.isEmpty(getPolicyValues)) {
                 continue;
             }
 
-
             Optional<GetPolicyValueDataDefinition> getPolicyCandidate =
-                    getPolicyValues.stream().filter(getPolicy -> getPolicy.getPolicyId().equals(policyId)).findAny();
+                getPolicyValues.stream().filter(getPolicy -> getPolicy.getPolicyId().equals(policyId)).findAny();
 
-            if(getPolicyCandidate.isPresent()) {
+            if (getPolicyCandidate.isPresent()) {
                 propertyDefinition.setValue(getPolicyCandidate.get().getOrigPropertyValue());
                 return Optional.of(propertyDefinition);
             }
@@ -160,4 +144,30 @@
         return Optional.empty();
     }
 
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsInputs(final Component component,
+                                                              final InputDefinition inputDefinition) {
+        // no need for implementation since we are in a policy scenario
+        return StorageOperationStatus.OK;
+    }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsListInputs(final Component component,
+                                                                  final InputDefinition inputDefinition) {
+        // no need for implementation since we are in a policy scenario
+        return StorageOperationStatus.OK;
+    }
+
+    @Override
+    public void addPropertiesListToInput(final PropertyDataDefinition declaredProp,
+                                         final InputDefinition inputDefinition) {
+        // no need for implementation since we are in a policy scenario
+    }
+
+    @Override
+    public StorageOperationStatus unDeclarePropertiesAsOutputs(final Component component,
+                                                               final OutputDefinition outputDefinition) {
+        throw new UnsupportedOperationException();
+    }
+
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java
index 4899379..d0198b8 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/datamodel/utils/UiComponentDataConverter.java
@@ -84,6 +84,9 @@
             case INPUTS:
                 setInputs(dataTransfer, component);
                 break;
+            case OUTPUTS:
+                setOutputs(dataTransfer, component);
+                break;
             case COMPONENT_INSTANCE_RELATION:
                 setComponentInstanceRelation(dataTransfer, component);
                 break;
@@ -126,6 +129,9 @@
             case COMPONENT_INSTANCE_INPUTS:
                 setComponentInstanceInputs(dataTransfer, component);
                 break;
+            case COMPONENT_INSTANCE_OUTPUTS:
+                setComponentInstanceOutputs(dataTransfer, component);
+                break;
             case NODE_FILTER:
                 setNodeFilter(dataTransfer, component);
                 break;
@@ -217,6 +223,22 @@
         }
     }
 
+    private void setOutputs(final UiComponentDataTransfer dataTransfer, final Component component) {
+        if (component.getOutputs() == null) {
+            dataTransfer.setOutputs(new ArrayList<>());
+        } else {
+            dataTransfer.setOutputs(component.getOutputs());
+        }
+    }
+
+    private void setComponentInstanceOutputs(final UiComponentDataTransfer dataTransfer, final Component component) {
+        if (component.getComponentInstancesOutputs() == null) {
+            dataTransfer.setComponentInstancesOutputs(new HashMap<>());
+        } else {
+            dataTransfer.setComponentInstancesOutputs(component.getComponentInstancesOutputs());
+        }
+    }
+
     private void setComponentInstanceAttributes(UiComponentDataTransfer dataTransfer, Component component) {
         if (component.getComponentInstancesAttributes() == null) {
             dataTransfer.setComponentInstancesAttributes(new HashMap<>());
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/BeGenericServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/BeGenericServlet.java
index b497b70..d463cba 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/BeGenericServlet.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/BeGenericServlet.java
@@ -31,6 +31,21 @@
 import io.swagger.v3.oas.annotations.OpenAPIDefinition;
 import io.swagger.v3.oas.annotations.info.Info;
 import io.swagger.v3.oas.annotations.servers.Server;
+import java.io.IOException;
+import java.lang.reflect.Type;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Supplier;
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.Response;
+import javax.ws.rs.core.Response.ResponseBuilder;
 import org.json.simple.JSONArray;
 import org.json.simple.JSONObject;
 import org.json.simple.parser.JSONParser;
@@ -45,6 +60,7 @@
 import org.openecomp.sdc.be.components.impl.GroupBusinessLogic;
 import org.openecomp.sdc.be.components.impl.InputsBusinessLogic;
 import org.openecomp.sdc.be.components.impl.InterfaceOperationBusinessLogic;
+import org.openecomp.sdc.be.components.impl.OutputsBusinessLogic;
 import org.openecomp.sdc.be.components.impl.PolicyBusinessLogic;
 import org.openecomp.sdc.be.components.impl.ProductBusinessLogic;
 import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
@@ -66,6 +82,7 @@
 import org.openecomp.sdc.be.impl.ComponentsUtils;
 import org.openecomp.sdc.be.impl.WebAppContextWrapper;
 import org.openecomp.sdc.be.model.ComponentInstInputsMap;
+import org.openecomp.sdc.be.model.ComponentInstOutputsMap;
 import org.openecomp.sdc.be.model.PropertyConstraint;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.User;
@@ -80,29 +97,13 @@
 import org.openecomp.sdc.exception.ResponseFormat;
 import org.springframework.web.context.WebApplicationContext;
 
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpServletRequest;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.Response;
-import javax.ws.rs.core.Response.ResponseBuilder;
-import java.io.IOException;
-import java.lang.reflect.Type;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Set;
-import java.util.function.Supplier;
-
 @OpenAPIDefinition(info = @Info(title = "SDC API", description = "SDC External, Distribution and Internal APIs"),
-        servers = {@Server(url = "/sdc", description = "SDC External and Distribution APIs"),
-                @Server(url = "/sdc2/rest", description = "SDC Internal APIs")})
+    servers = {@Server(url = "/sdc", description = "SDC External and Distribution APIs"),
+        @Server(url = "/sdc2/rest", description = "SDC Internal APIs")})
 public class BeGenericServlet extends BasicServlet {
 
     public BeGenericServlet(UserBusinessLogic userAdminManager,
-        ComponentsUtils componentsUtils) {
+                            ComponentsUtils componentsUtils) {
         this.userAdminManager = userAdminManager;
         this.componentsUtils = componentsUtils;
     }
@@ -121,7 +122,8 @@
      * @param requestErrorWrapper **************/
 
     protected Response buildErrorResponse(ResponseFormat requestErrorWrapper) {
-        return Response.status(requestErrorWrapper.getStatus()).entity(gson.toJson(requestErrorWrapper.getRequestError())).build();
+        return Response.status(requestErrorWrapper.getStatus())
+            .entity(gson.toJson(requestErrorWrapper.getRequestError())).build();
     }
 
     protected Response buildGeneralErrorResponse() {
@@ -143,26 +145,31 @@
     }
 
     @VisibleForTesting
-    public void setRequestServlet(HttpServletRequest request) {this.servletRequest = request;}
+    public void setRequestServlet(HttpServletRequest request) {
+        this.servletRequest = request;
+    }
 
     protected Response buildOkResponse(ResponseFormat errorResponseWrapper, Object entity) {
         return buildOkResponse(errorResponseWrapper, entity, null);
     }
 
-    protected Response buildOkResponse(ResponseFormat errorResponseWrapper, Object entity, Map<String, String> additionalHeaders) {
+    protected Response buildOkResponse(ResponseFormat errorResponseWrapper, Object entity,
+                                       Map<String, String> additionalHeaders) {
         int status = errorResponseWrapper.getStatus();
         ResponseBuilder responseBuilder = Response.status(status);
         if (entity != null) {
-            if (log.isTraceEnabled())
+            if (log.isTraceEnabled()) {
                 log.trace("returned entity is {}", entity.toString());
+            }
             responseBuilder = responseBuilder.entity(entity);
         }
         if (additionalHeaders != null) {
             for (Entry<String, String> additionalHeader : additionalHeaders.entrySet()) {
                 String headerName = additionalHeader.getKey();
                 String headerValue = additionalHeader.getValue();
-                if (log.isTraceEnabled())
+                if (log.isTraceEnabled()) {
                     log.trace("Adding header {} with value {} to the response", headerName, headerValue);
+                }
                 responseBuilder.header(headerName, headerValue);
             }
         }
@@ -207,9 +214,11 @@
     protected RelationshipTypeBusinessLogic getRelationshipTypeBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> RelationshipTypeBusinessLogic.class);
     }
+
     protected RequirementBusinessLogic getRequirementBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> RequirementBusinessLogic.class);
     }
+
     ComponentsCleanBusinessLogic getComponentCleanerBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> ComponentsCleanBusinessLogic.class);
     }
@@ -225,6 +234,7 @@
     protected ArtifactsBusinessLogic getArtifactBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> ArtifactsBusinessLogic.class);
     }
+
     protected UpgradeBusinessLogic getUpgradeBL(ServletContext context) {
         return getClassFromWebAppContext(context, () -> UpgradeBusinessLogic.class);
     }
@@ -242,20 +252,23 @@
     }
 
     <T> T getClassFromWebAppContext(ServletContext context, Supplier<Class<T>> businessLogicClassGen) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         return webApplicationContext.getBean(businessLogicClassGen.get());
     }
 
     GroupBusinessLogic getGroupBL(ServletContext context) {
 
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         return webApplicationContext.getBean(GroupBusinessLogic.class);
     }
 
     protected ComponentInstanceBusinessLogic getComponentInstanceBL(ServletContext context) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         return webApplicationContext.getBean(ComponentInstanceBusinessLogic.class);
     }
@@ -263,14 +276,14 @@
     protected ComponentsUtils getComponentsUtils() {
         ServletContext context = this.servletRequest.getSession().getServletContext();
 
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         return webApplicationContext.getBean(ComponentsUtils.class);
     }
 
     /**
-     * Used to support Unit Test.<br>
-     * Header Params are not supported in Unit Tests
+     * Used to support Unit Test.<br> Header Params are not supported in Unit Tests
      *
      * @return
      */
@@ -289,7 +302,6 @@
     }
 
 
-
     protected ComponentBusinessLogic getComponentBL(ComponentTypeEnum componentTypeEnum, ServletContext context) {
         ComponentBusinessLogic businessLogic;
         switch (componentTypeEnum) {
@@ -352,15 +364,15 @@
                 Entry next = (Entry) iterator.next();
                 String propertyName = (String) next.getKey();
 
-                if(!isPropertyNameValid(propertyName)) {
+                if (!isPropertyNameValid(propertyName)) {
                     return Either.right(ActionStatus.INVALID_PROPERTY_NAME);
                 }
 
                 JSONObject value = (JSONObject) next.getValue();
                 Either<PropertyDefinition, ActionStatus> propertyDefinitionEither =
-                        getPropertyDefinitionFromJson(componentId, propertyName, value);
+                    getPropertyDefinitionFromJson(componentId, propertyName, value);
 
-                if(propertyDefinitionEither.isRight()) {
+                if (propertyDefinitionEither.isRight()) {
                     return Either.right(propertyDefinitionEither.right().value());
                 }
 
@@ -376,13 +388,16 @@
 
     protected boolean isPropertyNameValid(String propertyName) {
         return Objects.nonNull(propertyName)
-                       && propertyName.matches(PROPERTY_NAME_REGEX);
+            && propertyName.matches(PROPERTY_NAME_REGEX);
 
     }
 
-    private Either<PropertyDefinition, ActionStatus> getPropertyDefinitionFromJson(String componentId, String propertyName, JSONObject value) {
+    private Either<PropertyDefinition, ActionStatus> getPropertyDefinitionFromJson(String componentId,
+                                                                                   String propertyName,
+                                                                                   JSONObject value) {
         String jsonString = value.toJSONString();
-        Either<PropertyDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(jsonString, PropertyDefinition.class);
+        Either<PropertyDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(jsonString,
+            PropertyDefinition.class);
         if (convertJsonToObject.isRight()) {
             return Either.right(convertJsonToObject.right().value());
         }
@@ -403,7 +418,8 @@
             jsonArray = (JSONArray) parser.parse(data);
             for (Object jsonElement : jsonArray) {
                 String propertyAsString = jsonElement.toString();
-                Either<PropertyDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(propertyAsString, PropertyDefinition.class);
+                Either<PropertyDefinition, ActionStatus> convertJsonToObject = convertJsonToObject(propertyAsString,
+                    PropertyDefinition.class);
 
                 if (convertJsonToObject.isRight()) {
                     return Either.right(convertJsonToObject.right().value());
@@ -450,12 +466,13 @@
 
     }
 
-    protected  <T> Either<T, ActionStatus> convertJsonToObject(String data, Class<T> clazz) {
+    protected <T> Either<T, ActionStatus> convertJsonToObject(String data, Class<T> clazz) {
         T t = null;
         Type constraintType = new TypeToken<PropertyConstraint>() {
         }.getType();
         Gson
-            gson = new GsonBuilder().registerTypeAdapter(constraintType, new PropertyOperation.PropertyConstraintDeserialiser()).create();
+            gson = new GsonBuilder()
+            .registerTypeAdapter(constraintType, new PropertyOperation.PropertyConstraintDeserialiser()).create();
         try {
             log.trace("convert json to object. json=\n {}", data);
             t = gson.fromJson(data, clazz);
@@ -475,7 +492,8 @@
     private Either<String, ActionStatus> convertObjectToJson(PropertyDefinition propertyDefinition) {
         Type constraintType = new TypeToken<PropertyConstraint>() {
         }.getType();
-        Gson gson = new GsonBuilder().registerTypeAdapter(constraintType, new PropertyOperation.PropertyConstraintSerialiser()).create();
+        Gson gson = new GsonBuilder()
+            .registerTypeAdapter(constraintType, new PropertyOperation.PropertyConstraintSerialiser()).create();
         try {
             log.trace("convert object to json. propertyDefinition= {}", propertyDefinition);
             String json = gson.toJson(propertyDefinition);
@@ -494,30 +512,54 @@
     }
 
     protected PropertyBusinessLogic getPropertyBL(ServletContext context) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         PropertyBusinessLogic propertytBl = webApplicationContext.getBean(PropertyBusinessLogic.class);
         return propertytBl;
     }
 
     protected InputsBusinessLogic getInputBL(ServletContext context) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         return webApplicationContext.getBean(InputsBusinessLogic.class);
     }
 
+    protected OutputsBusinessLogic getOutputBL(final ServletContext context) {
+        final WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        final WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
+        return webApplicationContext.getBean(OutputsBusinessLogic.class);
+    }
+
     protected PolicyBusinessLogic getPolicyBL(ServletContext context) {
-        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context.getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
+        WebAppContextWrapper webApplicationContextWrapper = (WebAppContextWrapper) context
+            .getAttribute(Constants.WEB_APPLICATION_CONTEXT_WRAPPER_ATTR);
         WebApplicationContext webApplicationContext = webApplicationContextWrapper.getWebAppContext(context);
         return webApplicationContext.getBean(PolicyBusinessLogic.class);
     }
 
-    protected Either<ComponentInstInputsMap, ResponseFormat> parseToComponentInstanceMap(String componentJson, User user, ComponentTypeEnum componentType) {
-        return getComponentsUtils().convertJsonToObjectUsingObjectMapper(componentJson, user, ComponentInstInputsMap.class, AuditingActionEnum.CREATE_RESOURCE, componentType);
+    protected Either<ComponentInstInputsMap, ResponseFormat> parseToComponentInstanceMap(String componentJson,
+                                                                                         User user,
+                                                                                         ComponentTypeEnum componentType) {
+        return getComponentsUtils()
+            .convertJsonToObjectUsingObjectMapper(componentJson, user, ComponentInstInputsMap.class,
+                AuditingActionEnum.CREATE_RESOURCE, componentType);
+    }
+
+    protected Either<ComponentInstOutputsMap, ResponseFormat> parseToComponentInstanceOutputMap(
+        final String componentJson,
+        final User user,
+        final ComponentTypeEnum componentType) {
+        return getComponentsUtils()
+            .convertJsonToObjectUsingObjectMapper(componentJson, user, ComponentInstOutputsMap.class,
+                AuditingActionEnum.CREATE_RESOURCE, componentType);
     }
 
     protected Response declareProperties(String userId, String componentId, String componentType,
-            String componentInstInputsMapObj, DeclarationTypeEnum typeEnum, HttpServletRequest request) {
+                                         String componentInstMapObj, DeclarationTypeEnum typeEnum,
+                                         HttpServletRequest request) {
         ServletContext context = request.getSession().getServletContext();
         String url = request.getMethod() + " " + request.getRequestURI();
         log.debug("(get) Start handle request of {}", url);
@@ -531,18 +573,34 @@
             modifier.setUserId(userId);
             log.debug("modifier id is {}", userId);
             ComponentTypeEnum componentTypeEnum = ComponentTypeEnum.findByParamName(componentType);
-            Either<ComponentInstInputsMap, ResponseFormat> componentInstInputsMapRes = parseToComponentInstanceMap(componentInstInputsMapObj, modifier, componentTypeEnum);
-            if (componentInstInputsMapRes.isRight()) {
-                log.debug("failed to parse componentInstInputsMap");
-                response = buildErrorResponse(componentInstInputsMapRes.right().value());
-                return response;
+            Either<List<ToscaDataDefinition>, ResponseFormat> propertiesAfterDeclaration = null;
+            if (businessLogic instanceof InputsBusinessLogic || businessLogic instanceof PolicyBusinessLogic) {
+                Either<ComponentInstInputsMap, ResponseFormat> componentInstInputsMapRes = parseToComponentInstanceMap(
+                    componentInstMapObj, modifier, componentTypeEnum);
+                if (componentInstInputsMapRes.isRight()) {
+                    log.debug("failed to parse componentInstInputsMap");
+                    response = buildErrorResponse(componentInstInputsMapRes.right().value());
+                    return response;
+                }
+                propertiesAfterDeclaration = businessLogic
+                    .declareProperties(userId, componentId, componentTypeEnum,
+                        componentInstInputsMapRes.left().value());
             }
 
-            Either<List<ToscaDataDefinition>, ResponseFormat> propertiesAfterDeclaration = businessLogic
-                                                                               .declareProperties(userId, componentId,
-                                                                                       componentTypeEnum,
-                                                                                       componentInstInputsMapRes.left().value());
-            if (propertiesAfterDeclaration.isRight()) {
+            if (businessLogic instanceof OutputsBusinessLogic) {
+                Either<ComponentInstOutputsMap, ResponseFormat> componentInstOutputsMapRes = parseToComponentInstanceOutputMap(
+                    componentInstMapObj, modifier, componentTypeEnum);
+                if (componentInstOutputsMapRes.isRight()) {
+                    log.debug("failed to parse componentInstOutputsMap");
+                    response = buildErrorResponse(componentInstOutputsMapRes.right().value());
+                    return response;
+                }
+                propertiesAfterDeclaration = businessLogic
+                    .declareOutputProperties(userId, componentId, componentTypeEnum,
+                        componentInstOutputsMapRes.left().value());
+            }
+
+            if (Objects.nonNull(propertiesAfterDeclaration) && propertiesAfterDeclaration.isRight()) {
                 log.debug("failed to create inputs  for service: {}", componentId);
                 return buildErrorResponse(propertiesAfterDeclaration.right().value());
             }
@@ -550,19 +608,25 @@
             return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), properties);
 
         } catch (Exception e) {
-            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Create inputs for service with id: " + componentId);
+            BeEcompErrorManager.getInstance()
+                .logBeRestApiGeneralError("Create inputs for service with id: " + componentId);
             log.debug("Properties declaration failed with exception", e);
             response = buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+
             return response;
         }
     }
 
     public BaseBusinessLogic getBlForPropertyDeclaration(DeclarationTypeEnum typeEnum,
-                                                          ServletContext context) {
-        if(typeEnum.equals(DeclarationTypeEnum.POLICY)) {
+                                                         ServletContext context) {
+        if (typeEnum.equals(DeclarationTypeEnum.POLICY)) {
             return getPolicyBL(context);
         }
 
+        if (typeEnum.equals(DeclarationTypeEnum.OUTPUT)) {
+            return getOutputBL(context);
+        }
+
         return getInputBL(context);
     }
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/OutputsServlet.java b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/OutputsServlet.java
new file mode 100644
index 0000000..fd50ab6
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/servlets/OutputsServlet.java
@@ -0,0 +1,122 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2020, Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.openecomp.sdc.be.servlets;
+
+import com.jcabi.aspects.Loggable;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.ArraySchema;
+import io.swagger.v3.oas.annotations.media.Content;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.responses.ApiResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.HeaderParam;
+import javax.ws.rs.POST;
+import javax.ws.rs.Path;
+import javax.ws.rs.PathParam;
+import javax.ws.rs.Produces;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.Response;
+import org.openecomp.sdc.be.components.impl.OutputsBusinessLogic;
+import org.openecomp.sdc.be.components.impl.exceptions.ComponentException;
+import org.openecomp.sdc.be.config.BeEcompErrorManager;
+import org.openecomp.sdc.be.dao.api.ActionStatus;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.DeclarationTypeEnum;
+import org.openecomp.sdc.be.impl.ComponentsUtils;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.user.UserBusinessLogic;
+import org.openecomp.sdc.common.api.Constants;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Controller;
+
+@Loggable(prepend = true, value = Loggable.DEBUG, trim = false)
+@Path("/v1/catalog")
+@Controller
+@Produces(MediaType.APPLICATION_JSON)
+public class OutputsServlet extends BeGenericServlet {
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(OutputsServlet.class);
+    private static final String START_HANDLE_REQUEST_OF = "Start handle {} request of {}";
+
+    private final OutputsBusinessLogic outputsBusinessLogic;
+
+    public OutputsServlet(final UserBusinessLogic userAdminManager,
+                          final ComponentsUtils componentsUtils,
+                          final OutputsBusinessLogic outputsBusinessLogic) {
+        super(userAdminManager, componentsUtils);
+        this.outputsBusinessLogic = outputsBusinessLogic;
+    }
+
+    @POST
+    @Path("/{componentType}/{componentId}/create/outputs")
+    @Operation(description = "Create outputs on component", method = "POST", summary = "Return outputs list", responses = {
+        @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Resource.class)))),
+        @ApiResponse(responseCode = "200", description = "Component found"),
+        @ApiResponse(responseCode = "403", description = "Restricted operation"),
+        @ApiResponse(responseCode = "404", description = "Component not found")})
+    public Response createMultipleOutputs(@Parameter(description = "valid value: services",
+        schema = @Schema(allowableValues = {ComponentTypeEnum.SERVICE_PARAM_NAME}))
+                                          @PathParam("componentType") final String componentType,
+                                          @PathParam("componentId") final String componentId,
+                                          @Context final HttpServletRequest request,
+                                          @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
+                                          @Parameter(description = "ComponentIns Outputs Object to be created",
+                                              required = true) String componentOutputsMapObj) {
+
+        LOGGER.debug(START_HANDLE_REQUEST_OF, request.getMethod(), request.getRequestURI());
+        return super.declareProperties(userId, componentId, componentType, componentOutputsMapObj,
+            DeclarationTypeEnum.OUTPUT, request);
+    }
+
+    @DELETE
+    @Path("/{componentType}/{componentId}/delete/{outputId}/output")
+    @Operation(description = "Delete output from component", method = "DELETE", summary = "Delete Component Output",
+        responses = {
+            @ApiResponse(content = @Content(array = @ArraySchema(schema = @Schema(implementation = Component.class)))),
+            @ApiResponse(responseCode = "200", description = "Output deleted"),
+            @ApiResponse(responseCode = "403", description = "Restricted operation"),
+            @ApiResponse(responseCode = "404", description = "Output not found")})
+    public Response deleteComponentOutput(@Parameter(description = "valid value: services",
+        schema = @Schema(allowableValues = {ComponentTypeEnum.SERVICE_PARAM_NAME}))
+                                          @PathParam("componentType") final String componentType,
+                                          @PathParam("componentId") final String componentId,
+                                          @PathParam("outputId") final String outputId,
+                                          @HeaderParam(value = Constants.USER_ID_HEADER) String userId,
+                                          @Context final HttpServletRequest request,
+                                          @Parameter(description = "Component Output to be deleted",
+                                              required = true) String componentOutputsMapObj) {
+        try {
+            final OutputDefinition deleteOutput = outputsBusinessLogic.deleteOutput(componentId, userId, outputId);
+            return buildOkResponse(getComponentsUtils().getResponseFormat(ActionStatus.OK), deleteOutput);
+        } catch (final ComponentException e) {
+            BeEcompErrorManager.getInstance().logBeRestApiGeneralError("Delete output for service + "
+                + componentId + " + with id: " + outputId);
+            LOGGER.debug("Delete output failed with exception", e);
+            return buildErrorResponse(getComponentsUtils().getResponseFormat(ActionStatus.GENERAL_ERROR));
+        }
+    }
+
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PropertyConvertor.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PropertyConvertor.java
index ab22fca..ee256f9 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PropertyConvertor.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/PropertyConvertor.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -52,16 +52,20 @@
 
 @Service
 public class PropertyConvertor {
+
     private JsonParser jsonParser = new JsonParser();
     private static final Logger log = Logger.getLogger(PropertyConvertor.class);
-    public  enum PropertyType  {
+
+    public enum PropertyType {
         CAPABILITY,
         INPUT,
+        OUTPUT,
         PROPERTY
     }
 
 
-    public Either<ToscaNodeType, ToscaError> convertProperties(Component component, ToscaNodeType toscaNodeType, Map<String, DataTypeDefinition> dataTypes) {
+    public Either<ToscaNodeType, ToscaError> convertProperties(Component component, ToscaNodeType toscaNodeType,
+                                                               Map<String, DataTypeDefinition> dataTypes) {
 
         if (component instanceof Resource) {
             Resource resource = (Resource) component;
@@ -70,9 +74,10 @@
                 Map<String, ToscaProperty> properties = new HashMap<>();
 
                 // take only the properties of this resource
-                props.stream().filter(p -> p.getOwnerId() == null || p.getOwnerId().equals(component.getUniqueId())).forEach(property -> {
-                    properties.put(property.getName(), convertProperty(dataTypes, property, PropertyType.PROPERTY));
-                 });
+                props.stream().filter(p -> p.getOwnerId() == null || p.getOwnerId().equals(component.getUniqueId()))
+                    .forEach(property -> {
+                        properties.put(property.getName(), convertProperty(dataTypes, property, PropertyType.PROPERTY));
+                    });
                 if (!properties.isEmpty()) {
                     toscaNodeType.setProperties(properties);
                 }
@@ -81,18 +86,21 @@
         return Either.left(toscaNodeType);
     }
 
-    public ToscaProperty convertProperty(Map<String, DataTypeDefinition> dataTypes, PropertyDefinition property, PropertyType propertyType) {
+    public ToscaProperty convertProperty(Map<String, DataTypeDefinition> dataTypes, PropertyDefinition property,
+                                         PropertyType propertyType) {
         ToscaProperty prop = new ToscaProperty();
-        log.trace("try to convert property {} from type {} with default value [{}]", property.getName(), property.getType(), property.getDefaultValue());
+        log.trace("try to convert property {} from type {} with default value [{}]", property.getName(),
+            property.getType(), property.getDefaultValue());
         SchemaDefinition schema = property.getSchema();
-        if (schema != null && schema.getProperty() != null && schema.getProperty().getType() != null && !schema.getProperty().getType().isEmpty()) {
+        if (schema != null && schema.getProperty() != null && schema.getProperty().getType() != null && !schema
+            .getProperty().getType().isEmpty()) {
             EntrySchema eschema = new EntrySchema();
             eschema.setType(schema.getProperty().getType());
             eschema.setDescription(schema.getProperty().getDescription());
             prop.setEntry_schema(eschema);
         }
         String defaultValue = property.getDefaultValue();
-        if(Objects.isNull(defaultValue)) {
+        if (Objects.isNull(defaultValue) || propertyType.equals(PropertyType.OUTPUT)) {
             defaultValue = property.getValue();
         }
         Object convertedObj = convertToToscaObject(property, defaultValue, dataTypes, false);
@@ -102,20 +110,23 @@
         prop.setType(property.getType());
         prop.setDescription(property.getDescription());
         prop.setRequired(property.isRequired());
-        if(propertyType.equals(PropertyType.CAPABILITY)) {
+        if (propertyType.equals(PropertyType.CAPABILITY)) {
             prop.setStatus(property.getStatus());
         }
 
         return prop;
     }
 
-    public Object convertToToscaObject(PropertyDataDefinition property, String value, Map<String, DataTypeDefinition> dataTypes, boolean preserveEmptyValue) {
+
+    public Object convertToToscaObject(PropertyDataDefinition property, String value,
+                                       Map<String, DataTypeDefinition> dataTypes, boolean preserveEmptyValue) {
         String propertyType = property.getType();
         String innerType = property.getSchemaType();
         log.trace("try to convert propertyType {} , value [{}], innerType {}", propertyType, value, innerType);
         if (StringUtils.isEmpty(value)) {
-            value = DataTypePropertyConverter.getInstance().getDataTypePropertiesDefaultValuesRec(propertyType, dataTypes);
-            if(StringUtils.isEmpty(value)){
+            value = DataTypePropertyConverter.getInstance()
+                .getDataTypePropertiesDefaultValuesRec(propertyType, dataTypes);
+            if (StringUtils.isEmpty(value)) {
                 return null;
             }
         }
@@ -170,14 +181,15 @@
             if (jsonElement.isJsonObject()) {
                 JsonObject jsonObj = jsonElement.getAsJsonObject();
                 // check if value is a get_input function
-                if (jsonObj.entrySet().size() == 1 && jsonObj.has(ToscaFunctions.GET_INPUT.getFunctionName())) {
+                if (jsonObj.entrySet().size() == 1 && jsonObj.has(ToscaFunctions.GET_INPUT.getFunctionName()) ||
+                    jsonObj.has(ToscaFunctions.GET_ATTRIBUTE.getFunctionName())) {
                     Object obj = mapConverterInst.handleComplexJsonValue(jsonElement);
-                    log.debug("It's get_input function. obj={}", obj);
+                    log.debug("It's get_input/get_attribute function. obj={}", obj);
                     return obj;
                 }
             }
             Object convertedValue;
-                if (innerConverter != null && (ToscaPropertyType.MAP == type || ToscaPropertyType.LIST == type)) {
+            if (innerConverter != null && (ToscaPropertyType.MAP == type || ToscaPropertyType.LIST == type)) {
                 convertedValue = innerConverter.convertToToscaValue(value, innerType, dataTypes);
             } else if (isScalar) {
                 // complex json for scalar type
@@ -203,7 +215,7 @@
     }
 
     public void convertAndAddValue(Map<String, DataTypeDefinition> dataTypes,
-            Map<String, Object> props, PropertyDataDefinition prop, Supplier<String> supplier) {
+                                   Map<String, Object> props, PropertyDataDefinition prop, Supplier<String> supplier) {
         Object convertedValue = convertValue(dataTypes, prop, supplier);
         if (!ToscaValueBaseConverter.isEmptyObjectValue(convertedValue)) {
             props.put(prop.getName(), convertedValue);
@@ -211,7 +223,7 @@
     }
 
     private <T extends PropertyDataDefinition> Object convertValue(Map<String, DataTypeDefinition> dataTypes,
-             T input, Supplier<String> supplier) {
+                                                                   T input, Supplier<String> supplier) {
         return convertToToscaObject(input, supplier.get(), dataTypes, false);
     }
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
index 3eb39b2..ba7583e 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/ToscaExportHandler.java
@@ -25,6 +25,10 @@
 import static org.apache.commons.collections.MapUtils.isNotEmpty;
 import static org.openecomp.sdc.be.components.utils.PropertiesUtils.resolvePropertyValueFromInput;
 import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.addInterfaceTypeElement;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import fj.data.Either;
 import java.beans.IntrospectionException;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -58,7 +62,6 @@
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterCapabilityDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementNodeFilterPropertyDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.RequirementSubstitutionFilterCapabilityDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.RequirementSubstitutionFilterPropertyDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.SubstitutionFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ToscaArtifactDataDefinition;
@@ -108,6 +111,7 @@
 import org.openecomp.sdc.be.tosca.model.ToscaTopolgyTemplate;
 import org.openecomp.sdc.be.tosca.utils.ForwardingPathToscaUtil;
 import org.openecomp.sdc.be.tosca.utils.InputConverter;
+import org.openecomp.sdc.be.tosca.utils.OutputConverter;
 import org.openecomp.sdc.common.log.wrappers.Logger;
 import org.openecomp.sdc.externalupload.utils.ServiceUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -123,9 +127,6 @@
 import org.yaml.snakeyaml.nodes.Tag;
 import org.yaml.snakeyaml.representer.Represent;
 import org.yaml.snakeyaml.representer.Representer;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.SerializationFeature;
-import fj.data.Either;
 
 @org.springframework.stereotype.Component("tosca-export-handler")
 public class ToscaExportHandler {
@@ -139,17 +140,21 @@
     private GroupExportParser groupExportParser;
     private PropertyConvertor propertyConvertor;
     private InputConverter inputConverter;
+    private OutputConverter outputConverter;
     private InterfaceLifecycleOperation interfaceLifecycleOperation;
     private InterfacesOperationsConverter interfacesOperationsConverter;
 
     @Autowired
-    public ToscaExportHandler(ApplicationDataTypeCache dataTypeCache, ToscaOperationFacade toscaOperationFacade,
-                              CapabilityRequirementConverter capabilityRequirementConverter,
-                              PolicyExportParser policyExportParser,
-                              GroupExportParser groupExportParser, PropertyConvertor propertyConvertor,
-                              InputConverter inputConverter,
-                              InterfaceLifecycleOperation interfaceLifecycleOperation,
-                              InterfacesOperationsConverter interfacesOperationsConverter) {
+    public ToscaExportHandler(final ApplicationDataTypeCache dataTypeCache,
+                              final ToscaOperationFacade toscaOperationFacade,
+                              final CapabilityRequirementConverter capabilityRequirementConverter,
+                              final PolicyExportParser policyExportParser,
+                              final GroupExportParser groupExportParser,
+                              final PropertyConvertor propertyConvertor,
+                              final InputConverter inputConverter,
+                              final OutputConverter outputConverter,
+                              final InterfaceLifecycleOperation interfaceLifecycleOperation,
+                              final InterfacesOperationsConverter interfacesOperationsConverter) {
         this.dataTypeCache = dataTypeCache;
         this.toscaOperationFacade = toscaOperationFacade;
         this.capabilityRequirementConverter = capabilityRequirementConverter;
@@ -157,6 +162,7 @@
         this.groupExportParser = groupExportParser;
         this.propertyConvertor = propertyConvertor;
         this.inputConverter = inputConverter;
+        this.outputConverter = outputConverter;
         this.interfaceLifecycleOperation = interfaceLifecycleOperation;
         this.interfacesOperationsConverter = interfacesOperationsConverter;
     }
@@ -283,7 +289,7 @@
         if (nodeTypesMap != null && !nodeTypesMap.isEmpty()) {
             toscaNode.setNode_types(nodeTypesMap);
         }
-        
+
         createServiceSubstitutionNodeTypes(componentCache, component, toscaNode);
 
         Either<Map<String, Object>, ToscaError> proxyInterfaceTypesEither = createProxyInterfaceTypes(component);
@@ -307,10 +313,15 @@
         List<InputDefinition> inputDef = component.getInputs();
         Map<String, ToscaProperty> inputs = inputConverter.convertInputs(inputDef, dataTypes);
 
-        if (!inputs.isEmpty()) {
+        if (MapUtils.isNotEmpty(inputs)) {
             topologyTemplate.setInputs(inputs);
         }
 
+        final Map<String, ToscaProperty> outputs = outputConverter.convertOutputs(component.getOutputs(), dataTypes);
+        if (MapUtils.isNotEmpty(outputs)) {
+            topologyTemplate.setOutputs(outputs);
+        }
+
         final List<ComponentInstance> componentInstances = component.getComponentInstances();
         Map<String, List<ComponentInstanceProperty>> componentInstancesProperties =
             component.getComponentInstancesProperties();
@@ -329,7 +340,7 @@
         }
 
         SubstitutionMapping substitutionMapping = new SubstitutionMapping();
-        convertSubstitutionMappingFilter(component, substitutionMapping);
+        convertSubstitutionMappingFilter(componentInstances, substitutionMapping);
 
         addGroupsToTopologyTemplate(component, topologyTemplate);
 
@@ -368,6 +379,7 @@
             return Either.right(requirements.right().value());
         }
         substitutionMapping = requirements.left().value();
+
         final Map<String, String[]> propertyMappingMap = buildSubstitutionMappingPropertyMapping(component);
         if (!propertyMappingMap.isEmpty()) {
             substitutionMapping.setProperties(propertyMappingMap);
@@ -380,13 +392,21 @@
         return Either.left(toscaNode);
     }
 
-    private void convertSubstitutionMappingFilter(final Component component,
+    private void convertSubstitutionMappingFilter(final List<ComponentInstance> componentInstances,
                                                   final SubstitutionMapping substitutionMapping) {
-        if(component.getSubstitutionFilter() != null
-                && (component.getSubstitutionFilter().getProperties()).getListToscaDataDefinition() != null) {
-            substitutionMapping
-                    .setSubstitution_filter(convertToSubstitutionFilterComponent(component.getSubstitutionFilter()));
-        }
+        componentInstances.stream()
+            .filter(componentInstance -> hasSubstitutionFilterDataDefinition(componentInstance.getSubstitutionFilter()))
+            .forEach(componentInstance -> substitutionMapping
+                .setSubstitution_filter(
+                    convertToSubstitutionFilterComponent(componentInstance.getSubstitutionFilter())));
+    }
+
+    private boolean hasSubstitutionFilterDataDefinition(
+        final SubstitutionFilterDataDefinition substitutionFilterDataDefinition) {
+
+        return substitutionFilterDataDefinition != null && substitutionFilterDataDefinition.getProperties() != null
+            && CollectionUtils
+            .isNotEmpty(substitutionFilterDataDefinition.getProperties().getListToscaDataDefinition());
     }
 
     private void addGroupsToTopologyTemplate(Component component, ToscaTopolgyTemplate topologyTemplate) {
@@ -430,9 +450,12 @@
                 toscaMetadata.setSourceModelUuid(componentInstance.getSourceModelUuid());
                 toscaMetadata.setSourceModelName(componentInstance.getSourceModelName());
                 if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy) {
-                	toscaMetadata.setName(componentInstance.getSourceModelName() + " " + OriginTypeEnum.ServiceProxy.getDisplayValue());
+                    toscaMetadata.setName(
+                        componentInstance.getSourceModelName() + " " + OriginTypeEnum.ServiceProxy.getDisplayValue());
                 } else if (componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
-                    toscaMetadata.setName(componentInstance.getSourceModelName() + " " + OriginTypeEnum.ServiceSubstitution.getDisplayValue());
+                    toscaMetadata.setName(
+                        componentInstance.getSourceModelName() + " " + OriginTypeEnum.ServiceSubstitution
+                            .getDisplayValue());
                 }
                 toscaMetadata.setDescription(componentInstance.getDescription());
             }
@@ -442,7 +465,8 @@
             case RESOURCE:
                 Resource resource = (Resource) component;
 
-            if (isInstance && (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution)) {
+                if (isInstance && (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
+                    || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution)) {
                     toscaMetadata.setType(componentInstance.getOriginType().getDisplayValue());
                 } else {
                     toscaMetadata.setType(resource.getResourceType().name());
@@ -566,7 +590,8 @@
                                    final ComponentInstance componentInstance,
                                    final Component fetchedComponent) {
         componentCache.put(fetchedComponent.getUniqueId(), fetchedComponent);
-        if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
+        if (componentInstance.getOriginType() == OriginTypeEnum.ServiceProxy
+            || componentInstance.getOriginType() == OriginTypeEnum.ServiceSubstitution) {
             final Either<Component, StorageOperationStatus> sourceService = toscaOperationFacade
                 .getToscaFullElement(componentInstance.getSourceModelUid());
             if (sourceService.isRight() && (log.isDebugEnabled())) {
@@ -1201,23 +1226,25 @@
 
         return Either.left(nodeTypesMap);
     }
-    
+
     private void createServiceSubstitutionNodeTypes(final Map<String, Component> componentCache,
-            final Component container, final ToscaTemplate toscaNode) {
+                                                    final Component container, final ToscaTemplate toscaNode) {
         final List<ComponentInstance> componentInstances = container.getComponentInstances();
 
         if (CollectionUtils.isEmpty(componentInstances)) {
             return;
         }
         final List<ComponentInstance> serviceSubstitutionInstanceList = componentInstances.stream()
-               .filter(p -> p.getOriginType().name().equals(OriginTypeEnum.ServiceSubstitution.name()))
-               .collect(Collectors.toList());
+            .filter(p -> p.getOriginType().name().equals(OriginTypeEnum.ServiceSubstitution.name()))
+            .collect(Collectors.toList());
         if (CollectionUtils.isNotEmpty(serviceSubstitutionInstanceList)) {
             for (ComponentInstance inst : serviceSubstitutionInstanceList) {
-                final Map<String, ToscaNodeType> nodeTypes = toscaNode.getNode_types() == null ? new HashMap<>() : toscaNode.getNode_types();
-                convertInterfaceNodeType(new HashMap<>(), componentCache.get(inst.getSourceModelUid()), toscaNode, nodeTypes, true);
+                final Map<String, ToscaNodeType> nodeTypes =
+                    toscaNode.getNode_types() == null ? new HashMap<>() : toscaNode.getNode_types();
+                convertInterfaceNodeType(new HashMap<>(), componentCache.get(inst.getSourceModelUid()), toscaNode,
+                    nodeTypes, true);
             }
-        }  
+        }
     }
 
     private ToscaNodeType createProxyNodeType(Map<String, Component> componentCache, Component origComponent,
@@ -1534,7 +1561,7 @@
         NodeFilter nodeFilter = new NodeFilter();
 
         ListDataDefinition<RequirementSubstitutionFilterPropertyDataDefinition> origProperties =
-                substitutionFilterDataDefinition.getProperties();
+            substitutionFilterDataDefinition.getProperties();
         List<Map<String, List<Object>>> propertiesCopy = new ArrayList<>();
 
         copySubstitutionFilterProperties(origProperties, propertiesCopy);
@@ -1616,7 +1643,8 @@
         for (final RequirementSubstitutionFilterPropertyDataDefinition propertyDataDefinition : origProperties
             .getListToscaDataDefinition()) {
             for (final String propertyInfoEntry : propertyDataDefinition.getConstraints()) {
-                final Map<String, List<Object>> propertyValObj = new YamlUtil().yamlToObject(propertyInfoEntry, Map.class);
+                final Map<String, List<Object>> propertyValObj = new YamlUtil()
+                    .yamlToObject(propertyInfoEntry, Map.class);
                 final String propertyName = propertyDataDefinition.getName();
                 if (propertyMapCopy.containsKey(propertyName)) {
                     addPropertyConstraintValueToList(propertyName, propertyValObj, propertyMapCopy.get(propertyName));
@@ -1791,6 +1819,7 @@
                 PropertyConvertor.PropertyType.INPUT);
             mergedProperties.put(input.getName(), property);
         }
+
     }
 
     Optional<Map<String, Object>> getProxyNodeTypeInterfaces(Component proxyComponent,
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInput.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInput.java
index c4eba4f..512df89 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInput.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaInput.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -22,29 +22,24 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
 
 public class ToscaInput extends ToscaProperty {
-    private  Map<String,ToscaAnnotation> annotations;
+
+    @Getter
+    @Setter
+    private Map<String, ToscaAnnotation> annotations;
 
     //copy constructor
-    public ToscaInput(ToscaProperty toscaProperty){
+    public ToscaInput(ToscaProperty toscaProperty) {
         super(toscaProperty);
     }
 
-
-    public Map<String, ToscaAnnotation> getAnnotations() {
-        return annotations;
-    }
-
-    public void setAnnotations(Map<String, ToscaAnnotation> annotations) {
-        this.annotations = annotations;
-    }
-    public void addAnnotation(String name, ToscaAnnotation annotaion){
-        if ( annotations == null ){
+    public void addAnnotation(String name, ToscaAnnotation annotaion) {
+        if (annotations == null) {
             annotations = new HashMap<>();
         }
         annotations.put(name, annotaion);
-
-
     }
 }
diff --git a/catalog-model/src/test/java/org/openecomp/sdc/be/model/ComponentInstListInputTest.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaOutput.java
similarity index 60%
rename from catalog-model/src/test/java/org/openecomp/sdc/be/model/ComponentInstListInputTest.java
rename to catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaOutput.java
index 46ba49d..7675bd4 100644
--- a/catalog-model/src/test/java/org/openecomp/sdc/be/model/ComponentInstListInputTest.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaOutput.java
@@ -2,7 +2,7 @@
  * ============LICENSE_START=======================================================
  * SDC
  * ================================================================================
- * Copyright (C) 2019 Nokia. All rights reserved.
+ * Copyright (C) 2020, Nordix Foundation. All rights reserved.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -17,16 +17,25 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  */
-package org.openecomp.sdc.be.model;
 
-import static com.google.code.beanmatchers.BeanMatchers.hasValidGettersAndSetters;
-import static org.junit.Assert.assertThat;
+package org.openecomp.sdc.be.tosca.model;
 
-import org.junit.Test;
+import java.util.HashMap;
+import java.util.Map;
 
-public class ComponentInstListInputTest {
-    @Test
-    public void shouldHaveValidGettersAndSetters() {
-        assertThat(ComponentInstListInput.class, hasValidGettersAndSetters());
+public class ToscaOutput extends ToscaProperty {
+
+    private Map<String, ToscaAnnotation> annotations;
+
+    //copy constructor
+    public ToscaOutput(final ToscaProperty toscaProperty) {
+        super(toscaProperty);
     }
-}
\ No newline at end of file
+
+    public void addAnnotation(final String name, final ToscaAnnotation annotaion) {
+        if (annotations == null) {
+            annotations = new HashMap<>();
+        }
+        annotations.put(name, annotaion);
+    }
+}
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaTopolgyTemplate.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaTopolgyTemplate.java
index 0d62521..6efc3ec 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaTopolgyTemplate.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/model/ToscaTopolgyTemplate.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -22,57 +22,31 @@
 
 import java.util.HashMap;
 import java.util.Map;
+import lombok.Getter;
+import lombok.Setter;
 
+@Getter
+@Setter
 public class ToscaTopolgyTemplate {
+
     private Map<String, ToscaProperty> inputs;
+    private Map<String, ToscaProperty> outputs;
     private Map<String, ToscaNodeTemplate> node_templates;
     private Map<String, ToscaGroupTemplate> groups;
     private Map<String, ToscaPolicyTemplate> policies;
     private SubstitutionMapping substitution_mappings;
 
-    public Map<String, ToscaNodeTemplate> getNode_templates() {
-        return node_templates;
-    }
-
-    public void setNode_templates(Map<String, ToscaNodeTemplate> node_templates) {
-        this.node_templates = node_templates;
-    }
-
-    public Map<String, ToscaGroupTemplate> getGroups() {
-        return groups;
-    }
-
     public void addGroups(Map<String, ToscaGroupTemplate> groups) {
-        if ( this.groups == null ){
+        if (this.groups == null) {
             this.groups = new HashMap<>();
         }
         this.groups.putAll(groups);
     }
 
-    public SubstitutionMapping getSubstitution_mappings() {
-        return substitution_mappings;
-    }
-
-    public void setSubstitution_mappings(SubstitutionMapping substitution_mapping) {
-        this.substitution_mappings = substitution_mapping;
-    }
-
-    public Map<String, ToscaProperty> getInputs() {
-        return inputs;
-    }
-
-    public void setInputs(Map<String, ToscaProperty> inputs) {
-        this.inputs = inputs;
-    }
-
-	public void addPolicies(Map<String, ToscaPolicyTemplate> policiesMap) {
-		if ( this.policies == null ){
+    public void addPolicies(Map<String, ToscaPolicyTemplate> policiesMap) {
+        if (this.policies == null) {
             this.policies = new HashMap<>();
         }
-        this.policies.putAll(policiesMap);		
-	}
-
-	public Map<String, ToscaPolicyTemplate> getPolicies() {
-		return policies;
-	}
+        this.policies.putAll(policiesMap);
+    }
 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InputConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InputConverter.java
index 475627b..c02877d 100644
--- a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InputConverter.java
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/InputConverter.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -20,6 +20,9 @@
 
 package org.openecomp.sdc.be.tosca.utils;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 import org.openecomp.sdc.be.datatypes.elements.Annotation;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.InputDefinition;
@@ -29,14 +32,12 @@
 import org.openecomp.sdc.be.tosca.model.ToscaInput;
 import org.openecomp.sdc.be.tosca.model.ToscaProperty;
 import org.openecomp.sdc.common.log.wrappers.Logger;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
-@org.springframework.stereotype.Component
+@Component
 public class InputConverter {
+
     private PropertyConvertor propertyConvertor;
     private static final Logger log = Logger.getLogger(ToscaExportHandler.class);
 
@@ -46,17 +47,12 @@
     }
 
     /**
-     * This is the converter made for input
-     * input is derived from properties and  is similar to properties
-     * now that it was added annotations , we created a new convertetor for it
-     * Input
-     *    List of annotation
-     *          Annotation:
-     *              name
-     *              type
-     *              description
-     *              list of properties */
-    public Map<String, ToscaProperty>  convertInputs( List<InputDefinition> inputDef,Map<String, DataTypeDefinition> dataTypes) {
+     * This is the converter made for input input is derived from properties and  is similar to properties now that it
+     * was added annotations , we created a new convertetor for it Input List of annotation Annotation: name type
+     * description list of properties
+     */
+    public Map<String, ToscaProperty> convertInputs(List<InputDefinition> inputDef,
+                                                    Map<String, DataTypeDefinition> dataTypes) {
         log.debug("convert inputs to to tosca  ");
 
         Map<String, ToscaProperty> inputs = new HashMap<>();
@@ -75,7 +71,8 @@
         return inputs;
     }
 
-    private void extractAnnotations(Map<String, DataTypeDefinition> dataTypes, ToscaInput toscaInput, List<Annotation> annotationsList) {
+    private void extractAnnotations(Map<String, DataTypeDefinition> dataTypes, ToscaInput toscaInput,
+                                    List<Annotation> annotationsList) {
         if (annotationsList != null) {
             annotationsList.forEach(inputAnnotation -> {
                 ToscaAnnotation annotation = new ToscaAnnotation();
@@ -88,7 +85,7 @@
                 if (inputAnnotation.getProperties() != null) {
                     Map<String, Object> properties = new HashMap<>();
                     inputAnnotation.getProperties().forEach(k -> {
-                        propertyConvertor.convertAndAddValue(dataTypes,properties,k, k::getValue);
+                        propertyConvertor.convertAndAddValue(dataTypes, properties, k, k::getValue);
                     });
                     annotation.setProperties(properties);
                 }
diff --git a/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/OutputConverter.java b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/OutputConverter.java
new file mode 100644
index 0000000..1a18b52
--- /dev/null
+++ b/catalog-be/src/main/java/org/openecomp/sdc/be/tosca/utils/OutputConverter.java
@@ -0,0 +1,92 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
+ * Copyright (C) 2020, Nordix Foundation. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.tosca.utils;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.openecomp.sdc.be.datatypes.elements.Annotation;
+import org.openecomp.sdc.be.model.DataTypeDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.tosca.PropertyConvertor;
+import org.openecomp.sdc.be.tosca.PropertyConvertor.PropertyType;
+import org.openecomp.sdc.be.tosca.model.ToscaAnnotation;
+import org.openecomp.sdc.be.tosca.model.ToscaOutput;
+import org.openecomp.sdc.be.tosca.model.ToscaProperty;
+import org.openecomp.sdc.common.log.wrappers.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class OutputConverter {
+
+    private PropertyConvertor propertyConvertor;
+    private static final Logger log = Logger.getLogger(OutputConverter.class);
+
+    @Autowired
+    public OutputConverter(final PropertyConvertor propertyConvertor) {
+        this.propertyConvertor = propertyConvertor;
+    }
+
+    public Map<String, ToscaProperty> convertOutputs(final List<OutputDefinition> outputDefinitions,
+                                                     final Map<String, DataTypeDefinition> dataTypes) {
+        log.debug("convert outputs to TOSCA");
+        final Map<String, ToscaProperty> outputs = new HashMap<>();
+        if (outputDefinitions != null) {
+            outputDefinitions.forEach(outputDefinition -> {
+                //Extract output the same as property
+                final ToscaProperty toscaProperty = propertyConvertor.convertProperty(dataTypes, outputDefinition,
+                    PropertyType.OUTPUT);
+                //now that we have Tosca property we create new object called tosca output which drives from it
+                final ToscaOutput toscaOutput = new ToscaOutput(toscaProperty);
+                final List<Annotation> annotations = outputDefinition.getAnnotations();
+                extractAnnotations(dataTypes, toscaOutput, annotations);
+                outputs.put(outputDefinition.getName(), toscaOutput);
+            });
+        }
+        return outputs;
+    }
+
+    private void extractAnnotations(final Map<String, DataTypeDefinition> dataTypes,
+                                    final ToscaOutput toscaOutput, final List<Annotation> annotationsList) {
+        if (annotationsList != null) {
+            annotationsList.forEach(outputAnnotation -> {
+                final ToscaAnnotation annotation = new ToscaAnnotation();
+                if ((outputAnnotation.getType()) != null) {
+                    annotation.setType(outputAnnotation.getType());
+                }
+                if (outputAnnotation.getDescription() != null) {
+                    annotation.setDescription(outputAnnotation.getDescription());
+                }
+                if (outputAnnotation.getProperties() != null) {
+                    final Map<String, Object> properties = new HashMap<>();
+                    outputAnnotation.getProperties().forEach(k -> propertyConvertor
+                        .convertAndAddValue(dataTypes, properties, k, k::getValue));
+                    annotation.setProperties(properties);
+                }
+                toscaOutput.addAnnotation(outputAnnotation.getName(), annotation);
+            });
+        }
+    }
+}
+
+
+
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ComponentBusinessLogicTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogicTest.java
similarity index 77%
rename from catalog-be/src/test/java/org/openecomp/sdc/be/components/ComponentBusinessLogicTest.java
rename to catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogicTest.java
index 125c5f6..1a9c01d 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/ComponentBusinessLogicTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/impl/ComponentBusinessLogicTest.java
@@ -7,9 +7,9 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -17,18 +17,25 @@
  * limitations under the License.
  * ============LICENSE_END=========================================================
  * Modifications copyright (c) 2019 Nokia
+ * Modifications copyright (c) 2020, Nordix Foundation
  * ================================================================================
  */
+package org.openecomp.sdc.be.components.impl;
 
-package org.openecomp.sdc.be.components;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.Mockito.when;
+import static org.openecomp.sdc.be.components.impl.utils.TestGenerationUtils.getComponentsUtils;
+import static org.openecomp.sdc.common.util.GeneralUtility.getCategorizedComponents;
 
 import fj.data.Either;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.junit.MockitoJUnitRunner;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.openecomp.sdc.be.DummyConfigurationManager;
-import org.openecomp.sdc.be.components.impl.ComponentBusinessLogic;
-import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.utils.ComponentBusinessLogicMock;
 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
 import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
@@ -45,27 +52,20 @@
 import org.openecomp.sdc.common.api.ArtifactGroupTypeEnum;
 import org.openecomp.sdc.exception.ResponseFormat;
 
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.mockito.Mockito.when;
-import static org.openecomp.sdc.be.components.impl.utils.TestGenerationUtils.getComponentsUtils;
-import static org.openecomp.sdc.common.util.GeneralUtility.getCategorizedComponents;
-
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class ComponentBusinessLogicTest extends ComponentBusinessLogicMock {
 
     private static final User USER = new User();
     private static final String ARTIFACT_LABEL = "toscaArtifact1";
     private static final String ARTIFACT_LABEL2 = "toscaArtifact2";
-
-    private ComponentBusinessLogic testInstance = new ComponentBusinessLogic(elementDao, groupOperation, groupInstanceOperation,
-        groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation, artifactsBusinessLogic,
-        artifactToscaOperation,componentContactIdValidator, componentNameValidator, componentTagsValidator, componentValidator,
-            componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator) {
+    DummyConfigurationManager dummyConfigurationManager = new DummyConfigurationManager();
+    private ComponentBusinessLogic testInstance = new ComponentBusinessLogic(elementDao, groupOperation,
+        groupInstanceOperation,
+        groupTypeOperation, groupBusinessLogic, interfaceOperation, interfaceLifecycleTypeOperation,
+        artifactsBusinessLogic,
+        artifactToscaOperation, componentContactIdValidator, componentNameValidator, componentTagsValidator,
+        componentValidator,
+        componentIconValidator, componentProjectCodeValidator, componentDescriptionValidator) {
         @Override
         public Either<List<String>, ResponseFormat> deleteMarkedComponents() {
             return null;
@@ -77,34 +77,36 @@
         }
 
         @Override
-        public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(String componentId, String userId) {
+        public Either<List<ComponentInstance>, ResponseFormat> getComponentInstancesFilteredByPropertiesAndInputs(
+            String componentId, String userId) {
             return null;
         }
 
         @Override
-        public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(String componentId, List<String> dataParamsToReturn) {
+        public Either<UiComponentDataTransfer, ResponseFormat> getUiComponentDataTransferByComponentId(
+            String componentId, List<String> dataParamsToReturn) {
             return null;
         }
     };
-
-
-    DummyConfigurationManager dummyConfigurationManager = new DummyConfigurationManager();;
+    ;
 
     @SuppressWarnings("unchecked")
     @Test
     public void setToscaArtifactsPlaceHolders_normalizeArtifactName() throws Exception {
         Resource resource = new ResourceBuilder().setUniqueId("uid")
-                .setComponentType(ComponentTypeEnum.RESOURCE)
-                .setSystemName("myResource")
-                .build();
+            .setComponentType(ComponentTypeEnum.RESOURCE)
+            .setSystemName("myResource")
+            .build();
         Map<String, Object> artifactsFromConfig = new HashMap<>();
         artifactsFromConfig.put(ARTIFACT_LABEL, buildArtifactMap("artifact:not normalized.yml"));
         artifactsFromConfig.put(ARTIFACT_LABEL2, buildArtifactMap("alreadyNormalized.csar"));
         when(dummyConfigurationManager.getConfigurationMock().getToscaArtifacts()).thenReturn(artifactsFromConfig);
-        when(artifactsBusinessLogic.createArtifactPlaceHolderInfo(resource.getUniqueId(), ARTIFACT_LABEL, (Map<String, Object>) artifactsFromConfig.get(ARTIFACT_LABEL), USER, ArtifactGroupTypeEnum.TOSCA))
-                .thenReturn(buildArtifactDef(ARTIFACT_LABEL));
-        when(artifactsBusinessLogic.createArtifactPlaceHolderInfo(resource.getUniqueId(), ARTIFACT_LABEL2, (Map<String, Object>) artifactsFromConfig.get(ARTIFACT_LABEL2), USER, ArtifactGroupTypeEnum.TOSCA))
-                .thenReturn(buildArtifactDef(ARTIFACT_LABEL2));
+        when(artifactsBusinessLogic.createArtifactPlaceHolderInfo(resource.getUniqueId(), ARTIFACT_LABEL,
+            (Map<String, Object>) artifactsFromConfig.get(ARTIFACT_LABEL), USER, ArtifactGroupTypeEnum.TOSCA))
+            .thenReturn(buildArtifactDef(ARTIFACT_LABEL));
+        when(artifactsBusinessLogic.createArtifactPlaceHolderInfo(resource.getUniqueId(), ARTIFACT_LABEL2,
+            (Map<String, Object>) artifactsFromConfig.get(ARTIFACT_LABEL2), USER, ArtifactGroupTypeEnum.TOSCA))
+            .thenReturn(buildArtifactDef(ARTIFACT_LABEL2));
         testInstance.setToscaArtifactsPlaceHolders(resource, USER);
 
         Map<String, ArtifactDefinition> toscaArtifacts = resource.getToscaArtifacts();
@@ -128,18 +130,19 @@
     }
 
     @Test
-    public void categorizeOneResource(){
+    public void categorizeOneResource() {
         List<Component> componentList = new ArrayList<>();
         String subCategoryName = "Load Balancer";
         String categoryName = "Application L4+";
         Component component = initComponent(ComponentTypeEnum.RESOURCE, subCategoryName, categoryName);
         componentList.add(component);
-        Map<String,Map<String,List<UiLeftPaletteComponent>>> response = getCategorizedComponents(getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
+        Map<String, Map<String, List<UiLeftPaletteComponent>>> response = getCategorizedComponents(
+            getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
         assertThat(response.get(categoryName).get(subCategoryName).size()).isEqualTo(1);
     }
 
     @Test
-    public void categorizeResourcesSameCategoryDifferentSubcategory(){
+    public void categorizeResourcesSameCategoryDifferentSubcategory() {
         List<Component> componentList = new ArrayList<>();
         String categoryName = "Application L4+";
         String subCategoryName = "Load Balancer";
@@ -148,13 +151,14 @@
         String subCategoryName2 = "Database";
         Component component2 = initComponent(ComponentTypeEnum.RESOURCE, subCategoryName2, categoryName);
         componentList.add(component2);
-        Map<String,Map<String,List<UiLeftPaletteComponent>>> response = getCategorizedComponents(getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
+        Map<String, Map<String, List<UiLeftPaletteComponent>>> response = getCategorizedComponents(
+            getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
         assertThat(response.get(categoryName).get(subCategoryName).size()).isEqualTo(1);
         assertThat(response.get(categoryName).get(subCategoryName2).size()).isEqualTo(1);
     }
 
     @Test
-    public void categorizeResourceAndServiceSameCategoryDifferentSubcategory(){
+    public void categorizeResourceAndServiceSameCategoryDifferentSubcategory() {
         List<Component> componentList = new ArrayList<>();
         String categoryName = "Generic";
         String subCategoryName = "Load Balancer";
@@ -162,25 +166,27 @@
         componentList.add(component);
         Component component2 = initComponent(ComponentTypeEnum.SERVICE, null, categoryName);
         componentList.add(component2);
-        Map<String,Map<String,List<UiLeftPaletteComponent>>> response = getCategorizedComponents(getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
+        Map<String, Map<String, List<UiLeftPaletteComponent>>> response = getCategorizedComponents(
+            getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
         assertThat(response.get(categoryName).get(subCategoryName).size()).isEqualTo(1);
         assertThat(response.get("Generic").get("Generic").size()).isEqualTo(1);
     }
 
     @Test
-    public void categorizeResourcesSameCategorySameSubcategory(){
+    public void categorizeResourcesSameCategorySameSubcategory() {
         List<Component> componentList = new ArrayList<>();
         String categoryName = "Application L4+";
         String subCategoryName = "Load Balancer";
         Component component = initComponent(ComponentTypeEnum.RESOURCE, subCategoryName, categoryName);
         componentList.add(component);
         componentList.add(component);
-        Map<String,Map<String,List<UiLeftPaletteComponent>>> response = getCategorizedComponents(getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
+        Map<String, Map<String, List<UiLeftPaletteComponent>>> response = getCategorizedComponents(
+            getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
         assertThat(response.get(categoryName).get(subCategoryName).size()).isEqualTo(2);
     }
 
     @Test
-    public void categorizeTwoServices(){
+    public void categorizeTwoServices() {
         List<Component> componentList = new ArrayList<>();
         String categoryName = "Application L4+";
         String categoryName2 = "IP Mux Demux";
@@ -188,12 +194,13 @@
         componentList.add(component);
         Component component2 = initComponent(ComponentTypeEnum.SERVICE, null, categoryName2);
         componentList.add(component2);
-        Map<String,Map<String,List<UiLeftPaletteComponent>>> response = getCategorizedComponents(getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
+        Map<String, Map<String, List<UiLeftPaletteComponent>>> response = getCategorizedComponents(
+            getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
         assertThat(response.get("Generic").get("Generic").size()).isEqualTo(2);
     }
 
     @Test
-    public void categorizeTwoResourcesDiffCategory(){
+    public void categorizeTwoResourcesDiffCategory() {
         List<Component> componentList = new ArrayList<>();
         String categoryName = "Application L4+";
         String categoryName2 = "IP Mux Demux";
@@ -202,17 +209,18 @@
         componentList.add(component);
         Component component2 = initComponent(ComponentTypeEnum.RESOURCE, subCategoryName, categoryName2);
         componentList.add(component2);
-        Map<String,Map<String,List<UiLeftPaletteComponent>>> response = getCategorizedComponents(getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
+        Map<String, Map<String, List<UiLeftPaletteComponent>>> response = getCategorizedComponents(
+            getComponentsUtils().convertComponentToUiLeftPaletteComponentObject(componentList));
         assertThat(response.get(categoryName).get(subCategoryName).size()).isEqualTo(1);
         assertThat(response.get(categoryName2).get(subCategoryName).size()).isEqualTo(1);
     }
 
     private Component initComponent(ComponentTypeEnum componentTypeEnum, String subCategoryName, String categoryName) {
         Component component = null;
-        if(componentTypeEnum == ComponentTypeEnum.RESOURCE){
+        if (componentTypeEnum == ComponentTypeEnum.RESOURCE) {
             component = new Resource();
         }
-        if(componentTypeEnum == ComponentTypeEnum.SERVICE){
+        if (componentTypeEnum == ComponentTypeEnum.SERVICE) {
             component = new Service();
         }
         component.setComponentType(componentTypeEnum);
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclaratorTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclaratorTest.java
index 6b5d41d..7b77077 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclaratorTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstanceInputPropertyDeclaratorTest.java
@@ -12,19 +12,22 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.utils.AnnotationBuilder;
 import org.openecomp.sdc.be.components.utils.InputsBuilder;
@@ -59,7 +62,7 @@
 import static org.openecomp.sdc.be.MockGenerator.mockComponentUtils;
 import static org.openecomp.sdc.be.MockGenerator.mockExceptionUtils;
 
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class ComponentInstanceInputPropertyDeclaratorTest extends PropertyDeclaratorTestBase {
 
 
@@ -82,23 +85,23 @@
     private Annotation annotation2;
 
     @Override
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         super.setUp();
         testInstance = new ComponentInstanceInputPropertyDeclarator(mockComponentUtils(), propertyOperation,
-                toscaOperationFacade, componentInstanceBusinessLogic, mockExceptionUtils());
+            toscaOperationFacade, componentInstanceBusinessLogic, mockExceptionUtils());
         annotation1 =  AnnotationBuilder.create()
-                .setType("annotationType1")
-                .setName("annotation1")
-                .addProperty("prop1")
-                .addProperty("prop2")
-                .build();
+            .setType("annotationType1")
+            .setName("annotation1")
+            .addProperty("prop1")
+            .addProperty("prop2")
+            .build();
 
         annotation2 =  AnnotationBuilder.create()
-                .setType("annotationType2")
-                .setName("annotation2")
-                .addProperty("prop3")
-                .build();
+            .setType("annotationType2")
+            .setName("annotation2")
+            .addProperty("prop3")
+            .build();
     }
 
     @Test
@@ -136,10 +139,10 @@
         expectedMap.put(prop1.getName(), expectedProperties);
 
         when(toscaOperationFacade.addComponentInstanceInputsToComponent(eq(resource), anyMap()))
-                .thenReturn(Either.left(expectedMap));
+            .thenReturn(Either.left(expectedMap));
 
         Either<Map<String, List<ComponentInstanceInput>>, StorageOperationStatus> updateEither =
-                (Either<Map<String, List<ComponentInstanceInput>>, StorageOperationStatus>) testInstance.updatePropertiesValues(resource, resource.getUniqueId(), expectedProperties);
+            (Either<Map<String, List<ComponentInstanceInput>>, StorageOperationStatus>) testInstance.updatePropertiesValues(resource, resource.getUniqueId(), expectedProperties);
 
         assertThat(updateEither.isLeft());
         Map<String, List<ComponentInstanceInput>> actualProperties = updateEither.left().value();
@@ -164,12 +167,12 @@
 
         Component component = createComponentWithListInput(INPUT_ID, "innerPropName");
         PropertyDefinition prop = new PropertyDataDefinitionBuilder()
-                .setName("propName")
-                .setValue(generateGetInputValueAsListInput(INPUT_ID, "innerPropName"))
-                .setType("list")
-                .setUniqueId("propName")
-                .addGetInputValue(INPUT_ID)
-                .build();
+            .setName("propName")
+            .setValue(generateGetInputValueAsListInput(INPUT_ID, "innerPropName"))
+            .setType("list")
+            .setUniqueId("propName")
+            .addGetInputValue(INPUT_ID)
+            .build();
         component.setProperties(Collections.singletonList(prop));
 
         List<ComponentInstanceInput> ciPropList = new ArrayList<>();
@@ -207,24 +210,24 @@
     private void verifyInputAnnotations(InputDefinition inputDefinition) {
         List<Annotation> annotations = inputDefinition.getAnnotations();
         assertThat(annotations)
-                .containsExactlyInAnyOrder(annotation1, annotation2);
+            .containsExactlyInAnyOrder(annotation1, annotation2);
     }
 
     private Component createComponentWithInputAndAnnotation(String inputName) {
         InputDefinition input = InputsBuilder.create()
-                .setName(inputName)
-                .addAnnotation(annotation1)
-                .addAnnotation(annotation2)
-                .build();
+            .setName(inputName)
+            .addAnnotation(annotation1)
+            .addAnnotation(annotation2)
+            .build();
         return new ResourceBuilder()
-                .addInput(input)
-                .build();
+            .addInput(input)
+            .build();
     }
 
     private Component createComponentWithListInput(String inputName, String propName) {
         InputDefinition input = InputsBuilder.create()
-                .setName(inputName)
-                .build();
+            .setName(inputName)
+            .build();
 
         input.setUniqueId(INPUT_ID);
         input.setName(INPUT_ID);
@@ -232,8 +235,8 @@
         input.setValue(generateGetInputValueAsListInput(inputName, propName));
 
         return new ResourceBuilder()
-                .setUniqueId(RESOURCE_ID)
-                .addInput(input)
-                .build();
+            .setUniqueId(RESOURCE_ID)
+            .addInput(input)
+            .build();
     }
 }
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclaratorTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclaratorTest.java
index 07deb6a..1ad0757 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclaratorTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentInstancePropertyDeclaratorTest.java
@@ -12,19 +12,22 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ * ================================================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
 import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.openecomp.sdc.be.components.impl.ComponentInstanceBusinessLogic;
 import org.openecomp.sdc.be.components.utils.InputsBuilder;
 import org.openecomp.sdc.be.components.utils.PropertyDataDefinitionBuilder;
@@ -65,8 +68,7 @@
 import static org.openecomp.sdc.be.components.property.CapabilityTestUtils.createCapabilityDefinition;
 import static org.openecomp.sdc.be.components.property.CapabilityTestUtils.createProperties;
 
-
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class ComponentInstancePropertyDeclaratorTest extends PropertyDeclaratorTestBase {
 
     @InjectMocks
@@ -112,7 +114,7 @@
         List<PropertyDataDefinition> properties = Collections.singletonList(prop1);
         List<ComponentInstancePropInput> propsToDeclare = createInstancePropInputList(properties);
         when(toscaOperationFacade.addComponentInstancePropertiesToComponent(eq(resource), instancePropertiesCaptor
-                .capture())).thenReturn(Either.left(Collections.emptyMap()));
+            .capture())).thenReturn(Either.left(Collections.emptyMap()));
 
         CapabilityDefinition capabilityDefinition = createCapabilityDefinition();
 
@@ -127,14 +129,14 @@
         resource.setCapabilities(capabilityMap);
 
         Either<List<InputDefinition>, StorageOperationStatus> createdInputs = testInstance
-                .declarePropertiesAsInputs(resource, "inst1", propsToDeclare);
+            .declarePropertiesAsInputs(resource, "inst1", propsToDeclare);
         Assert.assertTrue(createdInputs.isLeft());
     }
 
     @Test
     public void testUnDeclarePropertiesAsInputs() throws Exception {
         Component component = new ResourceBuilder().setComponentType(ComponentTypeEnum.RESOURCE).setUniqueId("resourceId")
-                .setName("resourceName").build();
+            .setName("resourceName").build();
         InputDefinition input = new InputDefinition();
         input.setUniqueId("ComponentInput1_uniqueId");
         input.setPropertyId("ComponentInput1_uniqueId");
@@ -158,7 +160,7 @@
         component.setCapabilities(capabilityMap);
         component.setInputs(Collections.singletonList(input));
         when(toscaOperationFacade.updateInstanceCapabilityProperty(any(Resource.class), any(),
-                any(ComponentInstanceProperty.class), any(CapabilityDefinition.class))).thenReturn(StorageOperationStatus.OK);
+            any(ComponentInstanceProperty.class), any(CapabilityDefinition.class))).thenReturn(StorageOperationStatus.OK);
 
         StorageOperationStatus result = testInstance.unDeclarePropertiesAsInputs(component, input);
         Assert.assertEquals(StorageOperationStatus.OK, result);
@@ -180,17 +182,17 @@
     @Test
     public void declarePropertiesAsInputs_singleComplexProperty() {
         PropertyDefinition innerProp1 = new PropertyDataDefinitionBuilder()
-                .setName(INNER_PROP1)
-                .setValue("true")
-                .setType("boolean")
-                .setUniqueId(complexProperty.getType() + ".datatype.ecomp_generated_naming")
-                .build();
+            .setName(INNER_PROP1)
+            .setValue("true")
+            .setType("boolean")
+            .setUniqueId(complexProperty.getType() + ".datatype.ecomp_generated_naming")
+            .build();
         PropertyDefinition innerProp2 = new PropertyDataDefinitionBuilder()
-                .setName(INNER_PROP2)
-                .setValue("abc")
-                .setType("string")
-                .setUniqueId(complexProperty.getType() + ".datatype.ecomp_generated_naming")
-                .build();
+            .setName(INNER_PROP2)
+            .setValue("abc")
+            .setType("string")
+            .setUniqueId(complexProperty.getType() + ".datatype.ecomp_generated_naming")
+            .build();
         List<ComponentInstancePropInput> propsToDeclare = createComplexPropInputList(innerProp1, innerProp2);
         when(toscaOperationFacade.addComponentInstancePropertiesToComponent(eq(resource), instancePropertiesCaptor.capture())).thenReturn(Either.left(Collections.emptyMap()));
         Either<List<InputDefinition>, StorageOperationStatus> createdInputs = testInstance.declarePropertiesAsInputs(resource, "inst1", propsToDeclare);
@@ -214,17 +216,17 @@
     @Test
     public void testUndeclareProperty() {
         Service service = new ServiceBuilder()
-                                  .setUniqueId(SERVICE_ID)
-                                  .setName(SERVICE_NAME)
-                                  .build();
+            .setUniqueId(SERVICE_ID)
+            .setName(SERVICE_NAME)
+            .build();
 
 
 
         InputDefinition inputToDelete = InputsBuilder
-                                                .create()
-                                                .setPropertyId(PROPERTY_ID)
-                                                .setName(PROEPRTY_NAME)
-                                                .build();
+            .create()
+            .setPropertyId(PROPERTY_ID)
+            .setName(PROEPRTY_NAME)
+            .build();
 
         inputToDelete.setGetInputValues(getGetInputListForDeclaration());
 
@@ -235,7 +237,7 @@
         when(componentInstanceBusinessLogic.getComponentInstancePropertiesByInputId(any(), any())).thenReturn(new LinkedList<>());
 
         StorageOperationStatus undeclareStatus =
-                testInstance.unDeclarePropertiesAsInputs(service, inputToDelete);
+            testInstance.unDeclarePropertiesAsInputs(service, inputToDelete);
 
         assertThat(undeclareStatus).isEqualTo(StorageOperationStatus.OK);
     }
@@ -252,8 +254,8 @@
 
     private PropertyDefinition getPropertyForDeclaration() {
         return new PropertyDataDefinitionBuilder()
-                       .setUniqueId(PROPERTY_ID)
-                       .build();
+            .setUniqueId(PROPERTY_ID)
+            .build();
     }
 
     @Test
@@ -262,11 +264,11 @@
         List<PropertyDataDefinition> properties = Arrays.asList(prop1, prop2);
         List<ComponentInstancePropInput> propsToDeclare = createInstancePropInputList(properties);
         InputDefinition input = new InputDefinition(new PropertyDataDefinitionBuilder()
-                .setName("listinput")
-                .setType("list")
-                .setDescription("description")
-                .setSchemaType("org.onap.datatype.listinput")
-                .build());
+            .setName("listinput")
+            .setType("list")
+            .setDescription("description")
+            .setSchemaType("org.onap.datatype.listinput")
+            .build());
         // mock returns
         when(toscaOperationFacade.addComponentInstancePropertiesToComponent(eq(resource), instancePropertiesCaptor.capture())).thenReturn(Either.left(Collections.emptyMap()));
         Either<InputDefinition, StorageOperationStatus> result = testInstance.declarePropertiesAsListInput(resource, "inst1", propsToDeclare, input);
@@ -275,7 +277,7 @@
         List<ComponentInstanceProperty> capturedInstanceProperties = instancePropertiesCaptor.getValue().get(INSTANCE_ID);
         assertThat(capturedInstanceProperties.size()).isEqualTo(2);
         Map<String, PropertyDataDefinition> propertiesMap =
-                properties.stream().collect(Collectors.toMap(PropertyDataDefinition::getName, e->e));
+            properties.stream().collect(Collectors.toMap(PropertyDataDefinition::getName, e->e));
         for(ComponentInstanceProperty instanceProperty: capturedInstanceProperties) {
             assertThat(propertiesMap.containsKey(instanceProperty.getName())).isTrue();
             PropertyDataDefinition property = propertiesMap.get(instanceProperty.getName());
@@ -290,11 +292,11 @@
         List<PropertyDataDefinition> properties = Arrays.asList(prop1, prop2);
         List<ComponentInstancePropInput> propsToDeclare = createInstancePropInputList(properties);
         InputDefinition input = new InputDefinition(new PropertyDataDefinitionBuilder()
-                .setName("listinput")
-                .setType("list")
-                .setDescription("description")
-                .setSchemaType("org.onap.datatype.listinput")
-                .build());
+            .setName("listinput")
+            .setType("list")
+            .setDescription("description")
+            .setSchemaType("org.onap.datatype.listinput")
+            .build());
         Either<InputDefinition, StorageOperationStatus> result = testInstance.declarePropertiesAsListInput(resource, "inst2", propsToDeclare, input);
         // validate result
         assertThat(result.isRight()).isTrue();
@@ -310,12 +312,12 @@
 
         Component component = createComponentWithListInput(INPUT_ID, "innerPropName");
         PropertyDefinition prop = new PropertyDataDefinitionBuilder()
-                .setName("propName")
-                .setValue(generateGetInputValueAsListInput(INPUT_ID, "innerPropName"))
-                .setType("list")
-                .setUniqueId("propName")
-                .addGetInputValue(INPUT_ID)
-                .build();
+            .setName("propName")
+            .setValue(generateGetInputValueAsListInput(INPUT_ID, "innerPropName"))
+            .setType("list")
+            .setUniqueId("propName")
+            .addGetInputValue(INPUT_ID)
+            .build();
         component.setProperties(Collections.singletonList(prop));
 
         List<ComponentInstanceProperty> ciPropList = new ArrayList<>();
@@ -458,8 +460,8 @@
 
     private Component createComponentWithListInput(String inputName, String propName) {
         InputDefinition input = InputsBuilder.create()
-                .setName(inputName)
-                .build();
+            .setName(inputName)
+            .build();
 
         input.setUniqueId(INPUT_ID);
         input.setName(INPUT_ID);
@@ -467,8 +469,8 @@
         input.setValue(generateGetInputValueAsListInput(inputName, propName));
 
         return new ResourceBuilder()
-                .setUniqueId(RESOURCE_ID)
-                .addInput(input)
-                .build();
+            .setUniqueId(RESOURCE_ID)
+            .addInput(input)
+            .build();
     }
 }
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclaratorTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclaratorTest.java
index 057c4fb..bc79873 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclaratorTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentPropertyDeclaratorTest.java
@@ -16,18 +16,21 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
 import org.apache.commons.collections.CollectionUtils;
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.openecomp.sdc.be.components.impl.PropertyBusinessLogic;
 import org.openecomp.sdc.be.components.utils.InputsBuilder;
 import org.openecomp.sdc.be.components.utils.PropertyDataDefinitionBuilder;
@@ -55,7 +58,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class ComponentPropertyDeclaratorTest extends PropertyDeclaratorTestBase {
 
     @InjectMocks
@@ -71,7 +74,7 @@
     private static final String SERVICE_UID = "serviceUid";
     private Service service;
 
-    @Before
+    @BeforeEach
     public void init() {
         service = new ServiceBuilder().setUniqueId(SERVICE_UID).build();
     }
@@ -100,7 +103,8 @@
         PropertyDefinition propertyDefinition = new PropertyDefinition();
         resource.setProperties(Collections.singletonList(propertyDefinition));
 
-        when(propertyBusinessLogic.isPropertyUsedByOperation(eq(resource), any(PropertyDefinition.class))).thenReturn(false);
+        when(propertyBusinessLogic.isPropertyUsedByOperation(eq(resource), any(PropertyDefinition.class)))
+            .thenReturn(false);
         StorageOperationStatus status = testInstance.unDeclarePropertiesAsListInputs(resource, input);
         Assert.assertEquals(status, StorageOperationStatus.OK);
     }
@@ -114,7 +118,8 @@
 
         resource.setProperties(new ArrayList<>());
 
-        when(propertyBusinessLogic.isPropertyUsedByOperation(eq(resource), any(PropertyDefinition.class))).thenReturn(false);
+        when(propertyBusinessLogic.isPropertyUsedByOperation(eq(resource), any(PropertyDefinition.class)))
+            .thenReturn(false);
         StorageOperationStatus status = testInstance.unDeclarePropertiesAsListInputs(resource, input);
         Assert.assertEquals(status, StorageOperationStatus.OK);
     }
@@ -153,8 +158,12 @@
         resource.setProperties(Collections.singletonList(propertyDefinition));
 
         when(propertyBusinessLogic.isPropertyUsedByOperation(eq(resource), any())).thenReturn(false);
-        when(propertyOperation.findDefaultValueFromSecondPosition(eq(Collections.emptyList()), eq(propertyDefinition.getUniqueId()), eq(propertyDefinition.getDefaultValue()))).thenReturn(Either.left(propertyDefinition.getDefaultValue()));
-        when(toscaOperationFacade.updatePropertyOfComponent(eq(resource), any())).thenReturn(Either.left(propertyDefinition));
+        when(propertyOperation
+            .findDefaultValueFromSecondPosition(eq(Collections.emptyList()), eq(propertyDefinition.getUniqueId()),
+                eq(propertyDefinition.getDefaultValue())))
+            .thenReturn(Either.left(propertyDefinition.getDefaultValue()));
+        when(toscaOperationFacade.updatePropertyOfComponent(eq(resource), any()))
+            .thenReturn(Either.left(propertyDefinition));
         StorageOperationStatus status = testInstance.unDeclarePropertiesAsListInputs(resource, input);
         Assert.assertEquals(status, StorageOperationStatus.OK);
     }
@@ -178,8 +187,12 @@
         resource.setProperties(Collections.singletonList(propertyDefinition));
 
         when(propertyBusinessLogic.isPropertyUsedByOperation(eq(resource), any())).thenReturn(false);
-        when(propertyOperation.findDefaultValueFromSecondPosition(eq(Collections.emptyList()), eq(propertyDefinition.getUniqueId()), eq(propertyDefinition.getDefaultValue()))).thenReturn(Either.left(propertyDefinition.getDefaultValue()));
-        when(toscaOperationFacade.updatePropertyOfComponent(eq(resource), any())).thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
+        when(propertyOperation
+            .findDefaultValueFromSecondPosition(eq(Collections.emptyList()), eq(propertyDefinition.getUniqueId()),
+                eq(propertyDefinition.getDefaultValue())))
+            .thenReturn(Either.left(propertyDefinition.getDefaultValue()));
+        when(toscaOperationFacade.updatePropertyOfComponent(eq(resource), any()))
+            .thenReturn(Either.right(StorageOperationStatus.NOT_FOUND));
         StorageOperationStatus status = testInstance.unDeclarePropertiesAsListInputs(resource, input);
         Assert.assertEquals(status, StorageOperationStatus.NOT_FOUND);
     }
@@ -198,14 +211,14 @@
     public void updatePropertiesValues_success() {
         PropertyDataDefinition propertyForDeclaration = getPropertyForDeclaration();
         when(toscaOperationFacade.updatePropertyOfComponent(any(Component.class), any(PropertyDefinition.class)))
-                .thenReturn(Either.left(new PropertyDefinition(propertyForDeclaration)));
+            .thenReturn(Either.left(new PropertyDefinition(propertyForDeclaration)));
 
         Either<List<PropertyDataDefinition>, StorageOperationStatus> updateEither =
-                (Either<List<PropertyDataDefinition>, StorageOperationStatus>) testInstance
-                                                                                       .updatePropertiesValues(service,
-                                                                                               SERVICE_UID, Collections
-                                                                                                                    .singletonList(
-                                                                                                                            propertyForDeclaration));
+            (Either<List<PropertyDataDefinition>, StorageOperationStatus>) testInstance
+                .updatePropertiesValues(service,
+                    SERVICE_UID, Collections
+                        .singletonList(
+                            propertyForDeclaration));
 
         assertTrue(updateEither.isLeft());
 
@@ -247,4 +260,4 @@
 
         return getInputValue;
     }
-}
\ No newline at end of file
+}
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclaratorTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclaratorTest.java
index 1619e55..79c9c5e 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclaratorTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/GroupPropertyDeclaratorTest.java
@@ -7,28 +7,30 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.openecomp.sdc.be.components.utils.GroupDefinitionBuilder;
 import org.openecomp.sdc.be.components.utils.PropertyDataDefinitionBuilder;
 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
@@ -53,10 +55,9 @@
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class GroupPropertyDeclaratorTest extends PropertyDeclaratorTestBase {
 
-
     private static final String GROUP_ID = "groupId";
     @InjectMocks
     private GroupPropertyDeclarator groupPropertyDeclarator;
@@ -70,7 +71,7 @@
     private InputDefinition input;
 
     @Override
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         super.setUp();
         resource = createResourceWithGroup();
@@ -212,29 +213,29 @@
 
     private Resource createResourceWithGroups(String ... groups) {
         List<GroupDefinition> groupsDef = Stream.of(groups)
-                .map(this::buildGroup)
-                .collect(Collectors.toList());
+            .map(this::buildGroup)
+            .collect(Collectors.toList());
 
         return new ResourceBuilder()
-                .setUniqueId(RESOURCE_ID)
-                .setGroups(groupsDef)
-                .build();
+            .setUniqueId(RESOURCE_ID)
+            .setGroups(groupsDef)
+            .build();
     }
 
     private GroupDefinition buildGroup(String groupId) {
         return GroupDefinitionBuilder.create()
-                .setUniqueId(groupId)
-                .setName(groupId)
-                .build();
+            .setUniqueId(groupId)
+            .setName(groupId)
+            .build();
     }
 
     private PropertyDataDefinition buildGetInputProperty(String inputId) {
         return new PropertyDataDefinitionBuilder()
-                .addGetInputValue(inputId)
-                .setUniqueId(GROUP_ID + "_" + inputId)
-                .setDefaultValue("defaultValue")
-                .setValue(generateGetInputValue(inputId))
-                .build();
+            .addGetInputValue(inputId)
+            .setUniqueId(GROUP_ID + "_" + inputId)
+            .setDefaultValue("defaultValue")
+            .setValue(generateGetInputValue(inputId))
+            .build();
     }
 
 }
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclaratorTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclaratorTest.java
index 0cbc957..3d7d3e0 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclaratorTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PolicyPropertyDeclaratorTest.java
@@ -7,28 +7,30 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
 package org.openecomp.sdc.be.components.property;
 
 import fj.data.Either;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.openecomp.sdc.be.components.utils.PolicyDefinitionBuilder;
 import org.openecomp.sdc.be.components.utils.PropertyDataDefinitionBuilder;
 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
@@ -52,7 +54,7 @@
 import static org.mockito.Mockito.verifyZeroInteractions;
 import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 //note that testing for most of the common logic is under the ComponentInstancePropertyDeclaratorTest
 public class PolicyPropertyDeclaratorTest extends PropertyDeclaratorTestBase {
 
@@ -69,7 +71,7 @@
     private InputDefinition input;
 
     @Override
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         super.setUp();
         resource = createResourceWithPolicy();
@@ -209,31 +211,29 @@
 
     private Resource createResourceWithPolicies(String ... policies) {
         List<PolicyDefinition> policiesDef = Stream.of(policies)
-                .map(this::buildPolicy)
-                .collect(Collectors.toList());
+            .map(this::buildPolicy)
+            .collect(Collectors.toList());
 
         return new ResourceBuilder()
-                .setUniqueId(RESOURCE_ID)
-                .setPolicies(policiesDef)
-                .build();
+            .setUniqueId(RESOURCE_ID)
+            .setPolicies(policiesDef)
+            .build();
     }
 
     private PolicyDefinition buildPolicy(String policyId) {
         return PolicyDefinitionBuilder.create()
-                .setUniqueId(policyId)
-                .setName(policyId)
-                .build();
+            .setUniqueId(policyId)
+            .setName(policyId)
+            .build();
     }
 
     private PropertyDataDefinition buildGetInputProperty(String inputId) {
         return new PropertyDataDefinitionBuilder()
-                .addGetInputValue(inputId)
-                .setUniqueId(POLICY_ID + "_" + inputId)
-                .setDefaultValue("defaultValue")
-                .setValue(generateGetInputValue(inputId))
-                .build();
+            .addGetInputValue(inputId)
+            .setUniqueId(POLICY_ID + "_" + inputId)
+            .setDefaultValue("defaultValue")
+            .setValue(generateGetInputValue(inputId))
+            .build();
     }
 
-
 }
-
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PropertyDeclaratorTestBase.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PropertyDeclaratorTestBase.java
index 8887843..27144c6 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PropertyDeclaratorTestBase.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/PropertyDeclaratorTestBase.java
@@ -7,20 +7,28 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
 package org.openecomp.sdc.be.components.property;
 
-import org.junit.Before;
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.openecomp.sdc.common.api.Constants.GET_ATTRIBUTE;
+import static org.openecomp.sdc.common.api.Constants.GET_INPUT;
+
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+import org.junit.jupiter.api.BeforeEach;
 import org.openecomp.sdc.be.components.utils.ComponentInstanceBuilder;
 import org.openecomp.sdc.be.components.utils.PropertyDataDefinitionBuilder;
 import org.openecomp.sdc.be.components.utils.ResourceBuilder;
@@ -28,83 +36,94 @@
 import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.ComponentInstancePropInput;
+import org.openecomp.sdc.be.model.ComponentInstancePropOutput;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.Resource;
 
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.assertj.core.api.Assertions.assertThat;
-import static org.openecomp.sdc.common.api.Constants.GET_INPUT;
-
 public class PropertyDeclaratorTestBase {
 
     static final String INNER_PROP1 = "ecomp_generated_naming";
     static final String INNER_PROP2 = "naming_policy";
     static final String RESOURCE_ID = "resourceId";
     static final String INPUT_ID = "inputId";
+    static final String OUTPUT_ID = "outputId";
     static final String INSTANCE_ID = "inst1";
     static final String ORIGIN_INSTANCE_ID = "originInst1";
     PropertyDataDefinition prop1, prop2, complexProperty;
     Resource resource;
 
-    @Before
+    @BeforeEach
     public void setUp() throws Exception {
         prop1 = new PropertyDataDefinitionBuilder()
-                .setUniqueId("prop1")
-                .setType("string")
-                .setName("prop1")
-                .setValue("value1")
-                .build();
+            .setUniqueId("prop1")
+            .setType("string")
+            .setName("prop1")
+            .setValue("value1")
+            .build();
 
         prop2 = new PropertyDataDefinitionBuilder()
-                .setUniqueId("prop2")
-                .setType("string")
-                .setSchemaType("string")
-                .setName("prop2")
-                .setValue("[\"a\", \"b\"]")
-                .build();
+            .setUniqueId("prop2")
+            .setType("string")
+            .setSchemaType("string")
+            .setName("prop2")
+            .setValue("[\"a\", \"b\"]")
+            .build();
 
         complexProperty = new PropertyDataDefinitionBuilder()
-                .setUniqueId("prop3")
-                .setType("org.openecomp.type1")
-                .setName("prop3")
-                .setValue("{\"ecomp_generated_naming\":true\",\"naming_policy\":\"abc\"}")
-                .build();
+            .setUniqueId("prop3")
+            .setType("org.openecomp.type1")
+            .setName("prop3")
+            .setValue("{\"ecomp_generated_naming\":true\",\"naming_policy\":\"abc\"}")
+            .build();
 
         ComponentInstance inst1 = new ComponentInstanceBuilder()
-                .setComponentUid(ORIGIN_INSTANCE_ID)
-                .setId(INSTANCE_ID)
-                .setNormalizedName(INSTANCE_ID)
-                .build();
+            .setComponentUid(ORIGIN_INSTANCE_ID)
+            .setId(INSTANCE_ID)
+            .setNormalizedName(INSTANCE_ID)
+            .build();
 
         resource = new ResourceBuilder()
-                .setUniqueId(RESOURCE_ID)
-                .addComponentInstance(inst1)
-                .build();
+            .setUniqueId(RESOURCE_ID)
+            .addComponentInstance(inst1)
+            .build();
 
     }
 
     List<ComponentInstancePropInput> createInstancePropInputList(List<PropertyDataDefinition> properties) {
         return properties.stream().map(prop -> new ComponentInstancePropInput(new ComponentInstanceProperty(prop)))
-                .collect(Collectors.toList());
+            .collect(Collectors.toList());
     }
 
-    void verifyInputPropertiesList(List<InputDefinition> createdInputs, List<PropertyDataDefinition> capturedUpdatedProperties) {
-        Map<String, InputDefinition> propertyIdToCreatedInput = MapUtil.toMap(createdInputs, InputDefinition::getPropertyId);
-        capturedUpdatedProperties.forEach(updatedProperty -> verifyInputPropertiesList(updatedProperty, propertyIdToCreatedInput.get(updatedProperty.getUniqueId())));
+    List<ComponentInstancePropOutput> createInstancePropOutputList(List<PropertyDataDefinition> properties) {
+        return properties.stream().map(prop -> new ComponentInstancePropOutput(new ComponentInstanceProperty(prop)))
+            .collect(Collectors.toList());
+    }
+
+    void verifyInputPropertiesList(List<InputDefinition> createdInputs,
+                                   List<PropertyDataDefinition> capturedUpdatedProperties) {
+        Map<String, InputDefinition> propertyIdToCreatedInput = MapUtil
+            .toMap(createdInputs, InputDefinition::getPropertyId);
+        capturedUpdatedProperties.forEach(updatedProperty -> verifyInputPropertiesList(updatedProperty,
+            propertyIdToCreatedInput.get(updatedProperty.getUniqueId())));
     }
 
     String generateGetInputValue(String value) {
         return String.format("{\"%s\":\"%s\"}", GET_INPUT, value);
     }
 
+    String generateGetOutputValue(String value) {
+        return String.format("{\"%s\":\"%s\"}", GET_ATTRIBUTE, value);
+    }
+
     String generateGetInputValueAsListInput(String inputName, String inputProperty) {
         return String.format("{\"%s\":[\"%s\",\"INDEX\",\"%s\"]}", GET_INPUT, inputName, inputProperty);
     }
 
+    String generateGetOutputValueAsListOutput(String outputName, String outputProperty) {
+        return String.format("{\"%s\":[\"%s\",\"INDEX\",\"%s\"]}", GET_ATTRIBUTE, outputName, outputProperty);
+    }
+
     private void verifyInputPropertiesList(PropertyDataDefinition updatedProperty, InputDefinition input) {
         assertThat(input.getProperties()).hasSize(1);
         assertThat(new ComponentInstanceProperty(updatedProperty)).isEqualTo(input.getProperties().get(0));
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentPropertyToPolicyDeclaratorTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclaratorTest.java
similarity index 90%
rename from catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentPropertyToPolicyDeclaratorTest.java
rename to catalog-be/src/test/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclaratorTest.java
index 96ba42d..d421427 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/ComponentPropertyToPolicyDeclaratorTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/components/property/propertytopolicydeclarators/ComponentPropertyToPolicyDeclaratorTest.java
@@ -7,30 +7,31 @@
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
 package org.openecomp.sdc.be.components.property;
 
-
 import fj.data.Either;
 import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 import org.mockito.Captor;
 import org.mockito.InjectMocks;
 import org.mockito.Mock;
 import org.mockito.Mockito;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.openecomp.sdc.be.components.property.propertytopolicydeclarators.ComponentPropertyToPolicyDeclarator;
 import org.openecomp.sdc.be.datatypes.elements.GetPolicyValueDataDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
@@ -46,7 +47,7 @@
 import static org.mockito.ArgumentMatchers.eq;
 import static org.mockito.Mockito.when;
 
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class ComponentPropertyToPolicyDeclaratorTest extends PropertyDeclaratorTestBase {
 
     @InjectMocks
@@ -62,7 +63,6 @@
     private static final String POLICY = "policy";
     private static final String TEST_VALUE = "testValue";
 
-
     @Test
     public void testDeclarePropertyToPolicy_success() {
         Service service = new Service();
@@ -70,7 +70,7 @@
 
         when(toscaOperationFacade.updatePropertyOfComponent(eq(service), Mockito.any())).thenReturn(Either.left(new PropertyDefinition()));
         Either<List<PolicyDefinition>, StorageOperationStatus> declareEither = declarator.declarePropertiesAsPolicies(
-                service, OWNER_ID, createInstancePropInputList(Collections.singletonList(prop1)));
+            service, OWNER_ID, createInstancePropInputList(Collections.singletonList(prop1)));
 
         Assert.assertTrue(declareEither.isLeft());
     }
@@ -88,7 +88,7 @@
         when(toscaOperationFacade.updatePropertyOfComponent(eq(service), propertyCaptor.capture())).thenReturn(Either.left(new PropertyDefinition()));
 
         StorageOperationStatus storageOperationStatus =
-                declarator.unDeclarePropertiesAsPolicies(service, policyDefinition);
+            declarator.unDeclarePropertiesAsPolicies(service, policyDefinition);
 
         PropertyDefinition actualProperty = propertyCaptor.getValue();
 
@@ -109,13 +109,13 @@
         when(toscaOperationFacade.updatePropertyOfComponent(eq(service), propertyCaptor.capture())).thenReturn(Either.left(new PropertyDefinition()));
 
         Either<List<PolicyDefinition>, StorageOperationStatus> declareEither = declarator.declarePropertiesAsPolicies(
-                service, OWNER_ID, createInstancePropInputList(Collections.singletonList(prop1)));
+            service, OWNER_ID, createInstancePropInputList(Collections.singletonList(prop1)));
 
         Assert.assertTrue(declareEither.isLeft());
 
         PolicyDefinition policyDefinition = createPolicyDefinition(prop1.getUniqueId());
         StorageOperationStatus storageOperationStatus =
-                declarator.unDeclarePropertiesAsPolicies(service, policyDefinition);
+            declarator.unDeclarePropertiesAsPolicies(service, policyDefinition);
 
         List<PropertyDefinition> actualProperties = propertyCaptor.getAllValues();
 
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsConverterTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java
similarity index 84%
rename from catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsConverterTest.java
rename to catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java
index 93a45ad..59b6e0f 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/utils/InterfacesOperationsConverterTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/InterfacesOperationsConverterTest.java
@@ -1,6 +1,9 @@
-/*
+/*-
+ * ============LICENSE_START=======================================================
+ * SDC
+ * ================================================================================
  * Copyright © 2016-2018 European Support Limited
- *
+ * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
  * You may obtain a copy of the License at
@@ -12,9 +15,11 @@
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
+ * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
-package org.openecomp.sdc.be.tosca.utils;
+package org.openecomp.sdc.be.tosca;
 
 import static org.mockito.Mockito.mock;
 import static org.openecomp.sdc.be.tosca.InterfacesOperationsConverter.SELF;
@@ -32,11 +37,12 @@
 import java.util.function.Function;
 import org.apache.commons.collections4.MapUtils;
 import org.junit.Assert;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.junit.runner.RunWith;
+import org.junit.jupiter.api.BeforeAll;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.junit.MockitoJUnitRunner;
+import org.mockito.junit.jupiter.MockitoExtension;
 import org.onap.sdc.tosca.services.YamlUtil;
 import org.openecomp.sdc.be.DummyConfigurationManager;
 import org.openecomp.sdc.be.config.Configuration;
@@ -61,7 +67,7 @@
 import org.openecomp.sdc.common.util.YamlToObjectConverter;
 import org.openecomp.sdc.tosca.datatypes.ToscaFunctions;
 
-@RunWith(MockitoJUnitRunner.class)
+@ExtendWith(MockitoExtension.class)
 public class InterfacesOperationsConverterTest {
 
     private static final String MAPPED_PROPERTY_NAME = "mapped_property";
@@ -76,16 +82,16 @@
 
     private InterfacesOperationsConverter interfacesOperationsConverter;
 
-    @BeforeClass
+    @BeforeAll
     public static void setUp() {
         mapper = new ObjectMapper();
         mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
     }
 
-    @Before
+    @BeforeEach
     public void setUpBeforeTest() {
         interfacesOperationsConverter =
-                new InterfacesOperationsConverter(new PropertyConvertor());
+            new InterfacesOperationsConverter(new PropertyConvertor());
     }
 
     @Test
@@ -102,10 +108,10 @@
         component.setInterfaces(new HashMap<>());
         component.getInterfaces().put(interfaceType, addedInterface);
         final Map<String, Object> interfaceTypeElement =
-                addInterfaceTypeElement(component, new ArrayList<>());
+            addInterfaceTypeElement(component, new ArrayList<>());
 
-        ToscaExportHandler handler = new ToscaExportHandler(null,null,null,null,null,null, null, null,
-                interfacesOperationsConverter);
+        ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null,
+            interfacesOperationsConverter);
         ToscaTemplate template = new ToscaTemplate("test");
         template.setInterface_types(interfaceTypeElement);
         final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
@@ -130,10 +136,10 @@
         component.setInterfaces(new HashMap<>());
         component.getInterfaces().put(interfaceType, addedInterface);
         final Map<String, Object> interfaceTypeElement =
-                addInterfaceTypeElement(component, new ArrayList<>());
+            addInterfaceTypeElement(component, new ArrayList<>());
 
-        ToscaExportHandler handler = new ToscaExportHandler(null,null,null,null,null,null, null, null,
-                interfacesOperationsConverter);
+        ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null,
+            interfacesOperationsConverter);
         ToscaTemplate template = new ToscaTemplate("testService");
         template.setInterface_types(interfaceTypeElement);
         final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
@@ -158,8 +164,8 @@
         ToscaNodeType nodeType = new ToscaNodeType();
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
-        ToscaExportHandler handler = new ToscaExportHandler(null,null,null,null,null,null, null, null,
-                interfacesOperationsConverter);
+        ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null,null,
+            interfacesOperationsConverter);
         ToscaTemplate template = new ToscaTemplate(NODE_TYPE_NAME);
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put(NODE_TYPE_NAME, nodeType);
@@ -168,7 +174,8 @@
 
         String mainYaml = new String(toscaRepresentation.getMainYaml());
         Assert.assertTrue(all(
-            containsAll("resourceName:", "inputs:", "has description", MAPPED_PROPERTY_NAME, "com.some.resource.or.other.resourceName"),
+            containsAll("resourceName:", "inputs:", "has description", MAPPED_PROPERTY_NAME,
+                "com.some.resource.or.other.resourceName"),
             containsNone("operations", "defaultp")
         ).apply(mainYaml));
 
@@ -188,8 +195,8 @@
         ToscaNodeType nodeType = new ToscaNodeType();
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
-        ToscaExportHandler handler = new ToscaExportHandler(null,null,null,null,null,null, null, null,
-                interfacesOperationsConverter);
+        ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null,null,
+            interfacesOperationsConverter);
         ToscaTemplate template = new ToscaTemplate("testService");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put(NODE_TYPE_NAME, nodeType);
@@ -197,7 +204,8 @@
         final ToscaRepresentation toscaRepresentation = handler.createToscaRepresentation(template);
         String mainYaml = new String(toscaRepresentation.getMainYaml());
         Assert.assertTrue(all(
-            containsAll("serviceName", "inputs:", "has description", MAPPED_PROPERTY_NAME, "com.some.service.or.other.serviceName"),
+            containsAll("serviceName", "inputs:", "has description", MAPPED_PROPERTY_NAME,
+                "com.some.service.or.other.serviceName"),
             containsNone("operations", "defaultp")
         ).apply(mainYaml));
         validateOperationInputs(mainYaml, 2, null);
@@ -216,7 +224,7 @@
         component.setInterfaces(new HashMap<>());
         component.getInterfaces().put(interfaceType, addedInterface);
         Map<String, Object> interfacesMap = interfacesOperationsConverter
-                .getInterfacesMap(component, null, component.getInterfaces(), null, false, true);
+            .getInterfacesMap(component, null, component.getInterfaces(), null, false, true);
         ToscaNodeType nodeType = new ToscaNodeType();
         nodeType.setInterfaces(interfacesMap);
         ToscaExportHandler handler = new ToscaExportHandler();
@@ -228,7 +236,8 @@
 
         String mainYaml = new String(toscaRepresentation.getMainYaml());
         Assert.assertTrue(all(
-            containsAll("resourceName:", "inputs:", "has description", MAPPED_PROPERTY_NAME, "com.some.resource.or.other.resourceName"),
+            containsAll("resourceName:", "inputs:", "has description", MAPPED_PROPERTY_NAME,
+                "com.some.resource.or.other.resourceName"),
             containsNone("operations", "defaultp")
         ).apply(mainYaml));
         validateServiceProxyOperationInputs(mainYaml);
@@ -247,8 +256,8 @@
         ToscaNodeType nodeType = new ToscaNodeType();
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, null, false);
 
-        ToscaExportHandler handler = new ToscaExportHandler(null,null,null,null,null,null, null, null,
-                interfacesOperationsConverter);
+        ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null,
+            interfacesOperationsConverter);
         ToscaTemplate template = new ToscaTemplate("test");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put("test", nodeType);
@@ -270,19 +279,19 @@
         addedInterface.setType(addedInterfaceType);
         addOperationsToInterface(component, addedInterface, 2, 2, true, true);
         addedInterface.getOperationsMap().values().stream()
-                .filter(operationInputDefinition -> operationInputDefinition.getName().equalsIgnoreCase(
-                        "name_for_op_0"))
-                .forEach(operation -> operation.getInputs().getListToscaDataDefinition().stream()
-                        .filter(operationInputDefinition -> operationInputDefinition.getName().contains("integer"))
-                        .forEach(operationInputDefinition -> operationInputDefinition.setInputId(addedInterfaceType +
-                                ".name_for_op_1.output_integer_1")));
+            .filter(operationInputDefinition -> operationInputDefinition.getName().equalsIgnoreCase(
+                "name_for_op_0"))
+            .forEach(operation -> operation.getInputs().getListToscaDataDefinition().stream()
+                .filter(operationInputDefinition -> operationInputDefinition.getName().contains("integer"))
+                .forEach(operationInputDefinition -> operationInputDefinition.setInputId(addedInterfaceType +
+                    ".name_for_op_1.output_integer_1")));
         component.setInterfaces(new HashMap<>());
         component.getInterfaces().put(addedInterfaceType, addedInterface);
         ToscaNodeType nodeType = new ToscaNodeType();
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
-        ToscaExportHandler handler = new ToscaExportHandler(null,null,null,null,null,null, null, null,
-                interfacesOperationsConverter);
+        ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null,
+            interfacesOperationsConverter);
         ToscaTemplate template = new ToscaTemplate("test");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put("test", nodeType);
@@ -305,24 +314,24 @@
         addedInterface.setType(addedInterfaceType);
         addOperationsToInterface(component, addedInterface, 2, 2, true, true);
         addedInterface.getOperationsMap().values().stream()
-                .filter(operationInputDefinition -> operationInputDefinition.getName().equalsIgnoreCase(
-                        "name_for_op_0"))
-                .forEach(operation -> operation.getInputs().getListToscaDataDefinition().stream()
-                        .filter(opInputDef -> opInputDef.getName().contains("integer"))
-                        .forEach(opInputDef -> opInputDef.setInputId(
-                                addedInterfaceType +".name_for_op_1.output_integer_1")));
+            .filter(operationInputDefinition -> operationInputDefinition.getName().equalsIgnoreCase(
+                "name_for_op_0"))
+            .forEach(operation -> operation.getInputs().getListToscaDataDefinition().stream()
+                .filter(opInputDef -> opInputDef.getName().contains("integer"))
+                .forEach(opInputDef -> opInputDef.setInputId(
+                    addedInterfaceType + ".name_for_op_1.output_integer_1")));
         //Mapping to operation from another interface
         String secondInterfaceType = "org.test.lifecycle.standard.interfaceType.second";
         InterfaceDefinition secondInterface = new InterfaceDefinition();
         secondInterface.setType(secondInterfaceType);
         addOperationsToInterface(component, secondInterface, 2, 2, true, true);
         secondInterface.getOperationsMap().values().stream()
-                .filter(operationInputDefinition -> operationInputDefinition.getName().equalsIgnoreCase(
-                        "name_for_op_0"))
-                .forEach(operation -> operation.getInputs().getListToscaDataDefinition().stream()
-                        .filter(opInputDef -> opInputDef.getName().contains("integer"))
-                        .forEach(opInputDef -> opInputDef.setInputId(
-                                addedInterfaceType +".name_for_op_1.output_integer_1")));
+            .filter(operationInputDefinition -> operationInputDefinition.getName().equalsIgnoreCase(
+                "name_for_op_0"))
+            .forEach(operation -> operation.getInputs().getListToscaDataDefinition().stream()
+                .filter(opInputDef -> opInputDef.getName().contains("integer"))
+                .forEach(opInputDef -> opInputDef.setInputId(
+                    addedInterfaceType + ".name_for_op_1.output_integer_1")));
         component.setInterfaces(new HashMap<>());
         component.getInterfaces().put(addedInterfaceType, addedInterface);
         component.getInterfaces().put(secondInterfaceType, secondInterface);
@@ -330,8 +339,8 @@
         ToscaNodeType nodeType = new ToscaNodeType();
         interfacesOperationsConverter.addInterfaceDefinitionElement(component, nodeType, dataTypes, false);
 
-        ToscaExportHandler handler = new ToscaExportHandler(null,null,null,null,null,null, null, null,
-                interfacesOperationsConverter);
+        ToscaExportHandler handler = new ToscaExportHandler(null, null, null, null, null, null, null, null, null,
+            interfacesOperationsConverter);
         ToscaTemplate template = new ToscaTemplate("test");
         Map<String, ToscaNodeType> nodeTypes = new HashMap<>();
         nodeTypes.put("test", nodeType);
@@ -347,17 +356,19 @@
     }
 
     @FunctionalInterface
-    interface MainYamlAssertion extends Function<String, Boolean> {}
+    interface MainYamlAssertion extends Function<String, Boolean> {
 
-    private static Function<String, Boolean> all(MainYamlAssertion...fs) {
+    }
+
+    private static Function<String, Boolean> all(MainYamlAssertion... fs) {
         return s -> io.vavr.collection.List.of(fs).map(f -> f.apply(s)).fold(true, (l, r) -> l && r);
     }
 
-    private static MainYamlAssertion containsNone(String...expected) {
+    private static MainYamlAssertion containsNone(String... expected) {
         return s -> io.vavr.collection.List.of(expected).map(e -> !s.contains(e)).fold(true, (l, r) -> l && r);
     }
 
-    private static MainYamlAssertion containsAll(String...expected) {
+    private static MainYamlAssertion containsAll(String... expected) {
         return s -> io.vavr.collection.List.of(expected).map(s::contains).fold(true, (l, r) -> l && r);
     }
 
@@ -377,7 +388,7 @@
             }
             if (hasOutputs) {
                 operation.setOutputs(createOutputs(addedInterface.getToscaResourceName(),
-                        operation.getName(), numOfInputsPerOp));
+                    operation.getName(), numOfInputsPerOp));
             }
             addedInterface.getOperations().put(operation.getName(), operation);
         }
@@ -388,7 +399,7 @@
         for (int i = 0; i < numOfInputs; i++) {
             String mappedPropertyName = java.util.UUID.randomUUID().toString() + "." + MAPPED_PROPERTY_NAME + i;
             operationInputDefinitionList.add(createMockOperationInputDefinition(
-                    INPUT_NAME_PREFIX + inputTypes[i] + "_" + i, mappedPropertyName, i));
+                INPUT_NAME_PREFIX + inputTypes[i] + "_" + i, mappedPropertyName, i));
             addMappedPropertyAsComponentInput(component, mappedPropertyName);
 
         }
@@ -411,7 +422,7 @@
         ListDataDefinition<OperationOutputDefinition> operationOutputDefinitionList = new ListDataDefinition<>();
         for (int i = 0; i < numOfOutputs; i++) {
             operationOutputDefinitionList.add(createMockOperationOutputDefinition(interfaceName, operationName,
-                    OUTPUT_NAME_PREFIX + inputTypes[i] + "_" + i, i));
+                OUTPUT_NAME_PREFIX + inputTypes[i] + "_" + i, i));
         }
         return operationOutputDefinitionList;
     }
@@ -451,8 +462,8 @@
     private void validateOperationInputs(final String mainYaml, int numOfInputsPerOp, String mappedOperationName) {
         String nodeTypeKey = NODE_TYPE_NAME + ":";
         String nodeTypesRepresentation = mainYaml.substring(mainYaml.indexOf(nodeTypeKey) + nodeTypeKey.length(),
-                mainYaml.lastIndexOf(MAPPED_PROPERTY_NAME) + MAPPED_PROPERTY_NAME.length()
-                        + String.valueOf(numOfInputsPerOp).length());
+            mainYaml.lastIndexOf(MAPPED_PROPERTY_NAME) + MAPPED_PROPERTY_NAME.length()
+                + String.valueOf(numOfInputsPerOp).length());
         YamlToObjectConverter objectConverter = new YamlToObjectConverter();
         ToscaNodeType toscaNodeType = objectConverter.convert(nodeTypesRepresentation.getBytes(), ToscaNodeType.class);
         Map<String, Object> interfaces = toscaNodeType.getInterfaces();
@@ -463,7 +474,7 @@
                 if (operationVal instanceof Map) {
                     //Since the inputs are mapped to output operations from only first interface so using that name
                     validateOperationInputDefinition(interfaces.keySet().iterator().next(), mappedOperationName,
-                            operationVal);
+                        operationVal);
                 }
             }
         }
@@ -479,7 +490,7 @@
             Boolean expectedIsRequired = Integer.parseInt(inputNameSplit[2]) % 2 == 0;
             Assert.assertEquals(expectedIsRequired, inputValueObject.get("required"));
             validateOperationInputDefinitionDefaultValue(interfaceType, operationName, inputNameSplit[1],
-                    Integer.parseInt(inputNameSplit[2]), inputValueObject);
+                Integer.parseInt(inputNameSplit[2]), inputValueObject);
         }
     }
 
@@ -488,14 +499,16 @@
                                                               String inputType, int index,
                                                               Map<String, Object> inputValueObject) {
         Map<String, Object> mappedInputValue = (Map<String, Object>) inputValueObject.get("default");
-        if(mappedInputValue.containsKey(ToscaFunctions.GET_PROPERTY.getFunctionName())) {
+        if (mappedInputValue.containsKey(ToscaFunctions.GET_PROPERTY.getFunctionName())) {
             String mappedPropertyValue = MAPPED_PROPERTY_NAME + index;
-            List<String> mappedPropertyDefaultValue = (List<String>) mappedInputValue.get(ToscaFunctions.GET_PROPERTY.getFunctionName());
+            List<String> mappedPropertyDefaultValue = (List<String>) mappedInputValue
+                .get(ToscaFunctions.GET_PROPERTY.getFunctionName());
             Assert.assertEquals(2, mappedPropertyDefaultValue.size());
             Assert.assertTrue(mappedPropertyDefaultValue.contains(SELF));
             Assert.assertTrue(mappedPropertyDefaultValue.contains(mappedPropertyValue));
-        } else if(mappedInputValue.containsKey(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName())) {
-            List<String> mappedPropertyDefaultValue = (List<String>) mappedInputValue.get(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName());
+        } else if (mappedInputValue.containsKey(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName())) {
+            List<String> mappedPropertyDefaultValue = (List<String>) mappedInputValue
+                .get(ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName());
             Assert.assertEquals(4, mappedPropertyDefaultValue.size());
             String mappedPropertyValue = OUTPUT_NAME_PREFIX + inputType + "_" + index;
             Assert.assertTrue(mappedPropertyDefaultValue.contains(SELF));
@@ -503,15 +516,16 @@
             Assert.assertTrue(mappedPropertyDefaultValue.contains(operationName));
             Assert.assertTrue(mappedPropertyDefaultValue.contains(mappedPropertyValue));
         } else {
-            Assert.fail("Invalid Tosca function in default value. Allowed values: "+ ToscaFunctions.GET_PROPERTY.getFunctionName() +
-                    "/"+ ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName());
+            Assert.fail("Invalid Tosca function in default value. Allowed values: " + ToscaFunctions.GET_PROPERTY
+                .getFunctionName() +
+                "/" + ToscaFunctions.GET_OPERATION_OUTPUT.getFunctionName());
         }
     }
 
     private void validateServiceProxyOperationInputs(String mainYaml) {
         String nodeTypeKey = NODE_TYPE_NAME + ":";
         String nodeTypesRepresentation = mainYaml.substring(mainYaml.indexOf(nodeTypeKey) + nodeTypeKey.length(),
-                mainYaml.lastIndexOf(MAPPED_PROPERTY_NAME) + MAPPED_PROPERTY_NAME.length());
+            mainYaml.lastIndexOf(MAPPED_PROPERTY_NAME) + MAPPED_PROPERTY_NAME.length());
         YamlUtil yamlUtil = new YamlUtil();
         ToscaNodeType toscaNodeType = yamlUtil.yamlToObject(nodeTypesRepresentation, ToscaNodeType.class);
         for (Object interfaceVal : toscaNodeType.getInterfaces().values()) {
@@ -537,13 +551,14 @@
         service.setComponentMetadataDefinition(new ServiceMetadataDefinition());
         service.getComponentMetadataDefinition().getMetadataDataDefinition().setName("LocalInterface");
         service.getComponentMetadataDefinition().getMetadataDataDefinition().setSystemName("LocalInterface");
-        service.setInterfaces(Collections.singletonMap("Local", new InterfaceDefinition("Local", null, new HashMap<>())));
+        service
+            .setInterfaces(Collections.singletonMap("Local", new InterfaceDefinition("Local", null, new HashMap<>())));
 
         Map<String, Object> resultMap = InterfacesOperationsConverter.addInterfaceTypeElement(service,
-                Collections.singletonList("org.openecomp.interfaces.node.lifecycle.Standard"));
+            Collections.singletonList("org.openecomp.interfaces.node.lifecycle.Standard"));
 
         Assert.assertTrue(MapUtils.isNotEmpty(resultMap)
-                && resultMap.containsKey("org.openecomp.interfaces.node.lifecycle.LocalInterface"));
+            && resultMap.containsKey("org.openecomp.interfaces.node.lifecycle.LocalInterface"));
     }
 
     @Test
@@ -552,12 +567,12 @@
         service.setComponentMetadataDefinition(new ServiceMetadataDefinition());
         service.getComponentMetadataDefinition().getMetadataDataDefinition().setName("LocalInterface");
         service.setInterfaces(Collections.singletonMap("NotLocal", new InterfaceDefinition("NotLocal", null,
-                new HashMap<>())));
+            new HashMap<>())));
 
         Map<String, Object> resultMap = interfacesOperationsConverter.getInterfacesMap(service, null,
-                service.getInterfaces(), null, false, false);
+            service.getInterfaces(), null, false, false);
 
         Assert.assertTrue(MapUtils.isNotEmpty(resultMap)
-                && resultMap.containsKey("NotLocal"));
+            && resultMap.containsKey("NotLocal"));
     }
 }
diff --git a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/ToscaExportHandlerTest.java b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/ToscaExportHandlerTest.java
index d54fc98..7847f11 100644
--- a/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/ToscaExportHandlerTest.java
+++ b/catalog-be/src/test/java/org/openecomp/sdc/be/tosca/ToscaExportHandlerTest.java
@@ -16,8 +16,9 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  * ============LICENSE_END=========================================================
+ * Modifications copyright (c) 2020, Nordix Foundation
+ * ================================================================================
  */
-
 package org.openecomp.sdc.be.tosca;
 
 import static org.hamcrest.CoreMatchers.is;
@@ -101,6 +102,7 @@
 import org.openecomp.sdc.be.tosca.model.ToscaTemplateRequirement;
 import org.openecomp.sdc.be.tosca.model.ToscaTopolgyTemplate;
 import org.openecomp.sdc.be.tosca.utils.InputConverter;
+import org.openecomp.sdc.be.tosca.utils.OutputConverter;
 
 public class ToscaExportHandlerTest extends BeConfDependentTest {
 
@@ -128,6 +130,9 @@
     private InputConverter inputConverter;
 
     @Mock
+    private OutputConverter outputConverter;
+
+    @Mock
     private GroupExportParser groupExportParser;
 
     @Mock
@@ -148,9 +153,9 @@
     @Before
     public void setUpMock() throws Exception {
         MockitoAnnotations.initMocks(this);
-		doReturn(new ToscaProperty()).when(propertyConvertor).convertProperty(any(), any(), eq(PROPERTY));
+        doReturn(new ToscaProperty()).when(propertyConvertor).convertProperty(any(), any(), eq(PROPERTY));
         doReturn(new HashMap<String, Object>()).when(interfacesOperationsConverter)
-                .getInterfacesMap(any(), isNull(), anyMap(), anyMap(), anyBoolean(), anyBoolean());
+            .getInterfacesMap(any(), isNull(), anyMap(), anyMap(), anyBoolean(), anyBoolean());
     }
 
     private Resource getNewResource() {
@@ -377,8 +382,8 @@
 
         Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
 
-        Mockito.when(inputConverter.convertInputs(any(List.class), any(Map.class)))
-            .thenReturn(new HashMap<>());
+        Mockito.when(inputConverter.convertInputs(any(List.class), any(Map.class))).thenReturn(new HashMap<>());
+        Mockito.when(outputConverter.convertOutputs(any(List.class), any(Map.class))).thenReturn(new HashMap<>());
 
         Mockito.when(groupExportParser.getGroups(component))
             .thenReturn(null);
@@ -419,6 +424,7 @@
         Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
 
         Mockito.when(inputConverter.convertInputs(anyList(), anyMap())).thenReturn(new HashMap<>());
+        Mockito.when(outputConverter.convertOutputs(anyList(), anyMap())).thenReturn(new HashMap<>());
         // test component contains group
         result = Deencapsulation.invoke(testSubject, "convertToscaTemplate", component, toscaNode);
         Assert.assertNotNull(result);
@@ -997,11 +1003,11 @@
         result = Deencapsulation.invoke(testSubject, "createProxyNodeTypes", componentCache, container);
         Assert.assertNotNull(result);
     }
-    
+
     @Test
     public void testCreateServiceSubstitutionNodeTypes() throws Exception {
         Map<String, Component> componentCache = new HashMap<>();
-              
+
         Component referencedService = getNewService();
         referencedService.setInvariantUUID("uuid");
         referencedService.setUUID("uuid");
@@ -1017,7 +1023,7 @@
 
         componentInstances.add(instance);
         containerService.setComponentInstances(componentInstances);
-        
+
         Mockito.when(interfaceLifecycleOperation.getAllInterfaceLifecycleTypes())
             .thenReturn(Either.left(Collections.emptyMap()));
         Mockito.when(dataTypeCache.getAll()).thenReturn(Either.left(new HashMap<>()));
@@ -1481,7 +1487,7 @@
     public void testGetProxyNodeTypeInterfacesNoInterfaces() {
         Component service = new Service();
         Optional<Map<String, Object>> proxyNodeTypeInterfaces =
-                testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
         Assert.assertFalse(proxyNodeTypeInterfaces.isPresent());
     }
 
@@ -1489,7 +1495,7 @@
     public void testGetProxyNodeTypeInterfaces() {
         Component service = getTestComponent();
         Optional<Map<String, Object>> proxyNodeTypeInterfaces =
-                testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
         Assert.assertTrue(proxyNodeTypeInterfaces.isPresent());
         Map<String, Object> componentInterfaces = proxyNodeTypeInterfaces.get();
         Assert.assertNotNull(componentInterfaces);
@@ -1499,7 +1505,7 @@
     @Test
     public void testGetProxyNodeTypePropertiesComponentNull() {
         Optional<Map<String, ToscaProperty>> proxyNodeTypeProperties =
-                testSubject.getProxyNodeTypeProperties(null, DATA_TYPES);
+            testSubject.getProxyNodeTypeProperties(null, DATA_TYPES);
         Assert.assertFalse(proxyNodeTypeProperties.isPresent());
     }
 
@@ -1507,7 +1513,7 @@
     public void testGetProxyNodeTypePropertiesNoProperties() {
         Component service = new Service();
         Optional<Map<String, ToscaProperty>> proxyNodeTypeProperties =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
         Assert.assertFalse(proxyNodeTypeProperties.isPresent());
     }
 
@@ -1515,9 +1521,9 @@
     public void testGetProxyNodeTypeProperties() {
         Component service = getTestComponent();
         service.setProperties(Arrays.asList(createMockProperty("componentPropStr", "Default String Prop"),
-                createMockProperty("componentPropInt", null)));
+            createMockProperty("componentPropInt", null)));
         Optional<Map<String, ToscaProperty>> proxyNodeTypeProperties =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
         Assert.assertTrue(proxyNodeTypeProperties.isPresent());
         Map<String, ToscaProperty> componentProperties = proxyNodeTypeProperties.get();
         Assert.assertNotNull(componentProperties);
@@ -1528,9 +1534,9 @@
     public void testAddInputsToPropertiesNoInputs() {
         Component service = getTestComponent();
         service.setProperties(Arrays.asList(createMockProperty("componentPropStr", "Default String Prop"),
-                createMockProperty("componentPropInt", null)));
+            createMockProperty("componentPropInt", null)));
         Optional<Map<String, ToscaProperty>> proxyNodeTypePropertiesResult =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
 
         Assert.assertTrue(proxyNodeTypePropertiesResult.isPresent());
         Map<String, ToscaProperty> proxyNodeTypeProperties = proxyNodeTypePropertiesResult.get();
@@ -1545,11 +1551,11 @@
     public void testAddInputsToPropertiesWithInputs() {
         Component service = getTestComponent();
         service.setProperties(Arrays.asList(createMockProperty("componentPropStr", "Default String Prop"),
-                createMockProperty("componentPropInt", null)));
+            createMockProperty("componentPropInt", null)));
         service.setInputs(Arrays.asList(createMockInput("componentInputStr1",
-                "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
+            "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
         Optional<Map<String, ToscaProperty>> proxyNodeTypePropertiesResult =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
 
         Assert.assertTrue(proxyNodeTypePropertiesResult.isPresent());
         Map<String, ToscaProperty> proxyNodeTypeProperties = proxyNodeTypePropertiesResult.get();
@@ -1562,9 +1568,9 @@
     public void testAddInputsToPropertiesOnlyInputs() {
         Component service = getTestComponent();
         service.setInputs(Arrays.asList(createMockInput("componentInputStr1",
-                "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
+            "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
         Optional<Map<String, ToscaProperty>> proxyNodeTypePropertiesResult =
-                testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeProperties(service, DATA_TYPES);
 
         Assert.assertTrue(proxyNodeTypePropertiesResult.isPresent());
         Map<String, ToscaProperty> proxyNodeTypeProperties = proxyNodeTypePropertiesResult.get();
@@ -1577,7 +1583,7 @@
     public void testOperationImplementationInProxyNodeTypeNotPresent() {
         Component service = getTestComponent();
         InterfaceDefinition interfaceDefinition =
-                service.getInterfaces().get("normalizedServiceComponentName-interface");
+            service.getInterfaces().get("normalizedServiceComponentName-interface");
         interfaceDefinition.setOperations(new HashMap<>());
         final OperationDataDefinition operation = new OperationDataDefinition();
         operation.setName("start");
@@ -1588,9 +1594,9 @@
         interfaceDefinition.getOperations().put(operation.getName(), operation);
         service.getInterfaces().put("normalizedServiceComponentName-interface", interfaceDefinition);
         service.setInputs(Arrays.asList(createMockInput("componentInputStr1",
-                "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
+            "Default String Input1"), createMockInput("componentInputStr2", "Default String Input2")));
         Optional<Map<String, Object>> proxyNodeTypeInterfaces =
-                testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
+            testSubject.getProxyNodeTypeInterfaces(service, DATA_TYPES);
         Assert.assertTrue(proxyNodeTypeInterfaces.isPresent());
         Map<String, Object> componentInterfaces = proxyNodeTypeInterfaces.get();
         Assert.assertNotNull(componentInterfaces);
diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
index cdb10a7..2726f93 100644
--- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
+++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/api/ActionStatus.java
@@ -98,6 +98,8 @@
 
     // Inputs
     INPUT_IS_NOT_CHILD_OF_COMPONENT,
+    // Outputs
+    OUTPUT_IS_NOT_CHILD_OF_COMPONENT,
     CFVC_LOOP_DETECTED,
     //Forwarding Path related
     FORWARDING_PATH_NAME_MAXIMUM_LENGTH, FORWARDING_PATH_NAME_ALREADY_IN_USE, FORWARDING_PATH_NAME_EMPTY,
diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/EdgeLabelEnum.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/EdgeLabelEnum.java
index dab7444..67d4406 100644
--- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/EdgeLabelEnum.java
+++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/EdgeLabelEnum.java
@@ -42,9 +42,11 @@
     CREATOR,
     SUB_CATEGORY,
     INPUTS,
+    OUTPUTS,
     GROUPS,
     INST_PROPERTIES,
     INST_INPUTS,
+    INST_OUTPUTS,
     INST_ATTRIBUTES,
     INST_GROUPS,
     SERVICE_API_ARTIFACTS,
diff --git a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/VertexTypeEnum.java b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/VertexTypeEnum.java
index 79c2ec4..e984beb 100644
--- a/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/VertexTypeEnum.java
+++ b/catalog-dao/src/main/java/org/openecomp/sdc/be/dao/jsongraph/types/VertexTypeEnum.java
@@ -68,10 +68,12 @@
 	ADDITIONAL_INFORMATION		("additional_information",    AdditionalInfoParameterDataDefinition.class),
 	USER						("user",						null),
 	INPUTS						("inputs",					PropertyDataDefinition.class),
+	OUTPUTS						("outputs",					PropertyDataDefinition.class),
 	GROUPS						("groups",					GroupDataDefinition.class),
 	INST_ATTRIBUTES				("instAttributes",			MapPropertiesDataDefinition.class),
 	INST_PROPERTIES				("instProperties",			MapPropertiesDataDefinition.class),
 	INST_INPUTS					("instInputs",				MapPropertiesDataDefinition.class),
+	INST_OUTPUTS				("instOutputs",				MapPropertiesDataDefinition.class),
 	INST_GROUPS					("instGroups",				MapGroupsDataDefinition.class),
 	SERVICE_API_ARTIFACTS		("serviceApiArtifacts",		ArtifactDataDefinition.class),
 	CALCULATED_CAPABILITIES 	("calculatedCapabilities",	MapListCapabilityDataDefinition.class),
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java
index 4665ea0..26820b1 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Component.java
@@ -72,12 +72,14 @@
     private List<ComponentInstance> componentInstances;
     private List<RequirementCapabilityRelDef> componentInstancesRelations;
     private Map<String, List<ComponentInstanceInput>> componentInstancesInputs;
+    private Map<String, List<ComponentInstanceOutput>> componentInstancesOutputs;
     private Map<String, List<ComponentInstanceProperty>> componentInstancesProperties;
     private Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes;
     private Map<String, List<CapabilityDefinition>> capabilities;
     private Map<String, List<RequirementDefinition>> requirements;
     private Map<String, List<ComponentInstanceInterface>> componentInstancesInterfaces;
     private List<InputDefinition> inputs;
+    private List<OutputDefinition> outputs;
     private List<GroupDefinition> groups;
     private Map<String, PolicyDefinition> policies;
     private String derivedFromGenericType;
@@ -244,6 +246,11 @@
         return inputs == null ? new ArrayList<>() : inputs;
     }
 
+    public List<OutputDefinition> safeGetOutputs() {
+        return outputs == null ? new ArrayList<>() : outputs;
+    }
+
+
     public String getUUID() {
         return componentMetadataDefinition.getMetadataDataDefinition().getUUID();
     }
@@ -362,6 +369,10 @@
                 .collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
     }
 
+    public Map<String, List<ComponentInstanceOutput>> safeGetComponentInstancesOutputs() {
+        return componentInstancesOutputs == null ? emptyMap() : componentInstancesOutputs;
+    }
+
     public List<ComponentInstanceProperty> safeGetComponentInstanceProperties(String cmptInstacneId) {
         return this.safeGetComponentInstanceEntity(cmptInstacneId, this.componentInstancesProperties);
     }
@@ -480,7 +491,7 @@
             this.properties = new ArrayList<>();
         }
 
-        this.properties.add(propertyDefinition);;
+        this.properties.add(propertyDefinition);
     }
 
     public void addCategory(String category, String subCategory) {
@@ -616,6 +627,11 @@
         return true;
     }
 
+    public boolean shouldGenerateOutputs() {
+        // Implement where needed
+        return true;
+    }
+
     public boolean deriveFromGeneric() {
         // Implement where needed
         return true;
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstListInput.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstListInput.java
index ee4bef2..9b6dba0 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstListInput.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstListInput.java
@@ -20,47 +20,20 @@
 
 package org.openecomp.sdc.be.model;
 
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
 /**
- * Represents a pair of a list of properties to be declared and a "list input" to be created.
- * This class is used for passing parameters on creating a list input.
+ * Represents a pair of a list of properties to be declared and a "list input" to be created. This class is used for
+ * passing parameters on creating a list input.
  */
+@Getter
+@Setter
+@NoArgsConstructor
 public class ComponentInstListInput {
+
     private ComponentInstInputsMap componentInstInputsMap;
     private InputDefinition listInput;
 
-    /**
-     * Gets componentInstInputsMap which includes properties to be declared.
-     *
-     * @return componentInstInputsMap
-     */
-    public ComponentInstInputsMap getComponentInstInputsMap() {
-        return componentInstInputsMap;
-    }
-
-    /**
-     * Sets componentInstInputsMap.
-     *
-     * @param componentInstInputsMap
-     */
-    public void setComponentInstInputsMap(ComponentInstInputsMap componentInstInputsMap) {
-        this.componentInstInputsMap = componentInstInputsMap;
-    }
-
-    /**
-     * Gets the input to be created.
-     *
-     * @return the list input
-     */
-    public InputDefinition getListInput() {
-        return listInput;
-    }
-
-    /**
-     * Sets the input to be created.
-     *
-     * @param listInput
-     */
-    public void setListInput(InputDefinition listInput) {
-        this.listInput = listInput;
-    }
 }
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstListOutput.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstListOutput.java
new file mode 100644
index 0000000..80cc711
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstListOutput.java
@@ -0,0 +1,38 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+/**
+ * Represents a pair of a list of properties to be declared and a "list output" to be created. This class is used for
+ * passing parameters on creating a list output.
+ */
+@Getter
+@Setter
+@NoArgsConstructor
+public class ComponentInstListOutput {
+
+    private ComponentInstOutputsMap componentInstOutputsMap;
+    private OutputDefinition outputDefinition;
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstOutputsMap.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstOutputsMap.java
new file mode 100644
index 0000000..c877193
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstOutputsMap.java
@@ -0,0 +1,59 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import static org.apache.commons.collections.MapUtils.isNotEmpty;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import lombok.Setter;
+import org.apache.commons.lang3.tuple.Pair;
+
+@Setter
+public class ComponentInstOutputsMap {
+
+    private Map<String, List<ComponentInstancePropOutput>> componentInstanceOutputsMap;
+    private Map<String, List<ComponentInstancePropOutput>> componentInstanceProperties;
+
+    public Pair<String, List<ComponentInstancePropOutput>> resolvePropertiesToDeclare() {
+        if (isNotEmpty(componentInstanceOutputsMap)) {
+            return singleMapEntry(componentInstanceOutputsMap);
+        }
+        if (isNotEmpty(componentInstanceProperties)) {
+            return singleMapEntry(componentInstanceProperties);
+        }
+        throw new IllegalStateException("there are no properties selected for declaration");
+    }
+
+    private Pair<String, List<ComponentInstancePropOutput>> singleMapEntry(Map<String, List<ComponentInstancePropOutput>> propertiesMap) {
+        Map.Entry<String, List<ComponentInstancePropOutput>> singleEntry = propertiesMap.entrySet().iterator().next();
+        return Pair.of(singleEntry.getKey(), singleEntry.getValue());
+    }
+
+    public Map<String, List<ComponentInstancePropOutput>> getComponentInstanceOutputsMap() {
+        return componentInstanceOutputsMap == null ? new HashMap<>() : componentInstanceOutputsMap;
+    }
+
+    public Map<String, List<ComponentInstancePropOutput>> getComponentInstanceProperties() {
+        return componentInstanceProperties == null ? new HashMap<>() : componentInstanceProperties;
+    }
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstance.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstance.java
index fd4feeb..d75584d 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstance.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstance.java
@@ -47,7 +47,9 @@
     private Map<String, Object> interfaces;
     private List<PropertyDefinition> properties;
     private CINodeFilterDataDefinition nodeFilter;
+    private SubstitutionFilterDataDefinition substitutionFilter;
     private List<InputDefinition> inputs;
+    private List<OutputDefinition> outputs;
 
     public ComponentInstance() {
         super();
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceOutput.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceOutput.java
new file mode 100644
index 0000000..2177677
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstanceOutput.java
@@ -0,0 +1,72 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import java.util.List;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyRule;
+
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode
+public class ComponentInstanceOutput extends OutputDefinition
+    implements IComponentInstanceConnectedElement, IPropertyOutputCommon {
+
+    /**
+     * The unique id of the property value on graph
+     */
+    private String valueUniqueUid;
+    private List<String> path = null;
+    private List<PropertyRule> rules = null;
+    private String componentInstanceName;
+    private String componentInstanceId;
+
+    public ComponentInstanceOutput(final PropertyDataDefinition propertyDataDefinition,
+                                   final String outputId,
+                                   final String value,
+                                   final String valueUniqueUid) {
+        super(propertyDataDefinition);
+        setOutputId(outputId);
+        setValue(value);
+        this.valueUniqueUid = valueUniqueUid;
+    }
+
+    public ComponentInstanceOutput(final OutputDefinition outputDefinition,
+                                   final String value,
+                                   final String valueUniqueUid) {
+        super(outputDefinition);
+        setValue(value);
+        this.valueUniqueUid = valueUniqueUid;
+    }
+
+    public ComponentInstanceOutput(final PropertyDataDefinition propertyDataDefinition) {
+        super(propertyDataDefinition);
+        if (propertyDataDefinition.getGetAttributeValues() != null && !propertyDataDefinition.getGetAttributeValues()
+            .isEmpty()) {
+            setOutputId(propertyDataDefinition.getGetAttributeValues().get(0).getOutputId());
+        }
+    }
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstancePropOutput.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstancePropOutput.java
new file mode 100644
index 0000000..94fca2b
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentInstancePropOutput.java
@@ -0,0 +1,50 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode
+@NoArgsConstructor
+public class ComponentInstancePropOutput extends ComponentInstanceProperty {
+
+    private String propertiesName;
+    private PropertyDefinition output;
+
+    public ComponentInstancePropOutput(final ComponentInstanceProperty componentInstanceProperty) {
+        super(componentInstanceProperty);
+    }
+
+    public String[] getParsedPropNames(){
+        String[] tokens = null;
+        if(propertiesName != null && !propertiesName.isEmpty()){
+            tokens = propertiesName.split("#");
+        }
+        return tokens;
+    }
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java
index 505b8e6..1b0daaf 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/ComponentParametersView.java
@@ -45,7 +45,9 @@
     private boolean ignoreAttributesFrom = false;
     private boolean ignoreComponentInstancesAttributesFrom = false;
     private boolean ignoreInputs = false;
+    private boolean ignoreOutputs = false;
     private boolean ignoreComponentInstancesInputs = false;
+    private boolean ignoreComponentInstancesOutputs = false;
     private boolean ignoreCapabiltyProperties = false;
     private boolean ignoreServicePath = true;
     private boolean ignorePolicies = false;
@@ -75,6 +77,9 @@
                 case INPUTS:
                     this.setIgnoreInputs(false);
                     break;
+                case OUTPUTS:
+                    this.setIgnoreOutputs(false);
+                    break;
                 case USERS:
                     this.setIgnoreUsers(false);
                     break;
@@ -141,6 +146,10 @@
                     this.setIgnoreComponentInstances(false);
                     this.setIgnoreComponentInstancesInputs(false);
                     break;
+                case COMPONENT_INSTANCE_OUTPUTS:
+                    this.setIgnoreComponentInstances(false);
+                    this.setIgnoreComponentInstancesOutputs(false);
+                    break;
                 case INSTANCE_CAPABILTY_PROPERTIES:
                     this.setIgnoreCapabiltyProperties(false);
                     break;
@@ -237,9 +246,15 @@
         if (ignoreInputs) {
             component.setInputs(null);
         }
+        if (ignoreOutputs) {
+            component.setOutputs(null);
+        }
         if (ignoreComponentInstancesInputs) {
             component.setComponentInstancesInputs(null);
         }
+        if (ignoreComponentInstancesOutputs) {
+            component.setComponentInstancesOutputs(null);
+        }
         if (ignoreServicePath && componentType == ComponentTypeEnum.SERVICE) {
             ((Service) component).setForwardingPaths(null);
         }
@@ -281,8 +296,10 @@
         ignoreDerivedFrom = true;
         ignoreAttributesFrom = true;
         ignoreInputs = true;
+        ignoreOutputs = true;
         ignoreComponentInstancesAttributesFrom = true;
         ignoreComponentInstancesInputs = true;
+        ignoreComponentInstancesOutputs = true;
         ignoreCapabiltyProperties = true;
         ignoreServicePath = true;
         ignoreNodeFilterRequirements = true;
@@ -383,6 +400,14 @@
         this.ignoreComponentInstancesInputs = ignoreComponentInstancesInputs;
     }
 
+    public boolean isIgnoreComponentInstancesOutputs() {
+        return ignoreComponentInstancesOutputs;
+    }
+
+    public void setIgnoreComponentInstancesOutputs(boolean ignoreComponentInstancesOutputs) {
+        this.ignoreComponentInstancesOutputs = ignoreComponentInstancesOutputs;
+    }
+
     public boolean isIgnoreInterfaces() {
         return ignoreInterfaces;
     }
@@ -439,6 +464,14 @@
         this.ignoreInputs = ignoreInputs;
     }
 
+    public boolean isIgnoreOutputs() {
+        return ignoreOutputs;
+    }
+
+    public void setIgnoreOutputs(boolean ignoreOutputs) {
+        this.ignoreOutputs = ignoreOutputs;
+    }
+
     public boolean isIgnoreCapabiltyProperties() {
         return ignoreCapabiltyProperties;
     }
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/IPropertyOutputCommon.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/IPropertyOutputCommon.java
new file mode 100644
index 0000000..f439885
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/IPropertyOutputCommon.java
@@ -0,0 +1,32 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import java.util.List;
+import org.openecomp.sdc.be.datatypes.elements.PropertyRule;
+import org.openecomp.sdc.be.datatypes.elements.SchemaDefinition;
+
+public interface IPropertyOutputCommon {
+
+    String getType();
+    SchemaDefinition getSchema();
+    List<PropertyRule> getRules();
+    String getName();
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/OutputDefinition.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/OutputDefinition.java
new file mode 100644
index 0000000..4673827
--- /dev/null
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/OutputDefinition.java
@@ -0,0 +1,44 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+
+package org.openecomp.sdc.be.model;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import lombok.Getter;
+import lombok.Setter;
+import org.openecomp.sdc.be.datatypes.elements.Annotation;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+
+public class OutputDefinition extends PropertyDefinition {
+
+    public OutputDefinition(final PropertyDataDefinition propertyDataDefinition) {
+        super(propertyDataDefinition);
+    }
+
+    public OutputDefinition(PropertyDefinition propertyDefinition) {
+        super(propertyDefinition);
+    }
+
+    public OutputDefinition(final OutputDefinition outputDefinition) {
+        super(outputDefinition);
+    }
+
+}
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java
index 4cf712e..8694117 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/Resource.java
@@ -213,6 +213,11 @@
     }
 
     @Override
+    public boolean shouldGenerateOutputs() {
+        return !(this.getResourceType().isAtomicType());
+    }
+
+    @Override
     public boolean deriveFromGeneric() {
         return this.shouldGenerateInputs()
                 || (derivedFrom != null && derivedFrom.contains(fetchGenericTypeToscaNameFromConfig()));
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java
index 1bf35fb..2022fdf 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/datamodel/TopologyTemplate.java
@@ -29,7 +29,6 @@
 import org.openecomp.sdc.be.datatypes.elements.CINodeFilterDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.CompositionDataDefinition;
-import org.openecomp.sdc.be.datatypes.elements.DataTypeDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.ForwardingPathDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.InterfaceDataDefinition;
@@ -59,7 +58,9 @@
     }
 
     private Map<String, PropertyDataDefinition> inputs;
+    private Map<String, PropertyDataDefinition> outputs;
     private Map<String, MapPropertiesDataDefinition> instInputs;
+    private Map<String, MapPropertiesDataDefinition> instOutputs;
     private Map<String, ? extends ToscaDataDefinition> heatParameters;
     private Map<String, MapAttributesDataDefinition> instAttributes;
     private Map<String, MapPropertiesDataDefinition> instProperties;
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java
index 5fb07a0..a38abda 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/NodeTemplateOperation.java
@@ -182,6 +182,11 @@
                     return result;
                 }
 
+                result = addServiceInstanceOutputsToProxyServiceInstance(updatedContainer, componentInstance);
+                if(result.isRight()) {
+                    return result;
+                }
+
                 result = addServiceInstanceInterfacesToProxyServiceInstance(updatedContainer, componentInstance);
                 if(result.isRight()) {
                     return result;
@@ -358,6 +363,29 @@
         return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
     }
 
+    private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstanceOutputsToProxyServiceInstance(
+        final TopologyTemplate updatedContainer, final ComponentInstance componentInstance) {
+
+        final List<OutputDefinition> outputsList = componentInstance.getOutputs();
+        if (CollectionUtils.isNotEmpty(outputsList)) {
+            final Map<String, PropertyDataDefinition> outputsMap = outputsList.stream().map(
+                PropertyDataDefinition::new).collect(Collectors.toMap(PropertyDataDefinition::getName, i -> i));
+            final MapPropertiesDataDefinition mapPropertiesDataDefinition = new MapPropertiesDataDefinition(outputsMap);
+            final Map<String, MapPropertiesDataDefinition> dataDefinitionMap = new HashMap<>();
+            dataDefinitionMap.put(componentInstance.getUniqueId(), mapPropertiesDataDefinition);
+            updatedContainer.setInstOutputs(dataDefinitionMap);
+
+            final StorageOperationStatus status =
+                addToscaDataDeepElementsBlockToToscaElement(updatedContainer.getUniqueId(),
+                    EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, mapPropertiesDataDefinition,
+                    componentInstance.getUniqueId());
+            if (status != StorageOperationStatus.OK) {
+                return Either.right(status);
+            }
+        }
+        return Either.left(new ImmutablePair<>(updatedContainer, componentInstance.getUniqueId()));
+    }
+
     private Either<ImmutablePair<TopologyTemplate, String>, StorageOperationStatus> addServiceInstanceInterfacesToProxyServiceInstance(TopologyTemplate updatedContainer, ComponentInstance componentInstance) {
         Map<String, Object> interfaces = componentInstance.getInterfaces();
 
@@ -2290,12 +2318,38 @@
         return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, properties, pathKeys, JsonPresentationFields.NAME);
     }
 
+    public StorageOperationStatus updateComponentInstanceOutput(final Component containerComponent,
+                                                                final String componentInstanceId,
+                                                                final ComponentInstanceOutput componentInstanceOutput) {
+
+        final List<String> pathKeys = new ArrayList<>();
+        pathKeys.add(componentInstanceId);
+        return updateToscaDataDeepElementOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS,
+            VertexTypeEnum.INST_OUTPUTS, componentInstanceOutput, pathKeys, JsonPresentationFields.NAME);
+    }
+
+    public StorageOperationStatus updateComponentInstanceOutputs(final Component containerComponent,
+                                                                 final String componentInstanceId,
+                                                                 final List<ComponentInstanceOutput> properties) {
+        final List<String> pathKeys = new ArrayList<>();
+        pathKeys.add(componentInstanceId);
+        return updateToscaDataDeepElementsOfToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS,
+            VertexTypeEnum.INST_OUTPUTS, properties, pathKeys, JsonPresentationFields.NAME);
+    }
+
+
     public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) {
         List<String> pathKeys = new ArrayList<>();
         pathKeys.add(componentInstanceId);
         return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_INPUTS, VertexTypeEnum.INST_INPUTS, property, pathKeys, JsonPresentationFields.NAME);
     }
 
+    public StorageOperationStatus addComponentInstanceOutput(Component containerComponent, String componentInstanceId, ComponentInstanceOutput property) {
+        List<String> pathKeys = new ArrayList<>();
+        pathKeys.add(componentInstanceId);
+        return addToscaDataDeepElementToToscaElement(containerComponent.getUniqueId(), EdgeLabelEnum.INST_OUTPUTS, VertexTypeEnum.INST_OUTPUTS, property, pathKeys, JsonPresentationFields.NAME);
+    }
+
     public StorageOperationStatus createInstanceEdge(GraphVertex metadataVertex, ComponentInstanceDataDefinition componentInstance) {
         String instUniqueId = componentInstance.getUniqueId();
 
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java
index def79f8..7bc9e4a 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/TopologyTemplateOperation.java
@@ -96,13 +96,11 @@
 public class TopologyTemplateOperation extends ToscaElementOperation {
 
     private static final Logger log = Logger.getLogger(TopologyTemplateOperation.class);
-    private static final String PATH_DELIMITER = ".";
 
     @Autowired
     private ArchiveOperation archiveOperation;
 
     public Either<TopologyTemplate, StorageOperationStatus> createTopologyTemplate(TopologyTemplate topologyTemplate) {
-        Either<TopologyTemplate, StorageOperationStatus> result = null;
 
         topologyTemplate.generateUUID();
         setResourceMetaDataFromResource(topologyTemplate);
@@ -119,102 +117,91 @@
         if (createdVertex.isRight()) {
             JanusGraphOperationStatus status = createdVertex.right().value();
             log.debug( "Error returned after creating topology template data node {}. status returned is ", topologyTemplateVertex, status);
-            result = Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
-            return result;
+            return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
         }
 
         topologyTemplateVertex = createdVertex.left().value();
 
         StorageOperationStatus assosiateCommon = assosiateCommonForToscaElement(topologyTemplateVertex, topologyTemplate, null);
         if (assosiateCommon != StorageOperationStatus.OK) {
-            result = Either.right(assosiateCommon);
-            return result;
+            return Either.right(assosiateCommon);
         }
 
         StorageOperationStatus associateCategory = assosiateMetadataToCategory(topologyTemplateVertex, topologyTemplate);
         if (associateCategory != StorageOperationStatus.OK) {
-            result = Either.right(associateCategory);
-            return result;
+            return Either.right(associateCategory);
         }
 
         StorageOperationStatus associateInputs = associateInputsToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateInputs != StorageOperationStatus.OK) {
-            result = Either.right(associateInputs);
-            return result;
+            return Either.right(associateInputs);
         }
         StorageOperationStatus associateGroups = associateGroupsToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateGroups != StorageOperationStatus.OK) {
-            result = Either.right(associateGroups);
-            return result;
+            return Either.right(associateGroups);
         }
         StorageOperationStatus associatePolicies = associatePoliciesToComponent(topologyTemplateVertex, topologyTemplate);
         if (associatePolicies != StorageOperationStatus.OK) {
-            result = Either.right(associatePolicies);
-            return result;
+            return Either.right(associatePolicies);
         }
         StorageOperationStatus associateInstAttr = associateInstAttributesToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateInstAttr != StorageOperationStatus.OK) {
-            result = Either.right(associateInstAttr);
-            return result;
+            return Either.right(associateInstAttr);
         }
         StorageOperationStatus associateInstProperties = associateInstPropertiesToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateInstProperties != StorageOperationStatus.OK) {
-            result = Either.right(associateInstProperties);
-            return result;
+            return Either.right(associateInstProperties);
         }
         StorageOperationStatus associateInstInputs = associateInstInputsToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateInstProperties != StorageOperationStatus.OK) {
-            result = Either.right(associateInstInputs);
-            return result;
+            return Either.right(associateInstInputs);
         }
+
+        final StorageOperationStatus storageOperationStatus = associateInstOutputsToComponent(topologyTemplateVertex,
+            topologyTemplate);
+        if (associateInstProperties != StorageOperationStatus.OK) {
+            return Either.right(storageOperationStatus);
+        }
+
         StorageOperationStatus associateInstGroups = associateInstGroupsToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateInstGroups != StorageOperationStatus.OK) {
-            result = Either.right(associateInstInputs);
-            return result;
+            return Either.right(associateInstInputs);
         }
 
         StorageOperationStatus associateRequirements = associateRequirementsToResource(topologyTemplateVertex, topologyTemplate);
         if (associateRequirements != StorageOperationStatus.OK) {
-            result = Either.right(associateRequirements);
-            return result;
+            return Either.right(associateRequirements);
         }
 
         StorageOperationStatus associateCapabilities = associateCapabilitiesToResource(topologyTemplateVertex, topologyTemplate);
         if (associateCapabilities != StorageOperationStatus.OK) {
-            result = Either.right(associateCapabilities);
-            return result;
+            return Either.right(associateCapabilities);
         }
 
         StorageOperationStatus associateArtifacts = associateTopologyTemplateArtifactsToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateArtifacts != StorageOperationStatus.OK) {
-            result = Either.right(associateArtifacts);
-            return result;
+            return Either.right(associateArtifacts);
         }
 
         StorageOperationStatus addAdditionalInformation = addAdditionalInformationToResource(topologyTemplateVertex, topologyTemplate);
         if (addAdditionalInformation != StorageOperationStatus.OK) {
-            result = Either.right(addAdditionalInformation);
-            return result;
+            return Either.right(addAdditionalInformation);
         }
         StorageOperationStatus associateCapProperties = associateCapPropertiesToResource(topologyTemplateVertex, topologyTemplate);
         if (associateCapProperties != StorageOperationStatus.OK) {
-            result = Either.right(associateCapProperties);
-            return result;
+            return Either.right(associateCapProperties);
         }
 
         StorageOperationStatus associateInterfaces = associateInterfacesToComponent(topologyTemplateVertex, topologyTemplate);
         if (associateInterfaces != StorageOperationStatus.OK) {
-            result = Either.right(associateInterfaces);
-            return result;
+            return Either.right(associateInterfaces);
         }
 
         StorageOperationStatus associatePathProperties = associateForwardingPathToResource(topologyTemplateVertex, topologyTemplate);
         if (associateCapProperties != StorageOperationStatus.OK) {
-            result = Either.right(associatePathProperties);
-            return result;
+            return Either.right(associatePathProperties);
         }
 
-
         return Either.left(topologyTemplate);
 
     }
@@ -242,13 +229,6 @@
         return associateForwardingPathToComponent(topologyTemplateVertex,forwardingPaths);
     }
 
-    private StorageOperationStatus associateNodeFilterToResource(GraphVertex topologyTemplateVertex,
-            TopologyTemplate topologyTemplate) {
-        Map<String, CINodeFilterDataDefinition> nodeFilters =
-                topologyTemplate.getNodeFilterComponents();
-        return associateNodeFiltersToComponent(topologyTemplateVertex, nodeFilters);
-    }
-
     private StorageOperationStatus associateCapPropertiesToResource(GraphVertex topologyTemplateVertex, TopologyTemplate topologyTemplate) {
         Map<String, MapCapabilityProperty> calculatedCapProperties = topologyTemplate
                 .getCalculatedCapabilitiesProperties();
@@ -392,6 +372,11 @@
         return associateInstInputsToComponent(nodeTypeVertex, instProps);
     }
 
+    public StorageOperationStatus associateInstOutputsToComponent(final GraphVertex nodeTypeVertex,
+                                                                  final TopologyTemplate topologyTemplate) {
+        return associateInstOutputsToComponent(nodeTypeVertex, topologyTemplate.getInstOutputs());
+    }
+
     public StorageOperationStatus associateInstGroupsToComponent(GraphVertex nodeTypeVertex, TopologyTemplate topologyTemplate) {
         Map<String, MapGroupsDataDefinition> instGroups = topologyTemplate.getInstGroups();
         return associateInstGroupsToComponent(nodeTypeVertex, instGroups);
@@ -418,6 +403,20 @@
         return StorageOperationStatus.OK;
     }
 
+    public StorageOperationStatus associateInstOutputsToComponent(final GraphVertex nodeTypeVertex,
+                                                                  final Map<String, MapPropertiesDataDefinition> mapPropertiesDataDefinitionMap) {
+
+        if (MapUtils.isNotEmpty(mapPropertiesDataDefinitionMap)) {
+            final Either<GraphVertex, StorageOperationStatus> associateElementToData =
+                associateElementToData(nodeTypeVertex, VertexTypeEnum.INST_OUTPUTS, EdgeLabelEnum.INST_OUTPUTS,
+                    mapPropertiesDataDefinitionMap);
+            if (associateElementToData.isRight()) {
+                return associateElementToData.right().value();
+            }
+        }
+        return StorageOperationStatus.OK;
+    }
+
     public StorageOperationStatus associateInstGroupsToComponent(GraphVertex nodeTypeVertex, Map<String, MapGroupsDataDefinition> instGroups) {
         if (instGroups != null && !instGroups.isEmpty()) {
             Either<GraphVertex, StorageOperationStatus> assosiateElementToData = associateElementToData(nodeTypeVertex, VertexTypeEnum.INST_GROUPS, EdgeLabelEnum.INST_GROUPS, instGroups);
@@ -748,6 +747,14 @@
             }
 
         }
+
+        if (!componentParametersView.isIgnoreOutputs()) {
+            status = setOutputsFromGraph(componentV, toscaElement);
+            if (status != JanusGraphOperationStatus.OK) {
+                return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
+            }
+
+        }
         if (!componentParametersView.isIgnoreProperties()) {
             status = setPropertiesFromGraph(componentV, toscaElement);
             if (status != JanusGraphOperationStatus.OK) {
@@ -764,6 +771,14 @@
             }
         }
 
+        if (!componentParametersView.isIgnoreComponentInstancesOutputs()) {
+            status = setComponentInstancesOutputsFromGraph(componentV, toscaElement);
+            if (status != JanusGraphOperationStatus.OK) {
+                return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(status));
+
+            }
+        }
+
         if (!componentParametersView.isIgnoreCapabiltyProperties()) {
             status = setComponentInstancesCapPropertiesFromGraph(componentV, toscaElement);
             if (status != JanusGraphOperationStatus.OK) {
@@ -1001,6 +1016,18 @@
         return JanusGraphOperationStatus.OK;
     }
 
+    private JanusGraphOperationStatus setComponentInstancesOutputsFromGraph(GraphVertex componentV, TopologyTemplate topologyTemplate) {
+        Either<Map<String, MapPropertiesDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.INST_OUTPUTS);
+        if (result.isLeft()) {
+            topologyTemplate.setInstOutputs(result.left().value());
+        } else {
+            if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
+                return result.right().value();
+            }
+        }
+        return JanusGraphOperationStatus.OK;
+    }
+
     private JanusGraphOperationStatus setNodeFilterComponentFromGraph(final GraphVertex componentV,
                                                                       final TopologyTemplate topologyTemplate) {
 
@@ -1145,6 +1172,29 @@
         return JanusGraphOperationStatus.OK;
     }
 
+    private JanusGraphOperationStatus setOutputsFromGraph(final GraphVertex componentV,
+                                                          final TopologyTemplate toscaElement) {
+        final Either<Map<String, PropertyDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV,
+            EdgeLabelEnum.OUTPUTS);
+        if (result.isLeft()) {
+            toscaElement.setOutputs(result.left().value());
+        } else {
+            if (result.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
+                return result.right().value();
+            }
+        }
+        final Either<Map<String, ListCapabilityDataDefinition>, JanusGraphOperationStatus> capabilitiesResult =
+            getDataFromGraph(componentV, EdgeLabelEnum.CAPABILITIES);
+        if (capabilitiesResult.isLeft()) {
+            toscaElement.setCapabilities(capabilitiesResult.left().value());
+        } else {
+            if (capabilitiesResult.right().value() != JanusGraphOperationStatus.NOT_FOUND) {
+                return capabilitiesResult.right().value();
+            }
+        }
+        return JanusGraphOperationStatus.OK;
+    }
+
     private JanusGraphOperationStatus setGroupsFromGraph(GraphVertex componentV, TopologyTemplate toscaElement) {
         Either<Map<String, GroupDataDefinition>, JanusGraphOperationStatus> result = getDataFromGraph(componentV, EdgeLabelEnum.GROUPS);
         if (result.isLeft()) {
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementLifecycleOperation.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementLifecycleOperation.java
index b7cc2c8..3c7c88e 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementLifecycleOperation.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaElementLifecycleOperation.java
@@ -621,12 +621,16 @@
             ToscaElement toscaElement) {
         TopologyTemplate topologyTemplate = (TopologyTemplate) toscaElement;
         Map<String, MapPropertiesDataDefinition> instInputs = topologyTemplate.getInstInputs();
+        Map<String, MapPropertiesDataDefinition> instOutputs = topologyTemplate.getInstOutputs();
         Map<String, MapGroupsDataDefinition> instGroups = topologyTemplate.getInstGroups();
         Map<String, MapArtifactDataDefinition> instArtifactsMap = topologyTemplate.getInstanceArtifacts();
         Map<String, ToscaElement> origCompMap = new HashMap<>();
         if (instInputs == null) {
             instInputs = new HashMap<>();
         }
+        if (instOutputs == null) {
+            instOutputs = new HashMap<>();
+        }
         if (instGroups == null) {
             instGroups = new HashMap<>();
         }
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java
index 50b2ae4..c0307d8 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/operations/ToscaOperationFacade.java
@@ -20,7 +20,27 @@
 
 package org.openecomp.sdc.be.model.jsonjanusgraph.operations;
 
+import static java.util.Objects.requireNonNull;
+import static org.apache.commons.collections.CollectionUtils.isEmpty;
+import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
+
 import fj.data.Either;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.EnumMap;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiPredicate;
+import java.util.stream.Collectors;
 import org.apache.commons.collections.CollectionUtils;
 import org.apache.commons.collections.MapUtils;
 import org.apache.commons.lang3.StringUtils;
@@ -29,21 +49,63 @@
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.openecomp.sdc.be.config.Configuration;
 import org.openecomp.sdc.be.config.ConfigurationManager;
-import org.openecomp.sdc.be.model.jsonjanusgraph.config.ContainerInstanceTypesData;
 import org.openecomp.sdc.be.dao.janusgraph.JanusGraphOperationStatus;
 import org.openecomp.sdc.be.dao.jsongraph.GraphVertex;
 import org.openecomp.sdc.be.dao.jsongraph.HealingJanusGraphDao;
 import org.openecomp.sdc.be.dao.jsongraph.types.EdgeLabelEnum;
 import org.openecomp.sdc.be.dao.jsongraph.types.JsonParseFlagEnum;
 import org.openecomp.sdc.be.dao.jsongraph.types.VertexTypeEnum;
-import org.openecomp.sdc.be.datatypes.elements.*;
-import org.openecomp.sdc.be.datatypes.elements.MapInterfaceDataDefinition;
-import org.openecomp.sdc.be.datatypes.enums.*;
-import org.openecomp.sdc.be.model.*;
+import org.openecomp.sdc.be.datatypes.elements.ArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.AttributeDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.CapabilityDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ComponentInstanceDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.DataTypeDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.GroupDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListCapabilityDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.ListRequirementDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapArtifactDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapAttributesDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.MapCapabilityProperty;
+import org.openecomp.sdc.be.datatypes.elements.MapInterfaceDataDefinition;
 import org.openecomp.sdc.be.datatypes.elements.MapListCapabilityDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapListRequirementDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.MapPropertiesDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.PropertyDataDefinition;
+import org.openecomp.sdc.be.datatypes.elements.RequirementDataDefinition;
+import org.openecomp.sdc.be.datatypes.enums.ComponentTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.GraphPropertyEnum;
+import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
+import org.openecomp.sdc.be.datatypes.enums.OriginTypeEnum;
+import org.openecomp.sdc.be.datatypes.enums.PromoteVersionEnum;
+import org.openecomp.sdc.be.datatypes.enums.ResourceTypeEnum;
+import org.openecomp.sdc.be.model.ArtifactDefinition;
+import org.openecomp.sdc.be.model.CapabilityDefinition;
 import org.openecomp.sdc.be.model.CatalogUpdateTimestamp;
+import org.openecomp.sdc.be.model.Component;
+import org.openecomp.sdc.be.model.ComponentInstance;
+import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
+import org.openecomp.sdc.be.model.ComponentInstanceInput;
+import org.openecomp.sdc.be.model.ComponentInstanceInterface;
+import org.openecomp.sdc.be.model.ComponentInstanceOutput;
+import org.openecomp.sdc.be.model.ComponentInstanceProperty;
+import org.openecomp.sdc.be.model.ComponentParametersView;
+import org.openecomp.sdc.be.model.DataTypeDefinition;
+import org.openecomp.sdc.be.model.DistributionStatusEnum;
+import org.openecomp.sdc.be.model.GroupDefinition;
+import org.openecomp.sdc.be.model.GroupInstance;
+import org.openecomp.sdc.be.model.InputDefinition;
+import org.openecomp.sdc.be.model.LifecycleStateEnum;
+import org.openecomp.sdc.be.model.OutputDefinition;
+import org.openecomp.sdc.be.model.PolicyDefinition;
+import org.openecomp.sdc.be.model.PropertyDefinition;
+import org.openecomp.sdc.be.model.RelationshipInfo;
+import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
+import org.openecomp.sdc.be.model.RequirementDefinition;
+import org.openecomp.sdc.be.model.Resource;
+import org.openecomp.sdc.be.model.Service;
+import org.openecomp.sdc.be.model.User;
 import org.openecomp.sdc.be.model.catalog.CatalogComponent;
+import org.openecomp.sdc.be.model.jsonjanusgraph.config.ContainerInstanceTypesData;
 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.TopologyTemplate;
 import org.openecomp.sdc.be.model.jsonjanusgraph.datamodel.ToscaElement;
 import org.openecomp.sdc.be.model.jsonjanusgraph.utils.ModelConverter;
@@ -59,15 +121,6 @@
 import org.openecomp.sdc.common.util.ValidationUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 
-import java.util.*;
-import java.util.Map.Entry;
-import java.util.function.BiPredicate;
-import java.util.stream.Collectors;
-
-import static java.util.Objects.requireNonNull;
-import static org.apache.commons.collections.CollectionUtils.isEmpty;
-import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
-
 
 @org.springframework.stereotype.Component("tosca-operation-facade")
 public class ToscaOperationFacade {
@@ -1079,6 +1132,36 @@
 
     }
 
+    public Either<List<OutputDefinition>, StorageOperationStatus> addOutputsToComponent(final Map<String, OutputDefinition> outputs, final String componentId) {
+
+        final Either<GraphVertex, JanusGraphOperationStatus> getVertexEither = janusGraphDao
+            .getVertexById(componentId, JsonParseFlagEnum.NoParse);
+        if (getVertexEither.isRight()) {
+            log.debug(COULDNT_FETCH_COMPONENT_WITH_AND_UNIQUE_ID_ERROR, componentId, getVertexEither.right().value());
+            return Either.right(DaoStatusConverter.convertJanusGraphStatusToStorageStatus(getVertexEither.right().value()));
+
+        }
+
+        final GraphVertex vertex = getVertexEither.left().value();
+        final Map<String, PropertyDefinition> outputsMap = outputs.entrySet()
+            .stream()
+            .collect(Collectors.toMap(Map.Entry::getKey, e -> new PropertyDefinition(e.getValue())));
+
+        final StorageOperationStatus status = topologyTemplateOperation.addToscaDataToToscaElement(vertex,
+            EdgeLabelEnum.OUTPUTS, VertexTypeEnum.OUTPUTS, outputsMap, JsonPresentationFields.NAME);
+
+        if (StorageOperationStatus.OK == status) {
+            log.debug(COMPONENT_CREATED_SUCCESSFULLY);
+            List<OutputDefinition> outputDefinitionList = null;
+            if (outputsMap != null && !outputsMap.isEmpty()) {
+                outputDefinitionList = outputsMap.values().stream().map(OutputDefinition::new).collect(Collectors.toList());
+            }
+            return Either.left(outputDefinitionList);
+        }
+        return Either.right(status);
+
+    }
+
     /**
      * Add data types into a Component.
      *
@@ -1344,6 +1427,38 @@
         return Either.left(instProperties);
     }
 
+    public Either<Map<String, List<ComponentInstanceOutput>>, StorageOperationStatus> addComponentInstanceOutputsToComponent(
+        final Component containerComponent, final Map<String, List<ComponentInstanceOutput>> componentInstanceOutput) {
+        requireNonNull(componentInstanceOutput);
+        StorageOperationStatus status;
+        for (final Entry<String, List<ComponentInstanceOutput>> entry : componentInstanceOutput.entrySet()) {
+            final List<ComponentInstanceOutput> instanceOutputList = entry.getValue();
+            final String componentInstanceId = entry.getKey();
+            if (!isEmpty(instanceOutputList)) {
+                for (final ComponentInstanceOutput outputProperty : instanceOutputList) {
+                    final List<ComponentInstanceOutput> componentInstanceOutputs = containerComponent
+                        .getComponentInstancesOutputs().get(componentInstanceId);
+                    final Optional<ComponentInstanceOutput> instanceProperty = componentInstanceOutputs.stream()
+                        .filter(p -> p.getName().equals(outputProperty.getName()))
+                        .findAny();
+                    if (instanceProperty.isPresent()) {
+                        status = updateComponentInstanceOutput(containerComponent, componentInstanceId, outputProperty);
+                    } else {
+                        status = addComponentInstanceOutput(containerComponent, componentInstanceId, outputProperty);
+                    }
+                    if (status != StorageOperationStatus.OK) {
+                        log.debug("Failed to update instance output {} for instance {} error {} ", outputProperty,
+                            componentInstanceId, status);
+                        return Either.right(status);
+                    } else {
+                        log.trace("instance output {} for instance {} updated", outputProperty, componentInstanceId);
+                    }
+                }
+            }
+        }
+        return Either.left(componentInstanceOutput);
+    }
+
     public Either<Map<String, List<ComponentInstanceProperty>>, StorageOperationStatus> addComponentInstancePropertiesToComponent(Component containerComponent, Map<String, List<ComponentInstanceProperty>> instProperties) {
         requireNonNull(instProperties);
         for (Entry<String, List<ComponentInstanceProperty>> entry : instProperties.entrySet()) {
@@ -2442,6 +2557,11 @@
         return getToscaElementOperation(resource).deleteToscaDataElement(resource.getUniqueId(), EdgeLabelEnum.INPUTS, VertexTypeEnum.INPUTS, inputName, JsonPresentationFields.NAME);
     }
 
+    public StorageOperationStatus deleteOutputOfResource(final Component resource, final String outputName) {
+        return getToscaElementOperation(resource).deleteToscaDataElement(resource.getUniqueId(), EdgeLabelEnum.OUTPUTS,
+            VertexTypeEnum.OUTPUTS, outputName, JsonPresentationFields.NAME);
+    }
+
     /**
      * Deletes a data type from a component.
      * @param component the container which has the data type
@@ -2654,10 +2774,28 @@
         return nodeTemplateOperation.updateComponentInstanceInputs(containerComponent, componentInstanceId, instanceInputs);
     }
 
+    public StorageOperationStatus updateComponentInstanceOutput(final Component containerComponent,
+                                                                final String componentInstanceId,
+                                                                final ComponentInstanceOutput componentInstanceOutput) {
+        return nodeTemplateOperation.updateComponentInstanceOutput(containerComponent, componentInstanceId, componentInstanceOutput);
+    }
+
+    public StorageOperationStatus updateComponentInstanceOutputs(final Component containerComponent,
+                                                                 final String componentInstanceId,
+                                                                 final List<ComponentInstanceOutput> componentInstanceOutputs) {
+        return nodeTemplateOperation.updateComponentInstanceOutputs(containerComponent, componentInstanceId, componentInstanceOutputs);
+    }
+
     public StorageOperationStatus addComponentInstanceInput(Component containerComponent, String componentInstanceId, ComponentInstanceInput property) {
         return nodeTemplateOperation.addComponentInstanceInput(containerComponent, componentInstanceId, property);
     }
 
+    public StorageOperationStatus addComponentInstanceOutput(final Component containerComponent,
+                                                             final String componentInstanceId,
+                                                             final ComponentInstanceOutput componentInstanceOutput) {
+        return nodeTemplateOperation.addComponentInstanceOutput(containerComponent, componentInstanceId, componentInstanceOutput);
+    }
+
     public void setNodeTypeOperation(NodeTypeOperation nodeTypeOperation) {
         this.nodeTypeOperation = nodeTypeOperation;
     }
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java
index f57a7e5..b0051f6 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/jsonjanusgraph/utils/ModelConverter.java
@@ -89,6 +89,7 @@
 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
 import org.openecomp.sdc.be.model.ComponentInstanceInput;
 import org.openecomp.sdc.be.model.ComponentInstanceInterface;
+import org.openecomp.sdc.be.model.ComponentInstanceOutput;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.DataTypeDefinition;
 import org.openecomp.sdc.be.model.DistributionStatusEnum;
@@ -97,6 +98,7 @@
 import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
 import org.openecomp.sdc.be.model.MapInterfaceInstanceDataDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.RelationshipImpl;
@@ -193,6 +195,8 @@
 
 		convertInputs(topologyTemplate, service);
 
+		convertOutputs(topologyTemplate, service);
+
 		convertProperties(topologyTemplate, service);
 
 		convertPolicies(topologyTemplate, service);
@@ -349,6 +353,8 @@
 
             setComponentInstancesInputsToComponent(topologyTemplate, component);
 
+            setComponentInstancesOutputsToComponent(topologyTemplate, component);
+
             setComponentInstancesToComponent(topologyTemplate, component);
 
             setComponentInstancesCapabilitiesToComponentAndCI(topologyTemplate, component);
@@ -411,6 +417,8 @@
 
             setComponentInstancesInputsToTopologyTemplate(component, topologyTemplate);
 
+            setComponentInstancesOutputsToTopologyTemplate(component, topologyTemplate);
+
             setComponentInstancesToTopologyTemplate(component, topologyTemplate);
 
             setComponentInstancesArtifactsToTopologyTemplate(component, topologyTemplate);
@@ -1154,6 +1162,7 @@
         convertComponentInstances(component, topologyTemplate);
 
 		convertInputs(component, topologyTemplate);
+		convertOutputs(component, topologyTemplate);
 		convertProperties(component, topologyTemplate);
 		convertCapabilities(component, topologyTemplate);
 		convertGroups(component, topologyTemplate);
@@ -1284,6 +1293,27 @@
 		}
 	}
 
+    private static void convertOutputs(final Component component, final TopologyTemplate topologyTemplate) {
+        final List<OutputDefinition> outputsList = component.getOutputs();
+        if (outputsList != null && !outputsList.isEmpty()) {
+            final Map<String, PropertyDataDefinition> propertyDataDefinitionMap = outputsList
+                .stream().map(PropertyDataDefinition::new)
+                .collect(Collectors.toMap(PropertyDataDefinition::getName, Function.identity()));
+            topologyTemplate.setOutputs(propertyDataDefinitionMap);
+        }
+    }
+
+    private static void convertOutputs(final TopologyTemplate topologyTemplate, final Component component) {
+        final Map<String, PropertyDataDefinition> outputsMap = topologyTemplate.getOutputs();
+        if (outputsMap != null && !outputsMap.isEmpty()) {
+            final List<OutputDefinition> outputDefinitionList = outputsMap.values()
+                .stream()
+                .map(OutputDefinition::new)
+                .collect(Collectors.toList());
+            component.setOutputs(outputDefinitionList);
+        }
+    }
+
 	private static void convertProperties(Component component, TopologyTemplate topologyTemplate) {
 		List<PropertyDefinition> propertiesList = component.getProperties();
 		if (propertiesList != null && !propertiesList.isEmpty()) {
@@ -1428,12 +1458,22 @@
                 List<PropertyDefinition> instanceProps = topologyTemplate.getInstProperties().get(key).getMapToscaDataDefinition().entrySet().stream().map(e -> new PropertyDefinition(e.getValue())).collect(Collectors.toList());
                 currComponentInstance.setProperties(instanceProps);
             }
-            if(topologyTemplate.getInstInputs() != null && topologyTemplate.getInstInputs().containsKey(key) && topologyTemplate.getInstInputs().get(key) != null ){
-                List<InputDefinition> instanceInputs = topologyTemplate.getInstInputs().get(key).getMapToscaDataDefinition().entrySet().stream().map(e -> new InputDefinition(e.getValue())).collect(Collectors.toList());
+            if (topologyTemplate.getInstInputs() != null && topologyTemplate.getInstInputs().containsKey(key)
+                && topologyTemplate.getInstInputs().get(key) != null) {
+                List<InputDefinition> instanceInputs = topologyTemplate.getInstInputs().get(key)
+                    .getMapToscaDataDefinition().entrySet().stream().map(e -> new InputDefinition(e.getValue()))
+                    .collect(Collectors.toList());
                 currComponentInstance.setInputs(instanceInputs);
             }
+            if (topologyTemplate.getInstOutputs() != null && topologyTemplate.getInstOutputs().containsKey(key) &&
+                topologyTemplate.getInstOutputs().get(key) != null) {
+                final List<OutputDefinition> instanceOutputs = topologyTemplate.getInstOutputs().get(key)
+                    .getMapToscaDataDefinition().entrySet().stream()
+                    .map(e -> new OutputDefinition(e.getValue())).collect(Collectors.toList());
+                currComponentInstance.setOutputs(instanceOutputs);
+            }
             if(topologyTemplate.getComponentInstInterfaces() != null && topologyTemplate.getComponentInstInterfaces().containsKey(key) && topologyTemplate.getComponentInstInterfaces().get(key) != null ){
-                Map<String, Object> interfacesMap = topologyTemplate.getComponentInstInterfaces().get(key).getMapToscaDataDefinition().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
+                final Map<String, Object> interfacesMap = topologyTemplate.getComponentInstInterfaces().get(key).getMapToscaDataDefinition().entrySet().stream().collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));
                 currComponentInstance.setInterfaces(interfacesMap);
             }
             componentInstances.add(currComponentInstance);
@@ -1487,6 +1527,23 @@
         }
     }
 
+    private static void setComponentInstancesOutputsToComponent(final TopologyTemplate topologyTemplate,
+                                                                final Component component) {
+        if (topologyTemplate.getInstOutputs() != null) {
+            final Map<String, List<ComponentInstanceOutput>> outputs = new HashMap<>();
+            for (final Entry<String, MapPropertiesDataDefinition> entry : topologyTemplate.getInstOutputs().entrySet()) {
+                if (entry.getValue() != null && entry.getValue().getMapToscaDataDefinition() != null) {
+                    final String key = entry.getKey();
+                    final List<ComponentInstanceOutput> componentInstanceAttributes = entry.getValue()
+                        .getMapToscaDataDefinition().entrySet().stream()
+                        .map(e -> new ComponentInstanceOutput(e.getValue())).collect(Collectors.toList());
+                    outputs.put(key, componentInstanceAttributes);
+                }
+            }
+            component.setComponentInstancesOutputs(outputs);
+        }
+    }
+
     private static void setComponentInstancesPropertiesToComponent(TopologyTemplate topologyTemplate, Component component) {
         if (topologyTemplate.getInstProperties() != null) {
             Map<String, List<ComponentInstanceProperty>> properties = new HashMap<>();
@@ -1880,6 +1937,24 @@
         }
     }
 
+    private static void setComponentInstancesOutputsToTopologyTemplate(final Component component,
+                                                                       final TopologyTemplate topologyTemplate) {
+
+        if (component.getComponentInstancesOutputs() != null) {
+            topologyTemplate.setInstOutputs(new HashMap<>());
+
+            for (final Entry<String, List<ComponentInstanceOutput>> entry : component.getComponentInstancesOutputs().entrySet()) {
+                final MapPropertiesDataDefinition outputsMap = new MapPropertiesDataDefinition();
+
+                outputsMap.setMapToscaDataDefinition(entry.getValue()
+                    .stream().map(PropertyDataDefinition::new)
+                    .collect(Collectors.toMap(PropertyDataDefinition::getName, Function.identity())));
+
+                topologyTemplate.getInstOutputs().put(entry.getKey(), outputsMap);
+            }
+        }
+    }
+
     private static void setComponentInstancesPropertiesToTopologyTemplate(Component component, TopologyTemplate topologyTemplate) {
 
         if (component.getComponentInstancesProperties() != null) {
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/model/utils/ComponentUtilities.java b/catalog-model/src/main/java/org/openecomp/sdc/be/model/utils/ComponentUtilities.java
index 7449ca4..5733194 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/model/utils/ComponentUtilities.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/model/utils/ComponentUtilities.java
@@ -20,16 +20,16 @@
 
 package org.openecomp.sdc.be.model.utils;
 
+import static java.util.Collections.emptyList;
+
+import java.util.List;
+import java.util.Optional;
 import org.apache.commons.lang3.StringUtils;
 import org.openecomp.sdc.be.datatypes.elements.Annotation;
 import org.openecomp.sdc.be.model.Component;
 import org.openecomp.sdc.be.model.ComponentInstance;
 import org.openecomp.sdc.be.model.InputDefinition;
-
-import java.util.List;
-import java.util.Optional;
-
-import static java.util.Collections.emptyList;
+import org.openecomp.sdc.be.model.OutputDefinition;
 
 public class ComponentUtilities {
     private ComponentUtilities() {
@@ -47,12 +47,24 @@
                 .orElse(emptyList());
     }
 
+    public static List<Annotation> getOutputAnnotations(final Component component, final String outputName) {
+        return getOutputByName(component, outputName)
+            .map(OutputDefinition::getAnnotations)
+            .orElse(emptyList());
+    }
+
     private static Optional<InputDefinition> getInputByName(Component component, String inputName) {
         return component.safeGetInputs().stream()
                 .filter(input -> input.getName().equals(inputName))
                 .findFirst();
     }
 
+    private static Optional<OutputDefinition> getOutputByName(final Component component, final String outputName) {
+        return component.safeGetOutputs().stream()
+            .filter(output -> output.getName().equals(outputName))
+            .findFirst();
+    }
+
     public static boolean isNotUpdatedCapReqName(String prefix, String currName, String previousName) {
         return StringUtils.isEmpty(previousName) || StringUtils.isEmpty(currName) || !currName.equals(prefix + previousName);
     }
diff --git a/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java b/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java
index d499dfe..cd2582b 100644
--- a/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java
+++ b/catalog-model/src/main/java/org/openecomp/sdc/be/ui/model/UiComponentDataTransfer.java
@@ -35,10 +35,12 @@
 import org.openecomp.sdc.be.model.ComponentInstanceAttribute;
 import org.openecomp.sdc.be.model.ComponentInstanceInput;
 import org.openecomp.sdc.be.model.ComponentInstanceInterface;
+import org.openecomp.sdc.be.model.ComponentInstanceOutput;
 import org.openecomp.sdc.be.model.ComponentInstanceProperty;
 import org.openecomp.sdc.be.model.GroupDefinition;
 import org.openecomp.sdc.be.model.InputDefinition;
 import org.openecomp.sdc.be.model.InterfaceDefinition;
+import org.openecomp.sdc.be.model.OutputDefinition;
 import org.openecomp.sdc.be.model.PolicyDefinition;
 import org.openecomp.sdc.be.model.PropertyDefinition;
 import org.openecomp.sdc.be.model.RequirementCapabilityRelDef;
@@ -63,12 +65,14 @@
     private List<ComponentInstance> componentInstances;
     private List<RequirementCapabilityRelDef> componentInstancesRelations;
     private Map<String, List<ComponentInstanceInput>> componentInstancesInputs;
+    private Map<String, List<ComponentInstanceOutput>> componentInstancesOutputs;
     private Map<String, List<ComponentInstanceProperty>> componentInstancesProperties;
     private Map<String, List<ComponentInstanceAttribute>> componentInstancesAttributes;
     private Map<String, List<CapabilityDefinition>> capabilities;
     private List<PolicyDefinition> policies;
     private Map<String, List<RequirementDefinition>> requirements;
     private List<InputDefinition> inputs;
+    private List<OutputDefinition> outputs;
     private List<GroupDefinition> groups;
     private Map<String, InterfaceDefinition> interfaces;
 
diff --git a/common-app-api/src/main/java/org/openecomp/sdc/common/api/Constants.java b/common-app-api/src/main/java/org/openecomp/sdc/common/api/Constants.java
index 340b198..f98756f 100644
--- a/common-app-api/src/main/java/org/openecomp/sdc/common/api/Constants.java
+++ b/common-app-api/src/main/java/org/openecomp/sdc/common/api/Constants.java
@@ -130,6 +130,7 @@
 	public static final String VF_LICENSE_LABEL = "vflicense";
 	public static final String VF_LICENSE_DISPLAY_NAME = "VF License";
 	public static final String VF_LICENSE_DESCRIPTION = "VF license file";
+	public static final String GET_ATTRIBUTE = "get_attribute";
 	public static final String GET_INPUT = "get_input";
 	public static final String GET_POLICY = "get_policy";
 	public static final String SERVICE_TEMPLATE_FILE_POSTFIX = "ServiceTemplate.yaml";
diff --git a/common-app-logging/src/main/java/org/openecomp/sdc/common/log/enums/LoggerSupportabilityActions.java b/common-app-logging/src/main/java/org/openecomp/sdc/common/log/enums/LoggerSupportabilityActions.java
index de4f78e..4f61b63 100644
--- a/common-app-logging/src/main/java/org/openecomp/sdc/common/log/enums/LoggerSupportabilityActions.java
+++ b/common-app-logging/src/main/java/org/openecomp/sdc/common/log/enums/LoggerSupportabilityActions.java
@@ -36,6 +36,7 @@
     CREATE_RESOURCE("CREATE RESOURCE"),
     CREATE_PROPERTIES("ADD PROPERTIES"),
     CREATE_INPUTS("ADD INPUTS"),
+    CREATE_OUTPUTS("ADD OUTPUTS"),
     CREATE_POLICIES("ADD POLICIES"),
     CREATE_RELATIONS("ADD RELATIONS"),
     CREATE_CAPABILITY_REQUIREMENTS("CREATE CAPABILITY REQUIREMENTS"),
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/GetAttributeValueDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/GetAttributeValueDataDefinition.java
new file mode 100644
index 0000000..7f6a6f9
--- /dev/null
+++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/GetAttributeValueDataDefinition.java
@@ -0,0 +1,57 @@
+/*
+ * ============LICENSE_START=======================================================
+ *  Copyright (C) 2020 Nordix Foundation
+ *  ================================================================================
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *        http://www.apache.org/licenses/LICENSE-2.0
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ *  SPDX-License-Identifier: Apache-2.0
+ *  ============LICENSE_END=========================================================
+ */
+package org.openecomp.sdc.be.datatypes.elements;
+
+import java.util.Map;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+import lombok.ToString;
+import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
+
+@Getter
+@Setter
+@ToString
+@EqualsAndHashCode
+@NoArgsConstructor
+public class GetAttributeValueDataDefinition extends ToscaDataDefinition {
+
+    private String propName;
+    private String outputName;
+    private String outputId;
+    private Integer indexValue;
+    private GetAttributeValueDataDefinition getAttributeIndex;
+
+    private boolean isList = false;
+
+    public GetAttributeValueDataDefinition(Map<String, Object> pr) {
+        super(pr);
+    }
+
+    public GetAttributeValueDataDefinition(GetAttributeValueDataDefinition p) {
+        this.setPropName(p.getPropName());
+        this.setOutputName(p.getOutputName());
+        this.setOutputId(p.getOutputId());
+        this.setIndexValue(p.getIndexValue());
+        this.setGetAttributeIndex(p.getGetAttributeIndex());
+        this.setList(p.isList());
+    }
+
+}
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyDataDefinition.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyDataDefinition.java
index 5d9453a..60905be 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyDataDefinition.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/elements/PropertyDataDefinition.java
@@ -20,9 +20,7 @@
 
 package org.openecomp.sdc.be.datatypes.elements;
 
-import org.apache.commons.collections.CollectionUtils;
-import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
-import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
+import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
 
 import java.util.ArrayList;
 import java.util.HashSet;
@@ -31,8 +29,9 @@
 import java.util.Set;
 import lombok.Data;
 import lombok.EqualsAndHashCode;
-
-import static org.apache.commons.collections.CollectionUtils.isNotEmpty;
+import org.apache.commons.collections.CollectionUtils;
+import org.openecomp.sdc.be.datatypes.enums.JsonPresentationFields;
+import org.openecomp.sdc.be.datatypes.tosca.ToscaDataDefinition;
 
 @EqualsAndHashCode(callSuper = false)
 @Data
@@ -64,12 +63,15 @@
     private Boolean immutable = Boolean.FALSE;
 
     private String inputPath;
+    private String outputPath;
     private String status;
     private String inputId;
+    private String outputId;
     private String instanceUniqueId;
     private String propertyId;
     private String parentPropertyType;
     private String subPropertyInputPath;
+    private String subPropertyOutputPath;
 
     private List<Annotation> annotations;
     /**
@@ -78,8 +80,10 @@
     private String parentUniqueId;
 
     private List<GetInputValueDataDefinition> getInputValues;
+    private List<GetAttributeValueDataDefinition> getAttributeValues;
 
     private Boolean isDeclaredListInput = Boolean.FALSE;
+    private Boolean isDeclaredListOutput = Boolean.FALSE;
 
     private List<GetPolicyValueDataDefinition> getPolicyValues;
 
@@ -112,10 +116,13 @@
         this.setParentUniqueId(propertyDataDefinition.getParentUniqueId());
         this.setOwnerId(propertyDataDefinition.getOwnerId());
         this.setGetInputValues(propertyDataDefinition.getGetInputValues());
+        this.setGetAttributeValues(propertyDataDefinition.getGetAttributeValues());
         this.setGetPolicyValues(propertyDataDefinition.getGetPolicyValues());
         this.setInputPath(propertyDataDefinition.getInputPath());
+        this.setOutputPath(propertyDataDefinition.getOutputPath());
         this.setStatus(propertyDataDefinition.getStatus());
         this.setInputId(propertyDataDefinition.getInputId());
+        this.setOutputId(propertyDataDefinition.getOutputId());
         this.setInstanceUniqueId(propertyDataDefinition.getInstanceUniqueId());
         this.setPropertyId(propertyDataDefinition.getPropertyId());
         this.parentPropertyType = propertyDataDefinition.getParentPropertyType();
@@ -123,7 +130,7 @@
         if (isNotEmpty(propertyDataDefinition.annotations)) {
             this.setAnnotations(propertyDataDefinition.annotations);
         }
-        if(isNotEmpty(propertyDataDefinition.getPropertyConstraints())){
+        if (isNotEmpty(propertyDataDefinition.getPropertyConstraints())) {
             setPropertyConstraints(new ArrayList<>(propertyDataDefinition.getPropertyConstraints()));
         }
         this.setIsDeclaredListInput(propertyDataDefinition.getIsDeclaredListInput());
@@ -261,18 +268,19 @@
     }
 
     private <T extends ToscaDataDefinition> boolean compareSchemaType(T other) {
-        return !"list".equals(type) && !"map".equals(type) || this.getSchema().getProperty().getType().equals(((PropertyDataDefinition) other).getSchema().getProperty().getType());
+        return !"list".equals(type) && !"map".equals(type) || this.getSchema().getProperty().getType()
+            .equals(((PropertyDataDefinition) other).getSchema().getProperty().getType());
     }
 
     @Override
     public <T extends ToscaDataDefinition> T mergeFunction(T other, boolean allowDefaultValueOverride) {
         if (this.getType() != null
-                && this.getType().equals(other.getToscaPresentationValue(JsonPresentationFields.TYPE))
-                && compareSchemaType(other)) {
+            && this.getType().equals(other.getToscaPresentationValue(JsonPresentationFields.TYPE))
+            && compareSchemaType(other)) {
             other.setOwnerId(getOwnerId());
             if (allowDefaultValueOverride
-                    && getDefaultValue() != null
-                    && !getDefaultValue().isEmpty()) {
+                && getDefaultValue() != null
+                && !getDefaultValue().isEmpty()) {
                 other.setToscaPresentationValue(JsonPresentationFields.DEFAULT_VALUE, getDefaultValue());
             }
             return other;
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ComponentFieldsEnum.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ComponentFieldsEnum.java
index 643c03f..ac6d1bb 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ComponentFieldsEnum.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/ComponentFieldsEnum.java
@@ -24,6 +24,7 @@
 
     PROPERTIES("properties"),
     INPUTS("inputs"),
+    OUTPUTS("outputs"),
     USERS("users"),
     GROUPS("groups"),
     NON_EXCLUDED_GROUPS("nonExcludedGroups"),
@@ -39,6 +40,7 @@
     ATTRIBUTES("attributes"),
     COMPONENT_INSTANCES_ATTRIBUTES("componentInstancesAttributes"),
     COMPONENT_INSTANCE_INPUTS("componentInstancesInputs"),
+    COMPONENT_INSTANCE_OUTPUTS("componentInstancesOutputs"),
     COMPONENT_INSTANCE_RELATION("componentInstancesRelations"),
     DEPLOYMENT_ARTIFACTS("deploymentArtifacts"),
     TOSCA_ARTIFACTS("toscaArtifacts"),
diff --git a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/DeclarationTypeEnum.java b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/DeclarationTypeEnum.java
index a25df30..e99cd2b 100644
--- a/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/DeclarationTypeEnum.java
+++ b/common-be/src/main/java/org/openecomp/sdc/be/datatypes/enums/DeclarationTypeEnum.java
@@ -22,5 +22,6 @@
 
 public enum DeclarationTypeEnum {
     INPUT,
+    OUTPUT,
     POLICY;
 }