private void executeWorkflowInBackground() {

    DistributedComponentKnowledge compKnowledge =
        serviceRegistryAccess
            .getService(DistributedComponentKnowledgeService.class)
            .getCurrentComponentKnowledge();

    try {
      WorkflowExecutionUtils.replaceNullNodeIdentifiersWithActualNodeIdentifier(
          wfDescription, localNodeId, compKnowledge);
    } catch (WorkflowExecutionException e) {
      handleWorkflowExecutionError(e);
      return;
    }

    String name = wfDescription.getName();
    if (name == null) {
      name = Messages.bind(Messages.defaultWorkflowName, wfFile.getName().toString());
    }

    WorkflowExecutionContextBuilder wfExeCtxBuilder =
        new WorkflowExecutionContextBuilder(wfDescription);
    wfExeCtxBuilder.setInstanceName(name);
    wfExeCtxBuilder.setNodeIdentifierStartedExecution(localNodeId);
    if (wfDescription.getAdditionalInformation() != null
        && !wfDescription.getAdditionalInformation().isEmpty()) {
      wfExeCtxBuilder.setAdditionalInformationProvidedAtStart(
          wfDescription.getAdditionalInformation());
    }
    WorkflowExecutionContext wfExecutionContext = wfExeCtxBuilder.build();

    final WorkflowExecutionInformation wfExeInfo;
    try {
      wfExeInfo = workflowExecutionService.executeWorkflowAsync(wfExecutionContext);
    } catch (WorkflowExecutionException | RemoteOperationException e) {
      handleWorkflowExecutionError(e);
      return;
    }

    // before starting the workflow, ensure that the console model is initialized
    // so that no console output gets lost; this is lazily initialized here
    // so the application startup is not slowed down
    try {
      serviceRegistryAccess
          .getService(ConsoleRowModelService.class)
          .ensureConsoleCaptureIsInitialized();
    } catch (InterruptedException e) {
      LOG.error(
          "Failed initialize workflow console capturing for workflow: " + wfDescription.getName(),
          e);
    }

    if (inputTabEnabled) {
      InputModel.ensureInputCaptureIsInitialized();
    }

    WorkflowExecutionUtils.removeDisabledWorkflowNodesWithoutNotify(
        wfExeInfo.getWorkflowDescription());
    Display.getDefault()
        .asyncExec(
            new Runnable() {

              @Override
              public void run() {
                new OpenReadOnlyWorkflowRunEditorAction(wfExeInfo).run();
              }
            });
  }