public static void createMessageFlow(
      TransactionalEditingDomain editingDomain,
      Message event,
      ThrowMessageEvent source,
      AbstractCatchMessageEvent target,
      DiagramEditPart dep) {
    EditPart targetEP = findEditPart(dep, target);
    EditPart sourceEP = findEditPart(dep, source);

    CreateConnectionViewAndElementRequest request =
        new CreateConnectionViewAndElementRequest(
            ProcessElementTypes.MessageFlow_4002,
            ((IHintedType) ProcessElementTypes.MessageFlow_4002).getSemanticHint(),
            dep.getDiagramPreferencesHint());
    Command createMessageFlowCommand =
        CreateConnectionViewAndElementRequest.getCreateCommand(request, sourceEP, targetEP);
    if (createMessageFlowCommand.canExecute()) {
      dep.getDiagramEditDomain().getDiagramCommandStack().execute(createMessageFlowCommand);
      dep.getDiagramEditDomain().getDiagramCommandStack().flush();
      dep.refresh();

      ConnectionViewAndElementDescriptor desc =
          (ConnectionViewAndElementDescriptor) request.getNewObject();
      MessageFlow message = (MessageFlow) desc.getElementAdapter().getAdapter(MessageFlow.class);
      SetCommand setCommand =
          new SetCommand(
              editingDomain, message, ProcessPackage.Literals.ELEMENT__NAME, event.getName());
      editingDomain.getCommandStack().execute(setCommand);
    }
  }
  public static void removeMessageFlow(
      TransactionalEditingDomain editingDomain,
      Message event,
      ThrowMessageEvent source,
      DiagramEditPart dep) {
    EditPart ep = findEditPart(dep, source);
    CompositeCommand command = new CompositeCommand("Remove MessageFlows");

    for (Object connection : ((AbstractGraphicalEditPart) ep).getSourceConnections()) {
      if (connection instanceof MessageFlowEditPart) {
        MessageFlowEditPart connectionPart = (MessageFlowEditPart) connection;
        MessageFlow flow = (MessageFlow) connectionPart.resolveSemanticElement();
        if (flow.getTarget().getEvent() == null
            || flow.getTarget().getEvent().equals(event.getName())) {
          List<Message> events = new ArrayList<Message>();
          ModelHelper.findAllEvents(source, events);
          for (Message ev : events) {
            if (ev.eContainer().equals(source) && !ev.equals(event)) {
              if (ev.getTargetProcessExpression() != null
                  && event.getTargetProcessExpression() != null
                  && ev.getTargetProcessExpression()
                      .getContent()
                      .equals(event.getTargetProcessExpression().getContent())
                  && ev.getTargetElementExpression() != null
                  && ev.getTargetElementExpression().getContent() != null
                  && event.getTargetElementExpression() != null
                  && ev.getTargetElementExpression()
                      .getContent()
                      .equals(event.getTargetElementExpression().getContent())) {
                SetCommand setCommand =
                    new SetCommand(
                        editingDomain,
                        ev,
                        ProcessPackage.Literals.MESSAGE__TARGET_PROCESS_EXPRESSION,
                        null);
                editingDomain.getCommandStack().execute(setCommand);
                setCommand =
                    new SetCommand(
                        editingDomain,
                        ev,
                        ProcessPackage.Literals.MESSAGE__TARGET_ELEMENT_EXPRESSION,
                        null);
                editingDomain.getCommandStack().execute(setCommand);
              }
            }
          }
          SetCommand c =
              new SetCommand(
                  editingDomain,
                  flow.getTarget(),
                  ProcessPackage.Literals.ABSTRACT_CATCH_MESSAGE_EVENT__EVENT,
                  null);
          editingDomain.getCommandStack().execute(c);
          command.add(new DeleteCommand(editingDomain, connectionPart.getPrimaryView()));
          DestroyElementRequest req =
              new DestroyElementRequest(
                  editingDomain, connectionPart.resolveSemanticElement(), false);
          DestroyElementCommand rmComd = new DestroyElementCommand(req);
          command.add(rmComd);
        }
      }
    }
    dep.getDiagramEditDomain()
        .getDiagramCommandStack()
        .execute(new ICommandProxy(command.reduce()));
    dep.getDiagramEditDomain().getDiagramCommandStack().flush();
    dep.refresh();
  }