@Override
  public Repository createRepository(
      final String scheme,
      final String alias,
      final RepositoryEnvironmentConfigurations repositoryEnvironmentConfigurations) {

    if (configuredRepositories.containsAlias(alias)) {
      throw new RepositoryAlreadyExistsException(alias);
    }

    Repository repo = null;
    try {
      configurationService.startBatch();
      final ConfigGroup repositoryConfig =
          configurationFactory.newConfigGroup(REPOSITORY, alias, "");
      repositoryConfig.addConfigItem(
          configurationFactory.newConfigItem("security:groups", new ArrayList<String>()));

      if (!repositoryEnvironmentConfigurations.containsConfiguration(SCHEME)) {
        repositoryConfig.addConfigItem(configurationFactory.newConfigItem(SCHEME, scheme));
      }

      for (final RepositoryEnvironmentConfiguration configuration :
          repositoryEnvironmentConfigurations.getConfigurationList()) {
        repositoryConfig.addConfigItem(getRepositoryConfigItem(configuration));
      }

      repo = createRepository(repositoryConfig);
      return repo;
    } catch (final Exception e) {
      logger.error("Error during create repository", e);
      throw new RuntimeException(e);
    } finally {
      configurationService.endBatch();
      if (repo != null) {
        event.fire(new NewRepositoryEvent(repo));
      }
    }
  }