diff --git a/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AbstractPluginInvocationService.java b/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AbstractPluginInvocationService.java
index 23d3b6273a6f64eb90b8cae6a903269ef422d9d3..01d3a9d9e614b8648cfe0baadae9caa3ef72d3e1 100644
--- a/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AbstractPluginInvocationService.java
+++ b/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AbstractPluginInvocationService.java
@@ -1,5 +1,6 @@
 package com.webank.wecube.platform.core.service.workflow;
 
+import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
@@ -18,11 +19,14 @@ import com.webank.wecube.platform.core.commons.ApplicationProperties;
 import com.webank.wecube.platform.core.commons.WecubeCoreException;
 import com.webank.wecube.platform.core.entity.plugin.PluginConfigInterfaceParameters;
 import com.webank.wecube.platform.core.entity.plugin.PluginConfigInterfaces;
+import com.webank.wecube.platform.core.entity.workflow.ProcDefInfoEntity;
 import com.webank.wecube.platform.core.entity.workflow.ProcExecBindingEntity;
+import com.webank.wecube.platform.core.entity.workflow.ProcExecContextEntity;
 import com.webank.wecube.platform.core.entity.workflow.ProcInstInfoEntity;
 import com.webank.wecube.platform.core.entity.workflow.TaskNodeDefInfoEntity;
 import com.webank.wecube.platform.core.entity.workflow.TaskNodeInstInfoEntity;
 import com.webank.wecube.platform.core.model.workflow.PluginInvocationCommand;
+import com.webank.wecube.platform.core.model.workflow.WorkflowInstCreationContext;
 import com.webank.wecube.platform.core.model.workflow.WorkflowNotifyEvent;
 import com.webank.wecube.platform.core.repository.workflow.ExtraTaskMapper;
 import com.webank.wecube.platform.core.repository.workflow.ProcDefInfoMapper;
@@ -51,7 +55,7 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
 
     protected static final String RESULT_CODE_OK = "0";
     protected static final String RESULT_CODE_ERR = "1";
-    
+
     protected static final String PLUGIN_RESULT_CODE_FAIL = "1";
     protected static final String PLUGIN_RESULT_CODE_PARTIALLY_FAIL = "1";
     protected static final String PLUGIN_RESULT_CODE_PARTIALLY_KEY = "errorCode";
@@ -63,10 +67,10 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
     protected static final int DEFAULT_VALUE_DATA_TYPE_NUMBER = 0;
 
     protected static final int MAX_PARAM_VAL_SIZE = 3000;
-    
+
     protected static final String PARAM_NAME_TASK_FORM_INPUT = "taskFormInput";
     protected static final String PARAM_NAME_TASK_FORM_OUTPUT = "taskFormOutput";
-    
+
     protected static final String TEMPORARY_ENTITY_ID_PREFIX = "OID-";
 
     protected final Logger log = LoggerFactory.getLogger(this.getClass());
@@ -91,13 +95,13 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
 
     @Autowired
     protected StandardEntityOperationService entityOperationService;
-    
+
     @Autowired
     protected ApplicationProperties applicationProperties;
-    
+
     @Autowired
     protected SimpleEncryptionService simpleEncryptionService;
-    
+
     @Autowired
     protected PluginInvocationRestClient pluginInvocationRestClient;
 
@@ -130,27 +134,25 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
 
     @Autowired
     protected ExtraTaskMapper extraTaskMapper;
-    
+
     @Autowired
     protected EntityQueryExpressionParser entityQueryExpressionParser;
-    
+
     @Autowired
     protected PluginTaskFormRestClient pluginTaskFormRestClient;
-    
+
     @Autowired
     protected ProcExecContextMapper procExecContextMapper;
-    
+
     @Autowired
     protected EntityDataRouteFactory entityDataRouteFactory;
-    
-    
+
     @Autowired
     @Qualifier(value = "jwtSsoRestTemplate")
     protected RestTemplate jwtSsoRestTemplate;
