@Override
  public BaseResult updateUsers(String instanceId, List<User> users, User requestingUser) {
    logger.info("Update users for service instance {}.", instanceId);

    ServiceInstance instance = null;

    try {
      instance = instanceDAO.getInstanceById(instanceId);

      checkInstanceAvailability(instance);

      final APPlatformController controller =
          APPlatformControllerFactory.getInstance(instance.getControllerId());
      final ProvisioningSettings settings =
          configService.getProvisioningSettings(instance, UserMapper.toServiceUser(requestingUser));

      // Forward request
      final InstanceStatus status =
          controller.updateUsers(instance.getInstanceId(), settings, mapToServiceUsers(users));
      if (status != null) {
        // forward call to provisioning service on application instance
        if (status.isInstanceProvisioningRequested()) {
          final ProvisioningService provisioning = provisioningFactory.getInstance(instance);
          final BaseResult result = provisioning.updateUsers(instanceId, users, requestingUser);
          if (provResult.isError(result)) {
            return result;
          }
        }

        // If everything worked well we will save all changed parameters
        instance.setInstanceParameters(status.getChangedParameters());
      }

      instance.setProvisioningStatus(ProvisioningStatus.WAITING_FOR_USER_MODIFICATION);
      em.persist(instance);

      timerService.initTimers();

      return provResult.newOkBaseResult();

    } catch (Exception e) {
      logger.warn(e.getMessage(), e);
      return provResult.getErrorResult(
          BaseResult.class, e, getLocale(requestingUser), instance, instanceId);
    }
  }