@Override
  public void saveServices(SubsystemId subsystemId, Collection<Service> services) {
    assert subsystemId != null;
    Subsystem oldSubsystem =
        subsystemRepository.findActiveByNaturalKey(
            subsystemId.getXRoadInstance(),
            subsystemId.getMemberClass(),
            subsystemId.getMemberCode(),
            subsystemId.getSubsystemCode());
    if (oldSubsystem == null) {
      throw new IllegalStateException("subsystem " + subsystemId + " not found!");
    }

    LocalDateTime now = LocalDateTime.now();

    Map<ServiceId, Service> unprocessedOldServices = new HashMap<>();
    oldSubsystem
        .getAllServices()
        .stream()
        .forEach(s -> unprocessedOldServices.put(s.createKey(), s));

    for (Service service : services) {
      Service oldService = unprocessedOldServices.get(service.createKey());
      if (oldService == null) {
        // brand new item, add it
        service.getStatusInfo().setTimestampsForNew(now);
        service.setSubsystem(oldSubsystem);
        oldSubsystem.getAllServices().add(service);
      } else {
        oldService.getStatusInfo().setTimestampsForFetched(now);
      }
      unprocessedOldServices.remove(service.createKey());
    }

    // now unprocessedOldServices should all be removed (either already removed, or will be now)
    for (Service oldToRemove : unprocessedOldServices.values()) {
      StatusInfo status = oldToRemove.getStatusInfo();
      if (!status.isRemoved()) {
        status.setTimestampsForRemoved(now);
      }
    }
  }