Merge "Fix PNF software upgrade workflow"
diff --git a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CompleteMsoProcess.groovy b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CompleteMsoProcess.groovy
index ff62834..a86e1de 100644
--- a/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CompleteMsoProcess.groovy
+++ b/bpmn/MSOCommonBPMN/src/main/groovy/org/onap/so/bpmn/common/scripts/CompleteMsoProcess.groovy
@@ -104,7 +104,8 @@
                 infraRequest.setVfModuleId(utils.getNodeText(xml, "vfModuleId"))
             }else if(utils.nodeExists(xml, "volumeGroupId")){
                 infraRequest.setVolumeGroupId(utils.getNodeText(xml, "volumeGroupId"))
-
+            }else if(utils.nodeExists(xml, "pnfName")){
+                infraRequest.setPnfName(utils.getNodeText(xml, "pnfName"))
             }
 
             dbClient.updateInfraActiveRequests(infraRequest, UrnPropertiesReader.getVariable("mso.adapters.requestDb.auth"), UrnPropertiesReader.getVariable("mso.adapters.requestDb.endpoint"))
diff --git a/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/PNFSoftwareUpgrade.groovy b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/PNFSoftwareUpgrade.groovy
new file mode 100644
index 0000000..8e7a4f7
--- /dev/null
+++ b/bpmn/so-bpmn-infrastructure-common/src/main/groovy/org/onap/so/bpmn/infrastructure/scripts/PNFSoftwareUpgrade.groovy
@@ -0,0 +1,124 @@
+/*-
+ * ============LICENSE_START=======================================================
+ * ONAP - SO
+ * ================================================================================
+ * Copyright (C) 2020 Huawei Technologies Co., Ltd. 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.onap.so.bpmn.infrastructure.scripts
+
+import org.camunda.bpm.engine.delegate.DelegateExecution
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+import org.onap.so.bpmn.common.scripts.ExceptionUtil
+import org.onap.so.bpmn.common.scripts.MsoUtils
+import org.onap.so.bpmn.common.scripts.AbstractServiceTaskProcessor
+import org.onap.so.bpmn.common.workflow.context.WorkflowContext
+import org.onap.so.bpmn.common.workflow.context.WorkflowContextHolder
+import org.onap.so.bpmn.core.WorkflowException
+import static org.onap.so.bpmn.infrastructure.pnf.delegate.ExecutionVariableNames.*
+
+class PNFSoftwareUpgrade extends AbstractServiceTaskProcessor {
+    private static final Logger logger = LoggerFactory.getLogger(PNFSoftwareUpgrade.class)
+
+    ExceptionUtil exceptionUtil = new ExceptionUtil()
+    String prefix = "PnfSwUpgrade_"
+
+    @Override
+    void preProcessRequest(DelegateExecution execution) {
+    }
+
+    void sendResponse(DelegateExecution execution) {
+        def requestId = execution.getVariable(REQUEST_ID)
+        def instanceId = execution.getVariable(PNF_CORRELATION_ID)
+        logger.debug("Send response for requestId: {}, instanceId: {}", requestId, instanceId)
+
+        String response = """{"requestReferences":{"requestId":"${requestId}", "instanceId":"${instanceId}"}}""".trim()
+        sendWorkflowResponse(execution, 200, response)
+    }
+
+    static WorkflowContext getWorkflowContext(DelegateExecution execution) {
+        String requestId = execution.getVariable(REQUEST_ID)
+        return WorkflowContextHolder.getInstance().getWorkflowContext(requestId)
+    }
+
+    void prepareCompletion(DelegateExecution execution) {
+        try {
+            String requestId = execution.getVariable(REQUEST_ID)
+            logger.debug("Prepare Completion of PNF Software Upgrade for requestId: {}", requestId)
+
+            String msoCompletionRequest =
+                    """<aetgt:MsoCompletionRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
+                                xmlns:ns="http://org.onap/so/request/types/v1">
+                        <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
+                            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+                            <action>UPDATE</action>
+                            <source>VID</source>
+                        </request-info>
+                        <aetgt:status-message>PNF has been upgraded successfully.</aetgt:status-message>
+                        <aetgt:mso-bpel-name>PNF_SOFTWARE_UPGRADE</aetgt:mso-bpel-name>
+                    </aetgt:MsoCompletionRequest>"""
+            String xmlMsoCompletionRequest = utils.formatXml(msoCompletionRequest)
+
+            execution.setVariable(prefix + "CompleteMsoProcessRequest", xmlMsoCompletionRequest)
+
+            logger.debug("CompleteMsoProcessRequest of PNF Software Upgrade - " + "\n" + xmlMsoCompletionRequest)
+        } catch (Exception e) {
+            String msg = "Prepare Completion error for PNF software upgrade - " + e.getMessage()
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+        }
+    }
+
+    void prepareFalloutHandler(DelegateExecution execution) {
+        WorkflowContext workflowContext = getWorkflowContext(execution)
+        if (workflowContext == null) {
+            logger.debug("Error occurred before sending response to API handler, and send it now")
+            sendResponse(execution)
+        }
+
+        try {
+            String requestId = execution.getVariable(REQUEST_ID)
+            logger.debug("Prepare FalloutHandler of PNF Software Upgrade for requestId: {}", requestId)
+
+            WorkflowException workflowException = execution.getVariable("WorkflowException")
+            String errorCode = String.valueOf(workflowException.getErrorCode())
+            String errorMessage = workflowException.getErrorMessage()
+            String falloutHandlerRequest =
+                    """<aetgt:FalloutHandlerRequest xmlns:aetgt="http://org.onap/so/workflow/schema/v1"
+                                xmlns:ns="http://org.onap/so/request/types/v1">
+                        <request-info xmlns="http://org.onap/so/infra/vnf-request/v1">
+                            <request-id>${MsoUtils.xmlEscape(requestId)}</request-id>
+                            <action>UPDATE</action>
+                            <source>VID</source>
+                        </request-info>
+                        <aetgt:WorkflowException xmlns:aetgt="http://org.onap/so/workflow/schema/v1">
+                            <aetgt:ErrorMessage>${MsoUtils.xmlEscape(errorMessage)}</aetgt:ErrorMessage>
+                            <aetgt:ErrorCode>${MsoUtils.xmlEscape(errorCode)}</aetgt:ErrorCode>
+                        </aetgt:WorkflowException>
+                    </aetgt:FalloutHandlerRequest>"""
+            String xmlFalloutHandlerRequest = utils.formatXml(falloutHandlerRequest)
+
+            execution.setVariable(prefix + "FalloutHandlerRequest", xmlFalloutHandlerRequest)
+
+            logger.debug("FalloutHandlerRequest of PNF Software Upgrade - " + "\n" + xmlFalloutHandlerRequest)
+        } catch (Exception e) {
+            String msg = "Prepare FalloutHandler error for PNF software upgrade - " + e.getMessage()
+            logger.error(msg)
+            exceptionUtil.buildAndThrowWorkflowException(execution, 2000, msg)
+        }
+    }
+}
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSWUPDownload.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSWUPDownload.bpmn
index 24ca710..5d52319 100644
--- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSWUPDownload.bpmn
+++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSWUPDownload.bpmn
@@ -1,15 +1,15 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_0474hns" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.3.4">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" id="Definitions_0474hns" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.1.0">
   <bpmn:process id="PNFSWUPDownload" name="PNFSWUPDownload" isExecutable="true">
     <bpmn:startEvent id="download_StartEvent" name="Start Flow">
       <bpmn:outgoing>SequenceFlow_1fdclh0</bpmn:outgoing>
     </bpmn:startEvent>
     <bpmn:serviceTask id="ServiceTask_1mpt2eq" name="NF Download Dispatcher" camunda:delegateExpression="${NfSoftwareUpgradeDispatcher}">
       <bpmn:incoming>SequenceFlow_1fdclh0</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_12155q6</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_0kusy70</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:endEvent id="download_EndEvent" name="End">
-      <bpmn:incoming>SequenceFlow_1d2rfyx</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0mjjdia</bpmn:incoming>
       <bpmn:terminateEventDefinition id="TerminateEventDefinition_1kiurmf" />
     </bpmn:endEvent>
     <bpmn:exclusiveGateway id="ExclusiveGateway_1ja7grm" default="SequenceFlow_078xmlz">
@@ -32,8 +32,8 @@
     </bpmn:endEvent>
     <bpmn:exclusiveGateway id="ExclusiveGateway_08lusga" default="SequenceFlow_1gawssm">
       <bpmn:incoming>SequenceFlow_1kaikh5</bpmn:incoming>
-      <bpmn:outgoing>SequenceFlow_1d2rfyx</bpmn:outgoing>
       <bpmn:outgoing>SequenceFlow_1gawssm</bpmn:outgoing>
+      <bpmn:outgoing>SequenceFlow_1d2rfyx</bpmn:outgoing>
     </bpmn:exclusiveGateway>
     <bpmn:endEvent id="EndEvent_11hee4g">
       <bpmn:incoming>SequenceFlow_1gawssm</bpmn:incoming>
@@ -73,10 +73,7 @@
       <bpmn:outgoing>SequenceFlow_1ccldpp</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_1fdclh0" sourceRef="download_StartEvent" targetRef="ServiceTask_1mpt2eq" />
-    <bpmn:sequenceFlow id="SequenceFlow_12155q6" sourceRef="ServiceTask_1mpt2eq" targetRef="ServiceTask_1nl90ao" />
-    <bpmn:sequenceFlow id="SequenceFlow_1d2rfyx" name="Success" sourceRef="ExclusiveGateway_08lusga" targetRef="download_EndEvent">
-      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("ControllerStatus").equals("Success")}</bpmn:conditionExpression>
-    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="SequenceFlow_12155q6" sourceRef="ScriptTask_1ankfw8" targetRef="ServiceTask_1nl90ao" />
     <bpmn:sequenceFlow id="SequenceFlow_0o6b6a8" sourceRef="ServiceTask_0yavde3" targetRef="ExclusiveGateway_1ja7grm" />
     <bpmn:sequenceFlow id="SequenceFlow_078xmlz" name="Failure" sourceRef="ExclusiveGateway_1ja7grm" targetRef="EndEvent_1j64ij1" />
     <bpmn:sequenceFlow id="SequenceFlow_1ccldpp" sourceRef="ServiceTask_1nl90ao" targetRef="ExclusiveGateway_1rj84ne" />
@@ -89,114 +86,230 @@
     <bpmn:sequenceFlow id="SequenceFlow_0qznt4u" name="Success" sourceRef="ExclusiveGateway_1ja7grm" targetRef="ServiceTask_1wxo7xz">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("ControllerStatus").equals("Success")}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
+    <bpmn:subProcess id="SubProcess_02e59i3" name="Subprocess for FalloutHandler" triggeredByEvent="true">
+      <bpmn:startEvent id="StartEvent_0uftj43" name="Catch All Errors">
+        <bpmn:outgoing>SequenceFlow_0swi04u</bpmn:outgoing>
+        <bpmn:errorEventDefinition id="ErrorEventDefinition_061iekb" />
+      </bpmn:startEvent>
+      <bpmn:scriptTask id="ScriptTask_1yzq4u7" name="Prepare FalloutHandler" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_0swi04u</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1ppn4a8</bpmn:outgoing>
+        <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.prepareFalloutHandler(execution)</bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:callActivity id="CallActivity_0ikcgtm" name="Call FalloutHandler" calledElement="FalloutHandler">
+        <bpmn:extensionElements>
+          <camunda:in source="PnfSwUpgrade_FalloutHandlerRequest" target="FalloutHandlerRequest" />
+        </bpmn:extensionElements>
+        <bpmn:incoming>SequenceFlow_1ppn4a8</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1ahmdun</bpmn:outgoing>
+      </bpmn:callActivity>
+      <bpmn:endEvent id="EndEvent_1xtb63b" name="End">
+        <bpmn:incoming>SequenceFlow_1ahmdun</bpmn:incoming>
+        <bpmn:terminateEventDefinition id="TerminateEventDefinition_1vngo0e" />
+      </bpmn:endEvent>
+      <bpmn:sequenceFlow id="SequenceFlow_1ahmdun" sourceRef="CallActivity_0ikcgtm" targetRef="EndEvent_1xtb63b" />
+      <bpmn:sequenceFlow id="SequenceFlow_1ppn4a8" sourceRef="ScriptTask_1yzq4u7" targetRef="CallActivity_0ikcgtm" />
+      <bpmn:sequenceFlow id="SequenceFlow_0swi04u" sourceRef="StartEvent_0uftj43" targetRef="ScriptTask_1yzq4u7" />
+    </bpmn:subProcess>
+    <bpmn:scriptTask id="ScriptTask_1ankfw8" name="Send Response" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_0kusy70</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_12155q6</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.sendResponse(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0kusy70" sourceRef="ServiceTask_1mpt2eq" targetRef="ScriptTask_1ankfw8" />
+    <bpmn:scriptTask id="ScriptTask_17f7m2t" name="Prepare Completion" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1d2rfyx</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_183s0wo</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.prepareCompletion(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:callActivity id="CallActivity_0tq2dug" name="Complete Process" calledElement="CompleteMsoProcess">
+      <bpmn:extensionElements>
+        <camunda:in source="PnfSwUpgrade_CompleteMsoProcessRequest" target="CompleteMsoProcessRequest" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_183s0wo</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0mjjdia</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_183s0wo" sourceRef="ScriptTask_17f7m2t" targetRef="CallActivity_0tq2dug" />
+    <bpmn:sequenceFlow id="SequenceFlow_1d2rfyx" name="Success" sourceRef="ExclusiveGateway_08lusga" targetRef="ScriptTask_17f7m2t">
+      <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("ControllerStatus").equals("Success")}</bpmn:conditionExpression>
+    </bpmn:sequenceFlow>
+    <bpmn:sequenceFlow id="SequenceFlow_0mjjdia" sourceRef="CallActivity_0tq2dug" targetRef="download_EndEvent" />
   </bpmn:process>
   <bpmn:error id="Error_1q14dnd" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="PNFSWUPDownload">
       <bpmndi:BPMNShape id="StartEvent_1k8gssq_di" bpmnElement="download_StartEvent">
-        <dc:Bounds x="162" y="102" width="36" height="36" />
+        <dc:Bounds x="172" y="103" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="157" y="145" width="50" height="14" />
+          <dc:Bounds x="167" y="146" width="50" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1mpt2eq_di" bpmnElement="ServiceTask_1mpt2eq">
-        <dc:Bounds x="280" y="80" width="100" height="80" />
+        <dc:Bounds x="270" y="81" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1e4dq7w_di" bpmnElement="download_EndEvent">
-        <dc:Bounds x="1312" y="102" width="36" height="36" />
+        <dc:Bounds x="512" y="463" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1321" y="145" width="20" height="14" />
+          <dc:Bounds x="522" y="506" width="18" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ExclusiveGateway_1ja7grm_di" bpmnElement="ExclusiveGateway_1ja7grm" isMarkerVisible="true">
-        <dc:Bounds x="895" y="95" width="50" height="50" />
+        <dc:Bounds x="615" y="235" width="50" height="50" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1j64ij1_di" bpmnElement="EndEvent_1j64ij1">
-        <dc:Bounds x="902" y="252" width="36" height="36" />
+        <dc:Bounds x="622" y="344" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ExclusiveGateway_1rj84ne_di" bpmnElement="ExclusiveGateway_1rj84ne" isMarkerVisible="true">
-        <dc:Bounds x="635" y="95" width="50" height="50" />
+        <dc:Bounds x="355" y="235" width="50" height="50" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1ubpef4_di" bpmnElement="EndEvent_1ubpef4">
-        <dc:Bounds x="642" y="252" width="36" height="36" />
+        <dc:Bounds x="362" y="344" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ExclusiveGateway_08lusga_di" bpmnElement="ExclusiveGateway_08lusga" isMarkerVisible="true">
-        <dc:Bounds x="1155" y="95" width="50" height="50" />
+        <dc:Bounds x="875" y="235" width="50" height="50" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_11hee4g_di" bpmnElement="EndEvent_11hee4g">
-        <dc:Bounds x="1162" y="252" width="36" height="36" />
+        <dc:Bounds x="882" y="344" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_0yavde3_di" bpmnElement="ServiceTask_0yavde3">
-        <dc:Bounds x="760" y="80" width="100" height="80" />
+        <dc:Bounds x="480" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1wxo7xz_di" bpmnElement="ServiceTask_1wxo7xz">
-        <dc:Bounds x="1000" y="80" width="100" height="80" />
+        <dc:Bounds x="720" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_1nl90ao_di" bpmnElement="ServiceTask_1nl90ao">
-        <dc:Bounds x="480" y="80" width="100" height="80" />
+        <dc:Bounds x="200" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1fdclh0_di" bpmnElement="SequenceFlow_1fdclh0">
-        <di:waypoint x="198" y="120" />
-        <di:waypoint x="280" y="120" />
+        <di:waypoint x="208" y="121" />
+        <di:waypoint x="270" y="121" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_12155q6_di" bpmnElement="SequenceFlow_12155q6">
-        <di:waypoint x="380" y="120" />
-        <di:waypoint x="480" y="120" />
-      </bpmndi:BPMNEdge>
-      <bpmndi:BPMNEdge id="SequenceFlow_1d2rfyx_di" bpmnElement="SequenceFlow_1d2rfyx">
-        <di:waypoint x="1205" y="120" />
-        <di:waypoint x="1312" y="120" />
-        <bpmndi:BPMNLabel>
-          <dc:Bounds x="1214" y="102" width="43" height="14" />
-        </bpmndi:BPMNLabel>
+        <di:waypoint x="540" y="121" />
+        <di:waypoint x="570" y="121" />
+        <di:waypoint x="570" y="190" />
+        <di:waypoint x="160" y="190" />
+        <di:waypoint x="160" y="260" />
+        <di:waypoint x="200" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0o6b6a8_di" bpmnElement="SequenceFlow_0o6b6a8">
-        <di:waypoint x="860" y="120" />
-        <di:waypoint x="895" y="120" />
+        <di:waypoint x="580" y="260" />
+        <di:waypoint x="615" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_078xmlz_di" bpmnElement="SequenceFlow_078xmlz">
-        <di:waypoint x="920" y="145" />
-        <di:waypoint x="920" y="252" />
+        <di:waypoint x="640" y="285" />
+        <di:waypoint x="640" y="344" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="918" y="217" width="34" height="14" />
+          <dc:Bounds x="650" y="291" width="32" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1ccldpp_di" bpmnElement="SequenceFlow_1ccldpp">
-        <di:waypoint x="580" y="120" />
-        <di:waypoint x="635" y="120" />
+        <di:waypoint x="300" y="260" />
+        <di:waypoint x="355" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0s6i4o9_di" bpmnElement="SequenceFlow_0s6i4o9">
-        <di:waypoint x="685" y="120" />
-        <di:waypoint x="760" y="120" />
+        <di:waypoint x="405" y="260" />
+        <di:waypoint x="480" y="260" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="678" y="102" width="43" height="14" />
+          <dc:Bounds x="398" y="242" width="43" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1tfbzn1_di" bpmnElement="SequenceFlow_1tfbzn1">
-        <di:waypoint x="660" y="145" />
-        <di:waypoint x="660" y="252" />
+        <di:waypoint x="380" y="285" />
+        <di:waypoint x="380" y="344" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="658" y="217" width="34" height="14" />
+          <dc:Bounds x="384" y="292" width="32" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1kaikh5_di" bpmnElement="SequenceFlow_1kaikh5">
-        <di:waypoint x="1100" y="120" />
-        <di:waypoint x="1155" y="120" />
+        <di:waypoint x="820" y="260" />
+        <di:waypoint x="875" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1gawssm_di" bpmnElement="SequenceFlow_1gawssm">
-        <di:waypoint x="1180" y="145" />
-        <di:waypoint x="1180" y="252" />
+        <di:waypoint x="900" y="285" />
+        <di:waypoint x="900" y="344" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1178" y="172" width="34" height="14" />
+          <dc:Bounds x="912" y="290" width="32" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0qznt4u_di" bpmnElement="SequenceFlow_0qznt4u">
-        <di:waypoint x="945" y="120" />
-        <di:waypoint x="1000" y="120" />
+        <di:waypoint x="665" y="260" />
+        <di:waypoint x="720" y="260" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="951" y="102" width="43" height="14" />
+          <dc:Bounds x="671" y="242" width="43" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="SubProcess_02e59i3_di" bpmnElement="SubProcess_02e59i3" isExpanded="true">
+        <dc:Bounds x="190" y="580" width="650" height="190" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="StartEvent_0uftj43_di" bpmnElement="StartEvent_0uftj43">
+        <dc:Bounds x="262" y="662" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="242" y="703" width="76" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="ScriptTask_1yzq4u7_di" bpmnElement="ScriptTask_1yzq4u7">
+        <dc:Bounds x="360" y="640" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0ikcgtm_di" bpmnElement="CallActivity_0ikcgtm">
+        <dc:Bounds x="530" y="640" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1xtb63b_di" bpmnElement="EndEvent_1xtb63b">
+        <dc:Bounds x="702" y="662" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="712" y="705" width="18" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ahmdun_di" bpmnElement="SequenceFlow_1ahmdun">
+        <di:waypoint x="630" y="680" />
+        <di:waypoint x="702" y="680" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1ppn4a8_di" bpmnElement="SequenceFlow_1ppn4a8">
+        <di:waypoint x="460" y="680" />
+        <di:waypoint x="530" y="680" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0swi04u_di" bpmnElement="SequenceFlow_0swi04u">
+        <di:waypoint x="298" y="680" />
+        <di:waypoint x="360" y="680" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1ankfw8_di" bpmnElement="ScriptTask_1ankfw8">
+        <dc:Bounds x="440" y="81" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0kusy70_di" bpmnElement="SequenceFlow_0kusy70">
+        <di:waypoint x="370" y="121" />
+        <di:waypoint x="440" y="121" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_17f7m2t_di" bpmnElement="ScriptTask_17f7m2t">
+        <dc:Bounds x="202" y="441" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_0tq2dug_di" bpmnElement="CallActivity_0tq2dug">
+        <dc:Bounds x="355" y="441" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_183s0wo_di" bpmnElement="SequenceFlow_183s0wo">
+        <di:waypoint x="302" y="481" />
+        <di:waypoint x="355" y="481" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1d2rfyx_di" bpmnElement="SequenceFlow_1d2rfyx">
+        <di:waypoint x="925" y="260" />
+        <di:waypoint x="970" y="260" />
+        <di:waypoint x="970" y="410" />
+        <di:waypoint x="160" y="410" />
+        <di:waypoint x="160" y="481" />
+        <di:waypoint x="202" y="481" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="938" y="242" width="43" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_0mjjdia_di" bpmnElement="SequenceFlow_0mjjdia">
+        <di:waypoint x="455" y="481" />
+        <di:waypoint x="512" y="481" />
+      </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
 </bpmn:definitions>
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSoftwareUpgrade.bpmn b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSoftwareUpgrade.bpmn
index 8d59dac..4ff0af4 100644
--- a/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSoftwareUpgrade.bpmn
+++ b/bpmn/so-bpmn-infrastructure-flows/src/main/resources/process/PNFSoftwareUpgrade.bpmn
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1yd8m0g" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.3.4">
+<bpmn:definitions xmlns:bpmn="http://www.omg.org/spec/BPMN/20100524/MODEL" xmlns:bpmndi="http://www.omg.org/spec/BPMN/20100524/DI" xmlns:dc="http://www.omg.org/spec/DD/20100524/DC" xmlns:camunda="http://camunda.org/schema/1.0/bpmn" xmlns:di="http://www.omg.org/spec/DD/20100524/DI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" id="Definitions_1yd8m0g" targetNamespace="http://bpmn.io/schema/bpmn" exporter="Camunda Modeler" exporterVersion="3.1.0">
   <bpmn:process id="PNFSoftwareUpgrade" name="PNFSoftwareUpgrade" isExecutable="true">
     <bpmn:startEvent id="softwareUpgrade_startEvent" name="Start Flow">
       <bpmn:outgoing>SequenceFlow_1ng4b6l</bpmn:outgoing>
@@ -8,9 +8,9 @@
       <bpmn:incoming>SequenceFlow_1ng4b6l</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_12ejx4m</bpmn:outgoing>
     </bpmn:serviceTask>
-    <bpmn:sequenceFlow id="SequenceFlow_12ejx4m" sourceRef="ServiceTask_042uz7n" targetRef="ServiceTask_0slpahe" />
+    <bpmn:sequenceFlow id="SequenceFlow_12ejx4m" sourceRef="ServiceTask_042uz7n" targetRef="ScriptTask_10klpg8" />
     <bpmn:endEvent id="softwareUpgrade_endEvent" name="End">
-      <bpmn:incoming>SequenceFlow_1atiydu</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0tle5zb</bpmn:incoming>
       <bpmn:terminateEventDefinition />
     </bpmn:endEvent>
     <bpmn:sequenceFlow id="SequenceFlow_1ng4b6l" sourceRef="softwareUpgrade_startEvent" targetRef="ServiceTask_042uz7n" />
@@ -60,7 +60,7 @@
     <bpmn:sequenceFlow id="SequenceFlow_1eljvek" name="Success" sourceRef="ExclusiveGateway_0v3l3wv" targetRef="ServiceTask_02lxf48">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("ControllerStatus").equals("Success")}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
-    <bpmn:sequenceFlow id="SequenceFlow_1atiydu" name="Success" sourceRef="ExclusiveGateway_1ny9b1z" targetRef="softwareUpgrade_endEvent">
+    <bpmn:sequenceFlow id="SequenceFlow_1atiydu" name="Success" sourceRef="ExclusiveGateway_1ny9b1z" targetRef="ScriptTask_1igtc83">
       <bpmn:conditionExpression xsi:type="bpmn:tFormalExpression">#{execution.getVariable("ControllerStatus").equals("Success")}</bpmn:conditionExpression>
     </bpmn:sequenceFlow>
     <bpmn:sequenceFlow id="SequenceFlow_0eiif6e" name="Success" sourceRef="ExclusiveGateway_0ch3fef" targetRef="ServiceTask_1jo8vn7">
@@ -110,7 +110,7 @@
           <camunda:inputParameter name="mode">async</camunda:inputParameter>
         </camunda:inputOutput>
       </bpmn:extensionElements>
-      <bpmn:incoming>SequenceFlow_12ejx4m</bpmn:incoming>
+      <bpmn:incoming>SequenceFlow_0ks3p41</bpmn:incoming>
       <bpmn:outgoing>SequenceFlow_0j26xlx</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_0j26xlx" sourceRef="ServiceTask_0slpahe" targetRef="ExclusiveGateway_0x6h0ni" />
@@ -119,9 +119,59 @@
       <bpmn:outgoing>SequenceFlow_084orr1</bpmn:outgoing>
     </bpmn:serviceTask>
     <bpmn:sequenceFlow id="SequenceFlow_084orr1" sourceRef="ServiceTask_1jo8vn7" targetRef="ServiceTask_0y2uysu" />
+    <bpmn:scriptTask id="ScriptTask_10klpg8" name="Send Response" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_12ejx4m</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0ks3p41</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.sendResponse(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0ks3p41" sourceRef="ScriptTask_10klpg8" targetRef="ServiceTask_0slpahe" />
+    <bpmn:scriptTask id="ScriptTask_1igtc83" name="Prepare Completion" scriptFormat="groovy">
+      <bpmn:incoming>SequenceFlow_1atiydu</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0ipc3nt</bpmn:outgoing>
+      <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.prepareCompletion(execution)</bpmn:script>
+    </bpmn:scriptTask>
+    <bpmn:sequenceFlow id="SequenceFlow_0ipc3nt" sourceRef="ScriptTask_1igtc83" targetRef="CallActivity_0o1mi8u" />
+    <bpmn:callActivity id="CallActivity_0o1mi8u" name="Complete Process" calledElement="CompleteMsoProcess">
+      <bpmn:extensionElements>
+        <camunda:in source="PnfSwUpgrade_CompleteMsoProcessRequest" target="CompleteMsoProcessRequest" />
+      </bpmn:extensionElements>
+      <bpmn:incoming>SequenceFlow_0ipc3nt</bpmn:incoming>
+      <bpmn:outgoing>SequenceFlow_0tle5zb</bpmn:outgoing>
+    </bpmn:callActivity>
+    <bpmn:sequenceFlow id="SequenceFlow_0tle5zb" sourceRef="CallActivity_0o1mi8u" targetRef="softwareUpgrade_endEvent" />
+    <bpmn:subProcess id="SubProcess_02p6q4s" name="Subprocess for FalloutHandler" triggeredByEvent="true">
+      <bpmn:startEvent id="StartEvent_149ecdm" name="Catch All Errors">
+        <bpmn:outgoing>SequenceFlow_05haut5</bpmn:outgoing>
+        <bpmn:errorEventDefinition id="ErrorEventDefinition_1" />
+      </bpmn:startEvent>
+      <bpmn:scriptTask id="ScriptTask_0gov132" name="Prepare FalloutHandler" scriptFormat="groovy">
+        <bpmn:incoming>SequenceFlow_05haut5</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_09y0mpc</bpmn:outgoing>
+        <bpmn:script>import org.onap.so.bpmn.infrastructure.scripts.*
+def pnfSwUpgrade = new PNFSoftwareUpgrade()
+pnfSwUpgrade.prepareFalloutHandler(execution)</bpmn:script>
+      </bpmn:scriptTask>
+      <bpmn:callActivity id="CallActivity_00psvtk" name="Call FalloutHandler" calledElement="FalloutHandler">
+        <bpmn:extensionElements>
+          <camunda:in source="PnfSwUpgrade_FalloutHandlerRequest" target="FalloutHandlerRequest" />
+        </bpmn:extensionElements>
+        <bpmn:incoming>SequenceFlow_09y0mpc</bpmn:incoming>
+        <bpmn:outgoing>SequenceFlow_1tcjlty</bpmn:outgoing>
+      </bpmn:callActivity>
+      <bpmn:endEvent id="EndEvent_1vq2glg" name="End">
+        <bpmn:incoming>SequenceFlow_1tcjlty</bpmn:incoming>
+        <bpmn:terminateEventDefinition id="TerminateEventDefinition_0994ojb" />
+      </bpmn:endEvent>
+      <bpmn:sequenceFlow id="SequenceFlow_05haut5" sourceRef="StartEvent_149ecdm" targetRef="ScriptTask_0gov132" />
+      <bpmn:sequenceFlow id="SequenceFlow_09y0mpc" sourceRef="ScriptTask_0gov132" targetRef="CallActivity_00psvtk" />
+      <bpmn:sequenceFlow id="SequenceFlow_1tcjlty" sourceRef="CallActivity_00psvtk" targetRef="EndEvent_1vq2glg" />
+    </bpmn:subProcess>
   </bpmn:process>
   <bpmn:error id="Error_12cpov5" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
-  <bpmn:error id="Error_0nmskzh" name="MSOWorkflowException" errorCode="MSOWorkflowException" />
   <bpmndi:BPMNDiagram id="BPMNDiagram_1">
     <bpmndi:BPMNPlane id="BPMNPlane_1" bpmnElement="PNFSoftwareUpgrade">
       <bpmndi:BPMNShape id="_BPMNShape_StartEvent_2" bpmnElement="softwareUpgrade_startEvent">
@@ -131,142 +181,204 @@
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ServiceTask_042uz7n_di" bpmnElement="ServiceTask_042uz7n">
-        <dc:Bounds x="280" y="80" width="100" height="80" />
+        <dc:Bounds x="270" y="80" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_12ejx4m_di" bpmnElement="SequenceFlow_12ejx4m">
-        <di:waypoint x="380" y="120" />
-        <di:waypoint x="480" y="120" />
+        <di:waypoint x="370" y="120" />
+        <di:waypoint x="440" y="120" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_1w3jv30_di" bpmnElement="softwareUpgrade_endEvent">
-        <dc:Bounds x="1662" y="102" width="36" height="36" />
+        <dc:Bounds x="532" y="462" width="36" height="36" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1671" y="145" width="20" height="14" />
+          <dc:Bounds x="542" y="505" width="18" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1ng4b6l_di" bpmnElement="SequenceFlow_1ng4b6l">
         <di:waypoint x="198" y="120" />
-        <di:waypoint x="280" y="120" />
+        <di:waypoint x="270" y="120" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ExclusiveGateway_0v3l3wv_di" bpmnElement="ExclusiveGateway_0v3l3wv" isMarkerVisible="true">
-        <dc:Bounds x="895" y="95" width="50" height="50" />
+        <dc:Bounds x="615" y="235" width="50" height="50" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1040" y="65" width="43" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_0bnbfds_di" bpmnElement="EndEvent_0bnbfds">
-        <dc:Bounds x="902" y="252" width="36" height="36" />
+        <dc:Bounds x="622" y="342" width="36" height="36" />
         <bpmndi:BPMNLabel>
           <dc:Bounds x="1044" y="295" width="34" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="ExclusiveGateway_0x6h0ni_di" bpmnElement="ExclusiveGateway_0x6h0ni" isMarkerVisible="true">
-        <dc:Bounds x="635" y="95" width="50" height="50" />
+        <dc:Bounds x="355" y="235" width="50" height="50" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1nsmyr5_di" bpmnElement="SequenceFlow_1nsmyr5">
-        <di:waypoint x="685" y="120" />
-        <di:waypoint x="760" y="120" />
+        <di:waypoint x="405" y="260" />
+        <di:waypoint x="460" y="260" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="678" y="102" width="43" height="14" />
+          <dc:Bounds x="408" y="242" width="43" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="EndEvent_180lm4y_di" bpmnElement="EndEvent_180lm4y">
-        <dc:Bounds x="642" y="252" width="36" height="36" />
+        <dc:Bounds x="362" y="342" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0piri91_di" bpmnElement="SequenceFlow_0piri91">
-        <di:waypoint x="660" y="145" />
-        <di:waypoint x="660" y="252" />
+        <di:waypoint x="380" y="285" />
+        <di:waypoint x="380" y="342" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="658" y="217" width="34" height="14" />
+          <dc:Bounds x="384" y="293" width="32" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1lr7vgu_di" bpmnElement="SequenceFlow_1lr7vgu">
-        <di:waypoint x="920" y="145" />
-        <di:waypoint x="920" y="252" />
+        <di:waypoint x="640" y="285" />
+        <di:waypoint x="640" y="342" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="918" y="217" width="34" height="14" />
+          <dc:Bounds x="644" y="293" width="32" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ExclusiveGateway_0ch3fef_di" bpmnElement="ExclusiveGateway_0ch3fef" isMarkerVisible="true">
-        <dc:Bounds x="1125" y="95" width="50" height="50" />
+        <dc:Bounds x="845" y="235" width="50" height="50" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_1ms4wdz_di" bpmnElement="EndEvent_1ms4wdz">
-        <dc:Bounds x="1132" y="252" width="36" height="36" />
+        <dc:Bounds x="852" y="342" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0dqnb6c_di" bpmnElement="SequenceFlow_0dqnb6c">
-        <di:waypoint x="1150" y="145" />
-        <di:waypoint x="1150" y="252" />
+        <di:waypoint x="870" y="285" />
+        <di:waypoint x="870" y="342" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1148" y="230" width="34" height="14" />
+          <dc:Bounds x="874" y="293" width="32" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ExclusiveGateway_1ny9b1z_di" bpmnElement="ExclusiveGateway_1ny9b1z" isMarkerVisible="true">
-        <dc:Bounds x="1505" y="95" width="50" height="50" />
+        <dc:Bounds x="1225" y="235" width="50" height="50" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNShape id="EndEvent_0l6n6x5_di" bpmnElement="EndEvent_0l6n6x5">
-        <dc:Bounds x="1512" y="252" width="36" height="36" />
+        <dc:Bounds x="1232" y="342" width="36" height="36" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_1p0axph_di" bpmnElement="SequenceFlow_1p0axph">
-        <di:waypoint x="1530" y="145" />
-        <di:waypoint x="1530" y="252" />
+        <di:waypoint x="1250" y="285" />
+        <di:waypoint x="1250" y="342" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1528" y="172" width="34" height="14" />
+          <dc:Bounds x="1254" y="293" width="32" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1eljvek_di" bpmnElement="SequenceFlow_1eljvek">
-        <di:waypoint x="945" y="120" />
-        <di:waypoint x="1010" y="120" />
+        <di:waypoint x="665" y="260" />
+        <di:waypoint x="720" y="260" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="938" y="102" width="43" height="14" />
+          <dc:Bounds x="668" y="242" width="43" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_1atiydu_di" bpmnElement="SequenceFlow_1atiydu">
-        <di:waypoint x="1555" y="120" />
-        <di:waypoint x="1662" y="120" />
+        <di:waypoint x="1275" y="260" />
+        <di:waypoint x="1320" y="260" />
+        <di:waypoint x="1320" y="410" />
+        <di:waypoint x="180" y="410" />
+        <di:waypoint x="180" y="480" />
+        <di:waypoint x="220" y="480" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1564" y="102" width="43" height="14" />
+          <dc:Bounds x="1277" y="242" width="43" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNEdge id="SequenceFlow_0eiif6e_di" bpmnElement="SequenceFlow_0eiif6e">
-        <di:waypoint x="1175" y="120" />
-        <di:waypoint x="1210" y="120" />
+        <di:waypoint x="895" y="260" />
+        <di:waypoint x="950" y="260" />
         <bpmndi:BPMNLabel>
-          <dc:Bounds x="1169" y="102" width="43" height="14" />
+          <dc:Bounds x="898" y="242" width="43" height="14" />
         </bpmndi:BPMNLabel>
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0x5cje8_di" bpmnElement="ServiceTask_0x5cje8">
-        <dc:Bounds x="760" y="80" width="100" height="80" />
+        <dc:Bounds x="460" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0cchgih_di" bpmnElement="SequenceFlow_0cchgih">
-        <di:waypoint x="860" y="120" />
-        <di:waypoint x="895" y="120" />
+        <di:waypoint x="560" y="260" />
+        <di:waypoint x="615" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_02lxf48_di" bpmnElement="ServiceTask_02lxf48">
-        <dc:Bounds x="1010" y="80" width="100" height="80" />
+        <dc:Bounds x="720" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_015y785_di" bpmnElement="SequenceFlow_015y785">
-        <di:waypoint x="1110" y="120" />
-        <di:waypoint x="1125" y="120" />
+        <di:waypoint x="820" y="260" />
+        <di:waypoint x="845" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0y2uysu_di" bpmnElement="ServiceTask_0y2uysu">
-        <dc:Bounds x="1370" y="80" width="100" height="80" />
+        <dc:Bounds x="1090" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0g3qcd0_di" bpmnElement="SequenceFlow_0g3qcd0">
-        <di:waypoint x="1470" y="120" />
-        <di:waypoint x="1505" y="120" />
+        <di:waypoint x="1190" y="260" />
+        <di:waypoint x="1225" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_0slpahe_di" bpmnElement="ServiceTask_0slpahe">
-        <dc:Bounds x="480" y="80" width="100" height="80" />
+        <dc:Bounds x="220" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_0j26xlx_di" bpmnElement="SequenceFlow_0j26xlx">
-        <di:waypoint x="580" y="120" />
-        <di:waypoint x="635" y="120" />
+        <di:waypoint x="320" y="260" />
+        <di:waypoint x="355" y="260" />
       </bpmndi:BPMNEdge>
       <bpmndi:BPMNShape id="ServiceTask_1jo8vn7_di" bpmnElement="ServiceTask_1jo8vn7">
-        <dc:Bounds x="1210" y="80" width="100" height="80" />
+        <dc:Bounds x="950" y="220" width="100" height="80" />
       </bpmndi:BPMNShape>
       <bpmndi:BPMNEdge id="SequenceFlow_084orr1_di" bpmnElement="SequenceFlow_084orr1">
-        <di:waypoint x="1310" y="120" />
-        <di:waypoint x="1370" y="120" />
+        <di:waypoint x="1050" y="260" />
+        <di:waypoint x="1090" y="260" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_10klpg8_di" bpmnElement="ScriptTask_10klpg8">
+        <dc:Bounds x="440" y="80" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ks3p41_di" bpmnElement="SequenceFlow_0ks3p41">
+        <di:waypoint x="540" y="120" />
+        <di:waypoint x="570" y="120" />
+        <di:waypoint x="570" y="190" />
+        <di:waypoint x="180" y="190" />
+        <di:waypoint x="180" y="260" />
+        <di:waypoint x="220" y="260" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_1igtc83_di" bpmnElement="ScriptTask_1igtc83">
+        <dc:Bounds x="220" y="440" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0ipc3nt_di" bpmnElement="SequenceFlow_0ipc3nt">
+        <di:waypoint x="320" y="480" />
+        <di:waypoint x="380" y="480" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="CallActivity_0o1mi8u_di" bpmnElement="CallActivity_0o1mi8u">
+        <dc:Bounds x="380" y="440" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_0tle5zb_di" bpmnElement="SequenceFlow_0tle5zb">
+        <di:waypoint x="480" y="480" />
+        <di:waypoint x="532" y="480" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="ScriptTask_0gov132_di" bpmnElement="ScriptTask_0gov132">
+        <dc:Bounds x="540" y="630" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="CallActivity_00psvtk_di" bpmnElement="CallActivity_00psvtk">
+        <dc:Bounds x="710" y="630" width="100" height="80" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="EndEvent_1vq2glg_di" bpmnElement="EndEvent_1vq2glg">
+        <dc:Bounds x="882" y="652" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="892" y="695" width="18" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_09y0mpc_di" bpmnElement="SequenceFlow_09y0mpc">
+        <di:waypoint x="640" y="670" />
+        <di:waypoint x="710" y="670" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNEdge id="SequenceFlow_1tcjlty_di" bpmnElement="SequenceFlow_1tcjlty">
+        <di:waypoint x="810" y="670" />
+        <di:waypoint x="882" y="670" />
+      </bpmndi:BPMNEdge>
+      <bpmndi:BPMNShape id="StartEvent_1r4h504_di" bpmnElement="StartEvent_149ecdm">
+        <dc:Bounds x="442" y="652" width="36" height="36" />
+        <bpmndi:BPMNLabel>
+          <dc:Bounds x="422" y="693" width="76" height="14" />
+        </bpmndi:BPMNLabel>
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNShape id="SubProcess_02p6q4s_di" bpmnElement="SubProcess_02p6q4s" isExpanded="true">
+        <dc:Bounds x="370" y="570" width="650" height="190" />
+      </bpmndi:BPMNShape>
+      <bpmndi:BPMNEdge id="SequenceFlow_05haut5_di" bpmnElement="SequenceFlow_05haut5">
+        <di:waypoint x="478" y="670" />
+        <di:waypoint x="540" y="670" />
       </bpmndi:BPMNEdge>
     </bpmndi:BPMNPlane>
   </bpmndi:BPMNDiagram>
diff --git a/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java b/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java
index a9bf435..2993ed6 100644
--- a/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java
+++ b/bpmn/so-bpmn-infrastructure-flows/src/test/java/org/onap/so/bpmn/infrastructure/process/PNFSoftwareUpgradeTest.java
@@ -1,6 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2020 Nordix Foundation.
+ *  Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd.
  * ================================================================================
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -60,6 +61,7 @@
     private static final String TEST_PROCESSINSTANCE_KEY = "PNFSoftwareUpgrade";
     private static final AAIVersion VERSION = AAIVersion.LATEST;
     private static final Map<String, Object> executionVariables = new HashMap();
+    private static final String REQUEST_ID = "50ae41ad-049c-4fe2-9950-539f111120f5";
     private final String[] actionNames = new String[4];
     private String requestObject;
     private String responseObject;
@@ -80,6 +82,7 @@
         responseObject = FileUtil.readResourceFile("response/" + getClass().getSimpleName() + ".json");
 
         executionVariables.put("bpmnRequest", requestObject);
+        executionVariables.put("requestId", REQUEST_ID);
 
         /**
          * This variable indicates that the flow was invoked asynchronously. It's injected by {@link WorkflowProcessor}.
@@ -99,6 +102,7 @@
     public void workflow_validInput_expectedOutput() throws InterruptedException {
 
         mockCatalogDb();
+        mockRequestDb();
         mockAai();
 
         final String msoRequestId = UUID.randomUUID().toString();
@@ -118,9 +122,9 @@
 
         // Layout is to reflect the bpmn visual layout
         assertThat(pi).isEnded().hasPassedInOrder("softwareUpgrade_startEvent", "ServiceTask_042uz7n",
-                "ServiceTask_0slpahe", "ExclusiveGateway_0x6h0ni", "ServiceTask_0x5cje8", "ExclusiveGateway_0v3l3wv",
-                "ServiceTask_02lxf48", "ExclusiveGateway_0ch3fef", "ServiceTask_0y2uysu", "ExclusiveGateway_1ny9b1z",
-                "softwareUpgrade_endEvent");
+                "ScriptTask_10klpg8", "ServiceTask_0slpahe", "ExclusiveGateway_0x6h0ni", "ServiceTask_0x5cje8",
+                "ExclusiveGateway_0v3l3wv", "ServiceTask_02lxf48", "ExclusiveGateway_0ch3fef", "ServiceTask_0y2uysu",
+                "ExclusiveGateway_1ny9b1z", "ScriptTask_1igtc83", "CallActivity_0o1mi8u", "softwareUpgrade_endEvent");
 
         List<ExecutionServiceInput> detailedMessages = grpcNettyServer.getDetailedMessages();
         assertThat(detailedMessages.size() == 4);
@@ -202,6 +206,14 @@
         wireMockServer.stubFor(post(urlEqualTo("/aai/" + VERSION + "/network/pnfs/pnf/PNFDemo")));
     }
 
+    private void mockRequestDb() {
+        /**
+         * Update Request DB
+         */
+        wireMockServer.stubFor(put(urlEqualTo("/infraActiveRequests/" + REQUEST_ID)));
+
+    }
+
     /**
      * Mock the catalobdb rest interface.
      */
