private void sendNodes() {
    // mark all nodes as required
    ReleasableIterator<WayContainer> wayIterator = allWays.iterate();
    while (wayIterator.hasNext()) {
      Way way = wayIterator.next().getEntity();

      if (!isRequiredWay(way)) continue;

      for (WayNode nodeReference : way.getWayNodes()) {
        long nodeId = nodeReference.getNodeId();
        requiredNodes.set(nodeId);
      }
    }
    wayIterator.release();

    ReleasableIterator<NodeContainer> nodeIterator = allNodes.iterate();
    while (nodeIterator.hasNext()) {
      NodeContainer nodeContainer = nodeIterator.next();
      if (!isRequiredNode(nodeContainer.getEntity())) {
        continue;
      }
      sink.process(nodeContainer);
    }

    nodeIterator.release();
  }
  /** {@inheritDoc} */
  @Override
  public void process(NodeContainer nodeContainer) {
    boolean modified;

    nodeBuilder.initialize(nodeContainer.getEntity());

    modified = false;
    modified = modified || processEntity(nodeBuilder);
    modified = modified || processNode(nodeBuilder);

    if (modified) {
      sink.process(new NodeContainer(nodeBuilder.buildEntity()));
    } else {
      sink.process(nodeContainer);
    }
  }