@Override
  public void run() throws TaxomaticException {
    List<Taxon> taxaToSave = new ArrayList<Taxon>();
    for (Taxon mergedTaxon : taxaToMerge) {
      mergedTaxon.setStatus(TaxonStatus.STATUS_SYNONYM);
      {
        Synonym synonym = Taxon.synonymizeTaxon(mergedTaxon);
        synonym.setStatus(Synonym.MERGE);
        synonym.setTaxon(mergeTarget);

        mergeTarget.getSynonyms().add(synonym);
      }
      {
        Synonym synonym = Taxon.synonymizeTaxon(mergeTarget);
        synonym.setStatus(Synonym.MERGE);
        synonym.setTaxon(mergedTaxon);

        mergedTaxon.getSynonyms().add(synonym);
      }
      for (Taxon child : mergedTaxon.getChildren()) {
        child.setParent(mergeTarget);
        mergeTarget.getChildren().add(child);
        taxaToSave.add(child);
      }
      taxaToSave.add(mergedTaxon);
    }
    taxaToSave.add(mergeTarget);

    taxomaticIO.updateAndSave(taxaToSave, operation.getUser(), true);

    recordOperationHistory(taxaToSave, operation);
  }