diff --git a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/sdnc/SdncControllerDE.java b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/sdnc/SdncControllerDE.java
index 8499b6f..ea3405d 100644
--- a/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/sdnc/SdncControllerDE.java
+++ b/bpmn/so-bpmn-tasks/src/main/java/org/onap/so/bpmn/infrastructure/decisionpoint/impl/camunda/controller/sdnc/SdncControllerDE.java
@@ -1,7 +1,7 @@
 /*-
  * ============LICENSE_START=======================================================
  *  Copyright (C) 2019 Nordix
- *  Modifications Copyright (C) 2020 Huawei
+ *  Modifications Copyright (C) 2020 Huawei Technologies Co., Ltd.
  *  ================================================================================
  *  Licensed under the Apache License, Version 2.0 (the "License");
  *  you may not use this file except in compliance with the License.
@@ -29,6 +29,8 @@
 import org.onap.so.bpmn.infrastructure.decisionpoint.api.ControllerContext;
 import org.onap.so.bpmn.infrastructure.decisionpoint.impl.camunda.controller.common.SoPropertyConstants;
 import org.onap.so.bpmn.infrastructure.decisionpoint.impl.camunda.controller.LcmControllerDE;
+import org.onap.so.client.exception.BadResponseException;
+import org.onap.so.client.exception.PayloadGenerationException;
 import org.onap.so.client.sdnc.common.SDNCConstants;
 import org.onap.so.client.sdnc.lcm.*;
 import org.onap.so.client.sdnc.lcm.beans.*;
@@ -59,25 +61,19 @@
         logger.debug("Running activity for id: {}, name: {}", execution.getCurrentActivityId(),
                 execution.getCurrentActivityName());
 
-        boolean result;
         try {
             LcmInput lcmInput = buildLcmInput(execution);
-            if (lcmInput != null) {
-                result = sendLcmRequest(execution, lcmInput);
-            } else {
-                logger.error("Build LCM Input error");
-                result = false;
-            }
+            sendLcmRequest(execution, lcmInput);
+
+            execution.setVariable(SoPropertyConstants.CONTROLLER_STATUS, "Success");
         } catch (Exception e) {
-            logger.error("Call SDNC LCM Client failure: ", e);
-            result = false;
+            execution.setVariable(SoPropertyConstants.CONTROLLER_STATUS, "Failure");
+
+            exceptionUtil.buildAndThrowWorkflowException(execution, SDNC_DELEGATE_EXECUTION_ERROR_CODE, e);
         }
 
-        if (result) {
-            execution.setVariable(SoPropertyConstants.CONTROLLER_STATUS, "Success");
-        } else {
-            execution.setVariable(SoPropertyConstants.CONTROLLER_STATUS, "Failure");
-        }
+        logger.debug("Finish activity for id: {}, name: {}", execution.getCurrentActivityId(),
+                execution.getCurrentActivityName());
 
         return 0;
     }
@@ -87,17 +83,24 @@
         return SDNC_DELEGATE_EXECUTION_ERROR_CODE;
     }
 
-    private LcmOutput sendSyncRequest(String operation, LcmInput lcmInput) {
+    private LcmOutput sendSyncRequest(String operation, LcmInput lcmInput) throws BadResponseException {
         SDNCLcmClientBuilder sdncLcmClientBuilder = new SDNCLcmClientBuilder();
         SDNCLcmRestClient sdncLcmRestClient;
         try {
             sdncLcmRestClient = sdncLcmClientBuilder.newSDNCLcmRestClient(operation);
         } catch (SDNCLcmClientBuilderException e) {
             logger.error("Create SDNCLcmRestClient error: ", e);
-            return null;
+            throw new BadResponseException("Can not send request to SDNC.");
         }
 
-        return sdncLcmRestClient.sendRequest(lcmInput);
+        LcmOutput lcmOutput;
+        try {
+            lcmOutput = sdncLcmRestClient.sendRequest(lcmInput);
+        } catch (Exception e) {
+            logger.error("SDNCLcmRestClient sends request failure: ", e);
+            throw new BadResponseException("Send request to SDNC failure.");
+        }
+        return lcmOutput;
     }
 
     private LcmOutput selectLcmOutputFromDmaapResponses(List<LcmDmaapResponse> lcmDmaapResponses, LcmInput lcmInput) {
@@ -115,22 +118,22 @@
         return null;
     }
 
-    private LcmOutput sendAsyncRequest(String operation, LcmInput lcmInput) {
+    private LcmOutput sendAsyncRequest(String operation, LcmInput lcmInput) throws BadResponseException {
         SDNCLcmClientBuilder sdncLcmClientBuilder = new SDNCLcmClientBuilder();
         SDNCLcmDmaapClient sdncLcmDmaapClient;
         try {
             sdncLcmDmaapClient = sdncLcmClientBuilder.newSDNCLcmDmaapClient();
         } catch (SDNCLcmClientBuilderException e) {
             logger.error("Create SDNCLcmDmaapClient error: ", e);
-            return null;
+            throw new BadResponseException("Can not send request to SDNC.");
         }
 
         LcmDmaapRequest lcmDmaapRequest = SDNCLcmMessageBuilder.buildLcmDmaapRequest(operation, lcmInput);
         try {
             sdncLcmDmaapClient.sendRequest(lcmDmaapRequest);
         } catch (Exception e) {
-            logger.error("SDNCLcmDmaapClient sends request error: ", e);
-            return null;
+            logger.error("SDNCLcmDmaapClient sends request failure: ", e);
+            throw new BadResponseException("Send request to SDNC failure.");
         }
 
         long timeout = sdncLcmClientBuilder.getSDNCLcmProperties().getActionTimeout();
@@ -146,8 +149,9 @@
 
             long stopTime = System.currentTimeMillis();
             if ((stopTime - startTime) > timeout) {
-                logger.error("Timeout for SDNC LCM action {}", lcmInput.getAction());
-                return null;
+                String msg = "Timeout for SDNC LCM action " + lcmInput.getAction();
+                logger.error(msg);
+                throw new BadResponseException(msg);
             }
         }
     }
@@ -158,7 +162,15 @@
         return lcmAction.replaceAll(regex, replacement).toLowerCase();
     }
 
-    private LcmInput buildLcmInput(DelegateExecution execution) throws JsonProcessingException {
+    private String convertToSting(Object msgObject) throws PayloadGenerationException {
+        try {
+            return SDNCLcmPayloadBuilder.convertToSting(msgObject);
+        } catch (JsonProcessingException e) {
+            throw new PayloadGenerationException(e.getMessage());
+        }
+    }
+
+    private LcmInput buildLcmInput(DelegateExecution execution) throws PayloadGenerationException {
         String requestId = String.valueOf(execution.getVariable(REQUEST_ID));
         String requestAction = String.valueOf(execution.getVariable(SoPropertyConstants.SO_ACTION));
         String pnfName = String.valueOf(execution.getVariable(PNF_CORRELATION_ID));
@@ -176,32 +188,33 @@
 
                 UpgradePreCheckPayload upgradePreCheckPayload;
                 upgradePreCheckPayload = SDNCLcmPayloadBuilder.buildUpgradePreCheckPayload(execution);
-                lcmPayload = SDNCLcmPayloadBuilder.convertToSting(upgradePreCheckPayload);
+                lcmPayload = convertToSting(upgradePreCheckPayload);
                 break;
             case SoPropertyConstants.ACTION_DOWNLOAD_N_E_SW:
                 lcmAction = SDNCLcmActionConstants.DOWNLOAD_N_E_SW;
 
                 DownloadNESwPayload downloadNESwPayload;
                 downloadNESwPayload = SDNCLcmPayloadBuilder.buildDownloadNESwPayload(execution);
-                lcmPayload = SDNCLcmPayloadBuilder.convertToSting(downloadNESwPayload);
+                lcmPayload = convertToSting(downloadNESwPayload);
                 break;
             case SoPropertyConstants.ACTION_ACTIVATE_N_E_SW:
                 lcmAction = SDNCLcmActionConstants.ACTIVATE_N_E_SW;
 
                 ActivateNESwPayload activateNESwPayload;
                 activateNESwPayload = SDNCLcmPayloadBuilder.buildActivateNESwPayload(execution);
-                lcmPayload = SDNCLcmPayloadBuilder.convertToSting(activateNESwPayload);
+                lcmPayload = convertToSting(activateNESwPayload);
                 break;
             case SoPropertyConstants.ACTION_POST_CHECK:
                 lcmAction = SDNCLcmActionConstants.UPGRADE_POST_CHECK;
 
                 UpgradePostCheckPayload upgradePostCheckPayload;
                 upgradePostCheckPayload = SDNCLcmPayloadBuilder.buildUpgradePostCheckPayload(execution);
-                lcmPayload = SDNCLcmPayloadBuilder.convertToSting(upgradePostCheckPayload);
+                lcmPayload = convertToSting(upgradePostCheckPayload);
                 break;
             default:
-                logger.error("Unsupported SO Action: " + requestAction);
-                return null;
+                String msg = "Unsupported SO Action: " + requestAction;
+                logger.error(msg);
+                throw new PayloadGenerationException(msg);
         }
 
         String subRequestId = UUID.randomUUID().toString();
@@ -209,32 +222,33 @@
                 SDNCLcmMessageBuilder.buildLcmInputForPnf(requestId, subRequestId, pnfName, lcmAction, lcmPayload);
 
         ObjectMapper mapper = new ObjectMapper();
-        String lcmInputMsg = mapper.writeValueAsString(lcmInput);
-        logger.debug("SDNC input message for {}: {}", lcmAction, lcmInputMsg);
+        try {
+            String lcmInputMsg = mapper.writeValueAsString(lcmInput);
+            logger.debug("SDNC input message for {}: {}", lcmAction, lcmInputMsg);
+        } catch (JsonProcessingException e) {
+            throw new PayloadGenerationException(e.getMessage());
+        }
 
         return lcmInput;
     }
 
-    private boolean parseLcmOutput(LcmOutput lcmOutput, String lcmAction) {
-        if (lcmOutput == null) {
-            logger.error("Call SDNC LCM API failure");
-            return false;
-        }
-
+    private void parseLcmOutput(LcmOutput lcmOutput, String lcmAction) throws BadResponseException {
         LcmStatus lcmStatus = lcmOutput.getStatus();
+        int lcmStatusCode = lcmStatus.getCode();
         String outputPayload = lcmOutput.getPayload();
-        logger.debug("SDNC LCM output payload of action {}: {}", lcmAction, outputPayload);
 
-        if (lcmStatus.getCode() == SDNCConstants.LCM_OUTPUT_SUCCESS_CODE) {
-            logger.debug("Call SDNC LCM API for {} success, message: {}", lcmAction, lcmStatus.getMessage());
-            return true;
+        if (lcmStatusCode == SDNCConstants.LCM_OUTPUT_SUCCESS_CODE) {
+            logger.debug("Call SDNC LCM API for {} success, code: {}, message: {}, payload: {}", lcmAction,
+                    lcmStatusCode, lcmStatus.getMessage(), outputPayload);
         } else {
-            logger.error("Call SDNC LCM API for {} failure, message: {}", lcmAction, lcmStatus.getMessage());
-            return false;
+            String msg = String.format("Call SDNC LCM API for %s failure, code: %d, message: %s, payload: %s",
+                    lcmAction, lcmStatusCode, lcmStatus.getMessage(), outputPayload);
+            logger.error(msg);
+            throw new BadResponseException(msg);
         }
     }
 
-    private boolean sendLcmRequest(DelegateExecution execution, LcmInput lcmInput) {
+    private void sendLcmRequest(DelegateExecution execution, LcmInput lcmInput) throws BadResponseException {
         String actionMode = String.valueOf(execution.getVariable(SoPropertyConstants.SO_ACTION_MODE));
         String lcmOperation = toLowerHyphen(lcmInput.getAction());
 
@@ -245,6 +259,6 @@
             lcmOutput = sendSyncRequest(lcmOperation, lcmInput);
         }
 
-        return parseLcmOutput(lcmOutput, lcmInput.getAction());
+        parseLcmOutput(lcmOutput, lcmInput.getAction());
     }
 }