/**
   * Merges to user lists. New users will be added and old users will be updated.
   *
   * @param aOriginal Original {@link List} of {@link User}.
   * @param aChanges New {@link List} of {@link User} to merge into original list.
   * @return Merges {@link List} of {@link User}.
   */
  public static List<User> merge(List<User> aOriginal, List<User> aChanges) {
    List<User> vUsers = new ArrayList<User>();

    // delete original users not in changes, not manually added and without letters
    for (Iterator<User> vIterator = aOriginal.iterator(); vIterator.hasNext(); ) {
      User vUser = vIterator.next();
      List<User> vUsersSelected =
          UserListUtils.selectUnique(aChanges, vUser.getName(), vUser.getBirthdate());

      if (vUsersSelected.size() == 0 && !vUser.isManualAdded()) {
        User vUserDeleted = new User(vUser);
        vUsers.add(vUserDeleted.setName(null));
        vIterator.remove();
      }
    }

    // update and add user data
    List<User> vUnassignedUsers = new ArrayList<User>(); // list of users with more unique
    // users in original list
    for (Iterator<User> vIterator = aChanges.iterator(); vIterator.hasNext(); ) {
      User vUser = vIterator.next();
      List<User> vUsersSelected =
          UserListUtils.selectUnique(aOriginal, vUser.getName(), vUser.getBirthdate());

      if (vUsersSelected.size() == 1) {
        // one unique user found > update user
        User vUserSelected = new User(vUsersSelected.get(0)).update(vUser);
        vUsers.add(vUserSelected);
        vIterator.remove();

      } else if (vUsersSelected.size() == 0) {
        // no user found > check if to find without birthdate
        List<User> vUsersByName = UserListUtils.selectUnique(aOriginal, vUser.getName(), "");
        if (vUsersByName.size() == 1) {

          // found user > update
          User vUserSelected = new User(vUsersByName.get(0)).update(vUser);
          vUsers.add(vUserSelected);

        } else {

          // not found by name > add user
          User vNewUser = new User(vUser);
          vUsers.add(vNewUser);
          vIterator.remove();
        }

      } else if (vUnassignedUsers.size() > 1) {
        // more than one unique user found > add to list for further processing
        vUnassignedUsers.add(vUser);
        vIterator.remove();
      }
    }

    // process unassigned users
    // TODO
    logger.warn("Unassigned users " + vUnassignedUsers.size());

    return vUsers;
  }