-    
+
     protected ObjectMapper objectMapper = new ObjectMapper();
-    
-    
+
     /**
      * 
      * @param cmd
@@ -219,7 +221,7 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
         workflowProcInstEndEventNotifier.notify(WorkflowNotifyEvent.PROCESS_INSTANCE_END, cmd, procInstEntity);
 
     }
-    
+
     protected void refreshStatusOfPreviousNodes(List<TaskNodeInstInfoEntity> nodeInstEntities,
             TaskNodeDefInfoEntity currNodeDefInfo) {
         List<String> previousNodeIds = unmarshalNodeIds(currNodeDefInfo.getPrevNodeIds());
@@ -345,7 +347,7 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
 
             if (!(obj instanceof Map)) {
                 log.error("unexpected data type:returned object is not a instance of map, obj={}", obj);
-                throw new WecubeCoreException("3163","Unexpected data type");
+                throw new WecubeCoreException("3163", "Unexpected data type");
             }
 
             @SuppressWarnings("unchecked")
@@ -368,32 +370,32 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
 
         return null;
     }
-    
-    protected String tryEncodeParamDataValue(String rawDataValue){
-        if(StringUtils.isBlank(rawDataValue)){
+
+    protected String tryEncodeParamDataValue(String rawDataValue) {
+        if (StringUtils.isBlank(rawDataValue)) {
             return rawDataValue;
         }
-        
+
         String cipherDataValue = simpleEncryptionService.encodeToAesBase64(rawDataValue);
         return cipherDataValue;
     }
-    
-    protected String tryDecodeParamDataValue(String cipherDataValue){
-        if(StringUtils.isBlank(cipherDataValue)){
+
+    protected String tryDecodeParamDataValue(String cipherDataValue) {
+        if (StringUtils.isBlank(cipherDataValue)) {
             return cipherDataValue;
         }
-        
+
         String rawDataValue = null;
-        try{
+        try {
             rawDataValue = simpleEncryptionService.decodeFromAesBase64(cipherDataValue);
-        }catch(Exception e){
+        } catch (Exception e) {
             log.info("errors while decode cipher data value:{},error:{}", cipherDataValue, e.getMessage());
             rawDataValue = cipherDataValue;
         }
-        
+
         return rawDataValue;
     }
-    
+
     protected boolean isSystemAutomationTaskNode(TaskNodeDefInfoEntity taskNodeDefEntity) {
         return TASK_CATEGORY_SSTN.equalsIgnoreCase(taskNodeDefEntity.getTaskCategory());
     }
@@ -405,7 +407,7 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
     protected boolean isDataOperationTaskNode(TaskNodeDefInfoEntity taskNodeDefEntity) {
         return TASK_CATEGORY_SDTN.equalsIgnoreCase(taskNodeDefEntity.getTaskCategory());
     }
-    
+
     protected boolean isDynamicBindTaskNode(TaskNodeDefInfoEntity taskNodeDef) {
         return TaskNodeDefInfoEntity.DYNAMIC_BIND_YES.equalsIgnoreCase(taskNodeDef.getDynamicBind());
     }
@@ -413,7 +415,7 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
     protected boolean isBoundTaskNodeInst(TaskNodeInstInfoEntity taskNodeInst) {
         return TaskNodeInstInfoEntity.BIND_STATUS_BOUND.equalsIgnoreCase(taskNodeInst.getBindStatus());
     }
-    
+
     protected void storeProcExecBindingEntities(List<ProcExecBindingEntity> nodeObjectBindings) {
         if (nodeObjectBindings == null || nodeObjectBindings.isEmpty()) {
             return;
@@ -424,6 +426,44 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
         }
     }
 
+    protected WorkflowInstCreationContext tryFetchWorkflowInstCreationContext(
+            TaskNodeInstInfoEntity taskNodeInstEntity) {
+        List<ProcExecContextEntity> procExecContextEntities = this.procExecContextMapper.selectAllContextByCtxType(
+                taskNodeInstEntity.getProcDefId(), taskNodeInstEntity.getProcInstId(),
+                ProcExecContextEntity.CTX_TYPE_PROCESS);
+
+        if (procExecContextEntities == null || procExecContextEntities.isEmpty()) {
+            log.info("Cannot find any process creation context infomation for {} {}", taskNodeInstEntity.getProcDefId(),
+                    taskNodeInstEntity.getProcInstId());
+
+            return null;
+        }
+
+        ProcExecContextEntity procExecContextEntity = procExecContextEntities.get(0);
+
+        String ctxJsonData = procExecContextEntity.getCtxData();
+
+        if (StringUtils.isBlank(ctxJsonData)) {
+            log.info("Context data is blank for {} {}", taskNodeInstEntity.getProcDefId(),
+                    taskNodeInstEntity.getProcInstId());
+            return null;
+        }
+
+        WorkflowInstCreationContext ctx = convertJsonToWorkflowInstCreationContext(ctxJsonData.trim());
+
+        return ctx;
+    }
+
+    protected WorkflowInstCreationContext convertJsonToWorkflowInstCreationContext(String ctxJsonData) {
+        try {
+            WorkflowInstCreationContext ctx = objectMapper.readValue(ctxJsonData, WorkflowInstCreationContext.class);
+            return ctx;
+        } catch (IOException e) {
+            log.error("Failed to read json value:" + ctxJsonData, e);
+            throw new WecubeCoreException("Failed to read JSON to object.");
+        }
+    }
+
     protected String marshalPluginInvocationCommand(PluginInvocationCommand cmd) {
         String json;
         try {
@@ -433,7 +473,7 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
             throw new WecubeCoreException("Failed to marshal plugin invocation command.", e);
         }
     }
-    
+
     protected String calculateDataModelExpression(TaskNodeDefInfoEntity f) {
         if (StringUtils.isBlank(f.getRoutineExp())) {
             return null;
@@ -457,4 +497,14 @@ public abstract class AbstractPluginInvocationService extends AbstractWorkflowSe
         return expr + inter.getFilterRule();
     }
 
+    protected String convertWorkflowInstCreationContextToJson(WorkflowInstCreationContext ctx) {
+        try {
+            String json = this.objectMapper.writeValueAsString(ctx);
+            return json;
+        } catch (JsonProcessingException e) {
+            log.error("Failed to write object to string.", e);
+            throw new WecubeCoreException("JSON convertion exception.");
+        }
+    }
+
 }
diff --git a/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AsyncPluginInvocationService.java b/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AsyncPluginInvocationService.java
index d6d16279001ee42da8db864287b247ad5bd288ee..0cd1749a0218e025e0c4b947cde8f1032e6f5bac 100644
--- a/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AsyncPluginInvocationService.java
+++ b/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/AsyncPluginInvocationService.java
@@ -1,5 +1,6 @@
 package com.webank.wecube.platform.core.service.workflow;
 
+import java.io.IOException;
 import java.util.Date;
 import java.util.List;
 import java.util.Map;
@@ -11,14 +12,21 @@ import com.webank.wecube.platform.core.commons.WecubeCoreException;
 import com.webank.wecube.platform.core.dto.workflow.PluginAsyncInvocationResultDto;
 import com.webank.wecube.platform.core.entity.plugin.PluginConfigInterfaceParameters;
 import com.webank.wecube.platform.core.entity.plugin.PluginConfigInterfaces;
+import com.webank.wecube.platform.core.entity.workflow.ProcExecContextEntity;
 import com.webank.wecube.platform.core.entity.workflow.TaskNodeDefInfoEntity;
 import com.webank.wecube.platform.core.entity.workflow.TaskNodeExecParamEntity;
 import com.webank.wecube.platform.core.entity.workflow.TaskNodeExecRequestEntity;
 import com.webank.wecube.platform.core.entity.workflow.TaskNodeInstInfoEntity;
 import com.webank.wecube.platform.core.model.workflow.PluginInvocationCommand;
 import com.webank.wecube.platform.core.model.workflow.PluginInvocationResult;
+import com.webank.wecube.platform.core.model.workflow.WorkflowInstCreationContext;
 import com.webank.wecube.platform.core.service.dme.EntityOperationRootCondition;
 import com.webank.wecube.platform.core.service.workflow.PluginInvocationProcessor.PluginInterfaceInvocationContext;
+import com.webank.wecube.platform.core.support.plugin.dto.DynamicEntityAttrValueDto;
+import com.webank.wecube.platform.core.support.plugin.dto.DynamicEntityValueDto;
+import com.webank.wecube.platform.core.support.plugin.dto.TaskFormDataEntityDto;
+import com.webank.wecube.platform.core.support.plugin.dto.TaskFormItemValueDto;
+import com.webank.wecube.platform.core.support.plugin.dto.TaskFormValueDto;
 import com.webank.wecube.platform.workflow.WorkflowConstants;
 
 /**
@@ -106,8 +114,6 @@ public class AsyncPluginInvocationService extends AbstractPluginInvocationServic
                     ctx.getRequestId());
             throw new WecubeCoreException("3157", "Task node definition does not exist.");
         }
-        
-        //TODO #2109 handle user task output
 
         PluginConfigInterfaces pluginConfigInterface = pluginConfigMgmtService
                 .getPluginConfigInterfaceByServiceName(nodeDefEntity.getServiceId());
@@ -231,7 +237,16 @@ public class AsyncPluginInvocationService extends AbstractPluginInvocationServic
     }
 
     private void handleResultData(PluginInterfaceInvocationContext ctx, List<Object> resultData) {
+        TaskNodeDefInfoEntity taskNodeDefEntity = ctx.getTaskNodeDefEntity();
+        if (isUserTaskNode(taskNodeDefEntity)) {
+            handleUserTaskResultData(ctx, resultData);
+        } else {
+            handleNormalResultData(ctx, resultData);
+        }
+
+    }
 
+    private void handleNormalResultData(PluginInterfaceInvocationContext ctx, List<Object> resultData) {
         List<Map<String, Object>> outputParameterMaps = validateAndCastResultData(resultData);
         storeOutputParameterMaps(ctx, outputParameterMaps);
 
@@ -250,6 +265,131 @@ public class AsyncPluginInvocationService extends AbstractPluginInvocationServic
         return;
     }
 
+    private void handleUserTaskResultData(PluginInterfaceInvocationContext ctx, List<Object> resultData) {
+        List<Map<String, Object>> outputParameterMaps = validateAndCastResultData(resultData);
+        storeOutputParameterMaps(ctx, outputParameterMaps);
+
+        for (Map<String, Object> outputParameterMap : outputParameterMaps) {
+            handleSingleOutputMapForUserTask(ctx, outputParameterMap);
+        }
+
+    }
+
+    private void handleSingleOutputMapForUserTask(PluginInterfaceInvocationContext ctx,
+            Map<String, Object> outputParameterMap) {
+        PluginConfigInterfaces intf = ctx.getPluginConfigInterface();
+        List<PluginConfigInterfaceParameters> outputParameters = intf.getOutputParameters();
+        if (outputParameters == null || outputParameters.isEmpty()) {
+            return;
+        }
+
+        boolean hasTaskFormOutputParam = false;
+        for (PluginConfigInterfaceParameters outputParamDef : outputParameters) {
+            if (PARAM_NAME_TASK_FORM_OUTPUT.equals(outputParamDef.getName())) {
+                hasTaskFormOutputParam = true;
+                break;
+            }
+        }
+
+        if (!hasTaskFormOutputParam) {
+            return;
+        }
+
+        Object taskFormOutputValue = outputParameterMap.get(PARAM_NAME_TASK_FORM_OUTPUT);
+        if (taskFormOutputValue == null) {
+            return;
+        }
+
+        String taskFormOutputValueAsJson = (String) taskFormOutputValue;
+        if (StringUtils.isBlank(taskFormOutputValueAsJson)) {
+            return;
+        }
+
+        TaskNodeInstInfoEntity nodeInstInfo = ctx.getTaskNodeInstEntity();
+
+        List<ProcExecContextEntity> procExecContextEntities = this.procExecContextMapper.selectAllContextByCtxType(
+                nodeInstInfo.getProcDefId(), nodeInstInfo.getProcInstId(), ProcExecContextEntity.CTX_TYPE_PROCESS);
+
+        if (procExecContextEntities == null || procExecContextEntities.isEmpty()) {
+            log.info("Cannot find any process creation context infomation for {} {}", nodeInstInfo.getProcDefId(),
+                    nodeInstInfo.getProcInstId());
+
+            return;
+        }
+
+        ProcExecContextEntity procExecContextEntity = procExecContextEntities.get(0);
+
+        String ctxJsonData = procExecContextEntity.getCtxData();
+
+        if (StringUtils.isBlank(ctxJsonData)) {
+            log.info("Context data is blank for {} {}", nodeInstInfo.getProcDefId(), nodeInstInfo.getProcInstId());
+            return;
+        }
+
+        WorkflowInstCreationContext creationCtx = convertJsonToWorkflowInstCreationContext(ctxJsonData.trim());
+
+        if (creationCtx == null) {
+            return;
+        }
+        TaskFormValueDto taskFormValueDto = convertJsonToTaskFormValueDto(taskFormOutputValueAsJson);
+
+        List<TaskFormDataEntityDto> formDataEntities = taskFormValueDto.getFormDataEntities();
+        if (formDataEntities == null || formDataEntities.isEmpty()) {
+            return;
+        }
+
+        for (TaskFormDataEntityDto formDataEntity : formDataEntities) {
+            DynamicEntityValueDto existingEntityValue = creationCtx.findByOid(formDataEntity.getOid());
+            if (existingEntityValue == null) {
+                continue;
+            }
+
+            refreshDynamicEntityValueDto(existingEntityValue, formDataEntity);
+        }
+
+        String creationCtxUpdate = convertWorkflowInstCreationContextToJson(creationCtx);
+        procExecContextEntity.setUpdatedBy(WorkflowConstants.DEFAULT_USER);
+        procExecContextEntity.setUpdatedTime(new Date());
+        procExecContextEntity.setCtxData(creationCtxUpdate);
+
+        this.procExecContextMapper.updateByPrimaryKeySelective(procExecContextEntity);
+    }
+
+    private void refreshDynamicEntityValueDto(DynamicEntityValueDto existingEntityValue,
+            TaskFormDataEntityDto formDataEntity) {
+        List<TaskFormItemValueDto> formItemValues = formDataEntity.getFormItemValues();
+        if (formItemValues == null || formItemValues.isEmpty()) {
+            return;
+        }
+
+        for (TaskFormItemValueDto formItemValue : formItemValues) {
+            String attrName = formItemValue.getAttrName();
+            DynamicEntityAttrValueDto existingAttrValue = existingEntityValue.findAttrValue(attrName);
+            if (existingAttrValue == null) {
+                existingAttrValue = new DynamicEntityAttrValueDto();
+                existingAttrValue.setAttrDefId(null);
+                existingAttrValue.setAttrName(attrName);
+                existingAttrValue.setDataType(null);
+                existingAttrValue.setDataValue(formItemValue.getAttrValue());
+
+                existingEntityValue.addAttrValue(existingAttrValue);
+            } else {
+                existingAttrValue.setDataValue(formItemValue.getAttrValue());
+            }
+        }
+    }
+
+    private TaskFormValueDto convertJsonToTaskFormValueDto(String jsonData) {
+        try {
+            TaskFormValueDto dto = objectMapper.readValue(jsonData, TaskFormValueDto.class);
+            return dto;
+        } catch (IOException e) {
+            log.error("Failed to read value from json.", e);
+            throw new WecubeCoreException("Failed to read value from json.");
+        }
+
+    }
+
     private void handleSingleOutputMap(PluginInterfaceInvocationContext ctx, Map<String, Object> outputParameterMap) {
 
         PluginConfigInterfaces pci = ctx.getPluginConfigInterface();
@@ -264,7 +404,6 @@ public class AsyncPluginInvocationService extends AbstractPluginInvocationServic
             return;
         }
 
-        //TODO #2169 to support entity creation
         String nodeEntityId = (String) outputParameterMap.get(CALLBACK_PARAMETER_KEY);
 
         if (StringUtils.isBlank(nodeEntityId)) {
@@ -277,12 +416,11 @@ public class AsyncPluginInvocationService extends AbstractPluginInvocationServic
                 && PLUGIN_RESULT_CODE_PARTIALLY_FAIL.equalsIgnoreCase(errorCodeOfSingleRecord)) {
             log.info("such request is partially failed for request:{} and {}:{}", ctx.getRequestId(),
                     CALLBACK_PARAMETER_KEY, nodeEntityId);
-            
-            //TODO to store status
+
+            // TODO to store status
             return;
         }
 
-        //TODO #2169 to support entity creation
         for (PluginConfigInterfaceParameters pciParam : outputParameters) {
             String paramName = pciParam.getName();
             String paramExpr = pciParam.getMappingEntityExpression();
diff --git a/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/PluginInvocationService.java b/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/PluginInvocationService.java
index a34065cda0621cbc77d92d48a319279de92996c1..9869449ecb74dafed487a1d9241900393ec282c1 100644
--- a/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/PluginInvocationService.java
+++ b/platform-core/src/main/java/com/webank/wecube/platform/core/service/workflow/PluginInvocationService.java
@@ -7,7 +7,6 @@ import static com.webank.wecube.platform.core.utils.Constants.MAPPING_TYPE_CONTE
 import static com.webank.wecube.platform.core.utils.Constants.MAPPING_TYPE_ENTITY;
 import static com.webank.wecube.platform.core.utils.Constants.MAPPING_TYPE_SYSTEM_VARIABLE;
 
-import java.io.IOException;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.HashMap;
@@ -309,8 +308,7 @@ public class PluginInvocationService extends AbstractPluginInvocationService {
             return;
         }
 
-        WorkflowInstCreationContext ctx = tryFetchWorkflowInstCreationContext(procInstEntity, taskNodeInstEntity,
-                procDefInfoEntity, taskNodeDefEntity, cmd);
+        WorkflowInstCreationContext ctx = tryFetchWorkflowInstCreationContext(taskNodeInstEntity);
         if (ctx == null) {
             return;
         }
@@ -624,42 +622,8 @@ public class PluginInvocationService extends AbstractPluginInvocationService {
         return taskFormValueDto;
     }
 
-    private WorkflowInstCreationContext tryFetchWorkflowInstCreationContext(ProcInstInfoEntity procInstEntity,
-            TaskNodeInstInfoEntity taskNodeInstEntity, ProcDefInfoEntity procDefInfoEntity,
-            TaskNodeDefInfoEntity taskNodeDefEntity, PluginInvocationCommand cmd) {
-        List<ProcExecContextEntity> procExecContextEntities = this.procExecContextMapper.selectAllContextByCtxType(
-                procDefInfoEntity.getId(), procInstEntity.getId(), ProcExecContextEntity.CTX_TYPE_PROCESS);
-
-        if (procExecContextEntities == null || procExecContextEntities.isEmpty()) {
-            log.info("Cannot find any process creation context infomation for {} {}", procDefInfoEntity.getId(),
-                    procInstEntity.getId());
-
-            return null;
-        }
-
-        ProcExecContextEntity procExecContextEntity = procExecContextEntities.get(0);
-
-        String ctxJsonData = procExecContextEntity.getCtxData();
+    
 
-        if (StringUtils.isBlank(ctxJsonData)) {
-            log.info("Context data is blank for {} {}", procDefInfoEntity.getId(), procInstEntity.getId());
-            return null;
-        }
-
-        WorkflowInstCreationContext ctx = convertJsonToWorkflowInstCreationContext(ctxJsonData.trim());
-
-        return ctx;
-    }
-
-    private String convertWorkflowInstCreationContextToJson(WorkflowInstCreationContext ctx) {
-        try {
-            String json = this.objectMapper.writeValueAsString(ctx);
-            return json;
-        } catch (JsonProcessingException e) {
-            log.error("Failed to write object to string.", e);
-            throw new WecubeCoreException("JSON convertion exception.");
-        }
-    }
 
     private List<TaskFormDataEntityDto> calculateFormDataEntities(ProcInstInfoEntity procInstEntity,
             TaskNodeInstInfoEntity taskNodeInstEntity, ProcDefInfoEntity procDefInfoEntity,
@@ -673,8 +637,7 @@ public class PluginInvocationService extends AbstractPluginInvocationService {
             return formDataEntities;
         }
 
-        WorkflowInstCreationContext ctx = tryFetchWorkflowInstCreationContext(procInstEntity, taskNodeInstEntity,
-                procDefInfoEntity, taskNodeDefEntity, cmd);
+        WorkflowInstCreationContext ctx = tryFetchWorkflowInstCreationContext(taskNodeInstEntity);
         if (ctx == null) {
             return formDataEntities;
         }
@@ -776,15 +739,7 @@ public class PluginInvocationService extends AbstractPluginInvocationService {
         return nodeBindObjectIds;
     }
 
-    private WorkflowInstCreationContext convertJsonToWorkflowInstCreationContext(String ctxJsonData) {
-        try {
-            WorkflowInstCreationContext ctx = objectMapper.readValue(ctxJsonData, WorkflowInstCreationContext.class);
-            return ctx;
-        } catch (IOException e) {
-            log.error("Failed to read json value:" + ctxJsonData, e);
-            throw new WecubeCoreException("Failed to read JSON to object.");
-        }
-    }
+    
 
     /**
      * SSTN Handling system automation task node
diff --git a/platform-core/src/main/java/com/webank/wecube/platform/core/support/plugin/dto/DynamicEntityValueDto.java b/platform-core/src/main/java/com/webank/wecube/platform/core/support/plugin/dto/DynamicEntityValueDto.java
index d4d1aee496b139591d5226a2f99140851b676c81..57b7b827714dfef3c93c7a79661260fded7b5434 100644
--- a/platform-core/src/main/java/com/webank/wecube/platform/core/support/plugin/dto/DynamicEntityValueDto.java
+++ b/platform-core/src/main/java/com/webank/wecube/platform/core/support/plugin/dto/DynamicEntityValueDto.java
@@ -88,6 +88,10 @@ public class DynamicEntityValueDto {
         this.attrValues = attrValues;
     }
     
+    public void addAttrValue(DynamicEntityAttrValueDto attrValue) {
+        this.attrValues.add(attrValue);
+    }
+    
     public DynamicEntityAttrValueDto findAttrValue(String attrName){
         for(DynamicEntityAttrValueDto attrValue : attrValues){
             if(attrName.equals(attrValue.getAttrName())){
diff --git a/platform-core/src/main/java/com/webank/wecube/platform/core/support/plugin/dto/TaskFormDataOutpoutDto.java b/platform-core/src/main/java/com/webank/wecube/platform/core/support/plugin/dto/TaskFormDataOutpoutDto.java
deleted file mode 100644
index 0f333bcf882eae02a9a4927cf5bbd52102b9a5c5..0000000000000000000000000000000000000000
--- a/platform-core/src/main/java/com/webank/wecube/platform/core/support/plugin/dto/TaskFormDataOutpoutDto.java
+++ /dev/null
@@ -1,5 +0,0 @@
-package com.webank.wecube.platform.core.support.plugin.dto;
-
-public class TaskFormDataOutpoutDto {
-
-}