private void addProcessGroup(
      final Element parentElement, final ProcessGroup group, final String elementName) {
    final Document doc = parentElement.getOwnerDocument();
    final Element element = doc.createElement(elementName);
    parentElement.appendChild(element);
    addTextElement(element, "id", group.getIdentifier());
    addTextElement(element, "name", group.getName());
    addPosition(element, group.getPosition());
    addTextElement(element, "comment", group.getComments());

    for (final ProcessorNode processor : group.getProcessors()) {
      addProcessor(element, processor);
    }

    if (group.isRootGroup()) {
      for (final Port port : group.getInputPorts()) {
        addRootGroupPort(element, (RootGroupPort) port, "inputPort");
      }

      for (final Port port : group.getOutputPorts()) {
        addRootGroupPort(element, (RootGroupPort) port, "outputPort");
      }
    } else {
      for (final Port port : group.getInputPorts()) {
        addPort(element, port, "inputPort");
      }

      for (final Port port : group.getOutputPorts()) {
        addPort(element, port, "outputPort");
      }
    }

    for (final Label label : group.getLabels()) {
      addLabel(element, label);
    }

    for (final Funnel funnel : group.getFunnels()) {
      addFunnel(element, funnel);
    }

    for (final ProcessGroup childGroup : group.getProcessGroups()) {
      addProcessGroup(element, childGroup, "processGroup");
    }

    for (final RemoteProcessGroup remoteRef : group.getRemoteProcessGroups()) {
      addRemoteProcessGroup(element, remoteRef);
    }

    for (final Connection connection : group.getConnections()) {
      addConnection(element, connection);
    }
  }