diff --git a/src/main/java/io/fd/maintainer/plugin/events/OnCommittersToBeAddedListener.java b/src/main/java/io/fd/maintainer/plugin/events/OnCommittersToBeAddedListener.java
index a0df89f..a310b50 100644
--- a/src/main/java/io/fd/maintainer/plugin/events/OnCommittersToBeAddedListener.java
+++ b/src/main/java/io/fd/maintainer/plugin/events/OnCommittersToBeAddedListener.java
@@ -18,6 +18,7 @@
 
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSet;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.change.ChangesCollection;
 import com.google.gerrit.server.change.PostReview;
@@ -95,8 +96,9 @@
         final PatchSetCreatedEvent patchSetCreatedEvent = PatchSetCreatedEvent.class.cast(event);
 
         final ChangeAttribute changeAttributes = patchSetCreatedEvent.change.get();
+        final Project.NameKey projectKey = new Project.NameKey(changeAttributes.project);
         final PluginBranchSpecificSettings settings =
-                settingsProvider.getBranchSpecificSettings(changeAttributes.branch);
+                settingsProvider.getBranchSpecificSettings(changeAttributes.branch, projectKey);
 
         if (!settings.isAutoAddReviewers()) {
             LOG.warn("Auto add reviewers option turned off");
@@ -104,7 +106,7 @@
         }
 
         try (final ReviewDb reviewDb = schemaFactory.open()) {
-            final Change.Id changeId = new Change.Id(changeAttributes.number);
+            final Change.Id changeId = new Change.Id(Integer.valueOf(changeAttributes.number));
             final Change change = reviewDb.changes().get(changeId);
 
             final PatchSet mostCurrentPatchSet = reviewDb.patchSets().get(change.currentPatchSetId());
@@ -112,7 +114,8 @@
             LOG.info("Processing change {} | patchset {}", change.getId(), mostCurrentPatchSet.getId());
             final MaintainersIndex index =
                     new MaintainersIndex(
-                            maintainersProvider.getMaintainersInfo(changeAttributes.branch, changeAttributes.number));
+                            maintainersProvider.getMaintainersInfo(changeAttributes.branch,
+                                    Integer.valueOf(changeAttributes.number), projectKey));
 
             reviewerPusher.addRelevantReviewers(index, change, mostCurrentPatchSet, settings.getPluginUserName());
             LOG.info("Reviewers for change {} successfully added", change.getId());
diff --git a/src/main/java/io/fd/maintainer/plugin/events/OnPatchsetVerifiedListener.java b/src/main/java/io/fd/maintainer/plugin/events/OnPatchsetVerifiedListener.java
index 194d626..9063859 100644
--- a/src/main/java/io/fd/maintainer/plugin/events/OnPatchsetVerifiedListener.java
+++ b/src/main/java/io/fd/maintainer/plugin/events/OnPatchsetVerifiedListener.java
@@ -24,6 +24,7 @@
 import com.google.gerrit.reviewdb.client.Change;
 import com.google.gerrit.reviewdb.client.PatchSet;
 import com.google.gerrit.reviewdb.client.PatchSetApproval;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.change.ChangesCollection;
 import com.google.gerrit.server.data.AccountAttribute;
@@ -83,8 +84,9 @@
     protected void consumeDescribedEvent(final Event event) {
         CommentAddedEvent commentAddedEvent = CommentAddedEvent.class.cast(event);
 
+        final Project.NameKey projectKey = new Project.NameKey(commentAddedEvent.change.get().project);
         final PluginBranchSpecificSettings settings =
-                settingsProvider.getBranchSpecificSettings(commentAddedEvent.change.get().branch);
+                settingsProvider.getBranchSpecificSettings(commentAddedEvent.change.get().branch, projectKey);
 
         if (!settings.isAllowMaintainersSubmit()) {
             LOG.warn("Maintainers submit is turned off");
@@ -125,7 +127,7 @@
                         final MaintainersIndex maintainersIndex =
                                 new MaintainersIndex(maintainersProvider
                                         .getMaintainersInfo(commentAddedEvent.getBranchNameKey().get(),
-                                                changeNumber));
+                                                changeNumber, projectKey));
 
                         LOG.info("Getting current patch list for patchset {}", currentPatchset.getId());
                         final PatchList patchList = getPatchList(patchListCache, change, currentPatchset);
@@ -156,8 +158,7 @@
                         } else if (patchsetReviewInfo.getReviewState() == COMMITTER_ATTENTION_NEEDED) {
                             LOG.info("Patchset {} affects no configured components, committers attention needed",
                                     currentPatchset.getId());
-                        }
-                        else {
+                        } else {
                             LOG.info(
                                     "Patchset {} does not have verifications from following components yet : {}",
                                     currentPatchset.getId(), patchsetReviewInfo.getMissingComponentReview());
diff --git a/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java b/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
index b2d940a..4e8acb1 100644
--- a/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
+++ b/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
@@ -20,6 +20,7 @@
 import static java.util.Objects.nonNull;
 
 import com.google.gerrit.reviewdb.client.Change;
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.server.ReviewDb;
 import com.google.gerrit.server.git.GitRepositoryManager;
 import com.google.gwtorm.server.OrmException;
@@ -65,10 +66,12 @@
     }
 
     @Nonnull
-    public List<ComponentInfo> getMaintainersInfo(@Nonnull final String branchName, final int changeNumber) {
+    public List<ComponentInfo> getMaintainersInfo(@Nonnull final String branchName, final int changeNumber,
+                                                  @Nonnull final Project.NameKey projectKey) {
 
         // get configuration for branch of change
-        final PluginBranchSpecificSettings settings = settingsProvider.getBranchSpecificSettings(branchName);
+        final PluginBranchSpecificSettings settings =
+                settingsProvider.getBranchSpecificSettings(branchName, projectKey);
 
         try (final ReviewDb reviewDb = schemaFactory.open()) {
             final Change change = reviewDb.changes().get(new Change.Id(changeNumber));
diff --git a/src/main/java/io/fd/maintainer/plugin/service/SettingsProvider.java b/src/main/java/io/fd/maintainer/plugin/service/SettingsProvider.java
index 9c3f6fd..8dc9ca0 100644
--- a/src/main/java/io/fd/maintainer/plugin/service/SettingsProvider.java
+++ b/src/main/java/io/fd/maintainer/plugin/service/SettingsProvider.java
@@ -18,8 +18,10 @@
 
 import static java.lang.String.format;
 
+import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.project.NoSuchProjectException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import io.fd.maintainer.plugin.service.dto.PluginBranchSpecificSettings;
@@ -62,26 +64,28 @@
     @Inject
     private PluginConfigFactory cfg;
 
-    public PluginBranchSpecificSettings getBranchSpecificSettings(@Nonnull final String branchName) {
+    public PluginBranchSpecificSettings getBranchSpecificSettings(@Nonnull final String branchName,
+                                                                  @Nonnull final Project.NameKey projectKey) {
 
         final String fullBranchName = branchName.startsWith(RefNames.REFS_HEADS)
                 ? branchName
                 : RefNames.REFS_HEADS.concat(branchName);
 
         LOG.info("Reading configuration for branch {}", fullBranchName);
-        return getSettingsForBranch(fullBranchName, closesBranchMatch(fullBranchName));
+        return getSettingsForBranch(fullBranchName, closesBranchMatch(fullBranchName, projectKey), projectKey);
     }
 
-    private PluginBranchSpecificSettings getSettingsForBranch(final String branchName, final String closestBranch) {
+    private PluginBranchSpecificSettings getSettingsForBranch(final String branchName, final String closestBranch,
+                                                              final Project.NameKey projectKey) {
         return new PluginBranchSpecificSettings.PluginSettingsBuilder()
-                .setPluginUserName(pluginUserOrThrow(branchName, closestBranch))
-                .setLocalFilePath(fileNameRefOrDefault(branchName, closestBranch))
-                .setFileRef(filePathRefOrDefault(branchName, closestBranch))
-                .setAllowMaintainersSubmit(allowMaintainersSubmitOrDefault(branchName, closestBranch))
-                .setAutoAddReviewers(autoAddReviewersOrDefault(branchName, closestBranch))
-                .setAutoSubmit(autoSubmitOrDefault(branchName, closestBranch))
-                .setDislikeWarnings(dislikeWarningsOrDefault(branchName, closestBranch))
-                .setBranch(globalPluginConfig().getSubsections(BRANCH_SECTION)
+                .setPluginUserName(pluginUserOrThrow(branchName, closestBranch, projectKey))
+                .setLocalFilePath(fileNameRefOrDefault(branchName, closestBranch, projectKey))
+                .setFileRef(filePathRefOrDefault(branchName, closestBranch, projectKey))
+                .setAllowMaintainersSubmit(allowMaintainersSubmitOrDefault(branchName, closestBranch, projectKey))
+                .setAutoAddReviewers(autoAddReviewersOrDefault(branchName, closestBranch, projectKey))
+                .setAutoSubmit(autoSubmitOrDefault(branchName, closestBranch, projectKey))
+                .setDislikeWarnings(dislikeWarningsOrDefault(branchName, closestBranch, projectKey))
+                .setBranch(projectSpecificPluginConfig(projectKey).getSubsections(BRANCH_SECTION)
                         .stream()
                         .filter(subSection -> subSection.equals(branchName))
                         .findAny()
@@ -89,34 +93,43 @@
                 .createPluginSettings();
     }
 
-    private Boolean autoAddReviewersOrDefault(final String branch, final String closesBranch) {
-        return getKey(branch, closesBranch, AUTO_ADD_REVIEWERS, DEFAULT_AUTO_ADD_REVIEWERS, Boolean::valueOf);
+    private Boolean autoAddReviewersOrDefault(final String branch, final String closesBranch,
+                                              final Project.NameKey projectKey) {
+        return getKey(projectKey, branch, closesBranch, AUTO_ADD_REVIEWERS, DEFAULT_AUTO_ADD_REVIEWERS,
+                Boolean::valueOf);
     }
 
-    private Boolean autoSubmitOrDefault(final String branch, final String closestBranch) {
-        return getKey(branch, closestBranch, AUTO_SUBMIT, DEFAULT_AUTO_SUBMIT, Boolean::valueOf);
+    private Boolean autoSubmitOrDefault(final String branch, final String closestBranch,
+                                        final Project.NameKey projectKey) {
+        return getKey(projectKey, branch, closestBranch, AUTO_SUBMIT, DEFAULT_AUTO_SUBMIT, Boolean::valueOf);
     }
 
-    private Boolean allowMaintainersSubmitOrDefault(final String branch, final String closesBranch) {
-        return getKey(branch, closesBranch, ALLOW_SUBMIT, DEFAULT_ALLOW_SUBMIT, Boolean::valueOf);
+    private Boolean allowMaintainersSubmitOrDefault(final String branch, final String closesBranch,
+                                                    final Project.NameKey projectKey) {
+        return getKey(projectKey, branch, closesBranch, ALLOW_SUBMIT, DEFAULT_ALLOW_SUBMIT, Boolean::valueOf);
     }
 
-    private Boolean dislikeWarningsOrDefault(final String branch, final String closesBranch){
-        return getKey(branch, closesBranch, DISLIKE_WARNINGS, DEFAULT_DISLIKE_WARNINGS, Boolean::valueOf);
+    private Boolean dislikeWarningsOrDefault(final String branch, final String closesBranch,
+                                             final Project.NameKey projectKey) {
+        return getKey(projectKey, branch, closesBranch, DISLIKE_WARNINGS, DEFAULT_DISLIKE_WARNINGS, Boolean::valueOf);
     }
 
-    private String fileNameRefOrDefault(final String branch, final String closesBranch) {
-        return getKey(branch, closesBranch, MAINTAINERS_FILE_REF, DEFAULT_MAINTAINERS_FILE_REF, String::valueOf);
+    private String fileNameRefOrDefault(final String branch, final String closesBranch,
+                                        final Project.NameKey projectKey) {
+        return getKey(projectKey, branch, closesBranch, MAINTAINERS_FILE_REF, DEFAULT_MAINTAINERS_FILE_REF,
+                String::valueOf);
     }
 
-    private String filePathRefOrDefault(final String branch, final String closesBranch) {
-        return getKey(branch, closesBranch, MAINTAINERS_FILE_PATH_REF, DEFAULT_MAINTAINERS_FILE_PATH_REF,
+    private String filePathRefOrDefault(final String branch, final String closesBranch,
+                                        final Project.NameKey projectKey) {
+        return getKey(projectKey, branch, closesBranch, MAINTAINERS_FILE_PATH_REF, DEFAULT_MAINTAINERS_FILE_PATH_REF,
                 String::valueOf);
     }
 
     private String pluginUserOrThrow(final String branch,
-                                     final String alternativeBranch) {
-        final Config config = globalPluginConfig();
+                                     final String alternativeBranch,
+                                     final Project.NameKey projectKey) {
+        final Config config = projectSpecificPluginConfig(projectKey);
         return Optional.ofNullable(config.getString(BRANCH_SECTION, branch, PLUGIN_USER))
                 .orElse(Optional.ofNullable(config.getString(BRANCH_SECTION, alternativeBranch, PLUGIN_USER))
                         .orElseThrow(() -> {
@@ -125,27 +138,32 @@
                         }));
     }
 
-    private <T> T getKey(final String branch,
+    private <T> T getKey(final Project.NameKey projectKey,
+                         final String branch,
                          final String alternativeBranch,
                          final String subKey,
                          final T defaultValue,
                          final Function<String, T> mapTo) {
-        return Optional.ofNullable(globalPluginConfig()
+        return Optional.ofNullable(projectSpecificPluginConfig(projectKey)
                 .getString(BRANCH_SECTION, branch, subKey))
                 .map(mapTo)
                 .orElse(Optional.ofNullable(
-                        globalPluginConfig().getString(BRANCH_SECTION, alternativeBranch, subKey))
+                        projectSpecificPluginConfig(projectKey).getString(BRANCH_SECTION, alternativeBranch, subKey))
                         .map(mapTo)
                         .orElse(defaultValue));
     }
 
-    private Config globalPluginConfig() {
-        return cfg.getGlobalPluginConfig(MAINTAINER_PLUGIN);
+    private Config projectSpecificPluginConfig(final Project.NameKey projectKey) {
+        try {
+            return cfg.getProjectPluginConfig(projectKey, MAINTAINER_PLUGIN);
+        } catch (NoSuchProjectException e) {
+            throw new IllegalStateException(format("Project %s not found", projectKey));
+        }
     }
 
     // match by the number of changes needed to change one String into another
-    private String closesBranchMatch(final String branchName) {
-        return globalPluginConfig().getSubsections(BRANCH_SECTION).stream()
+    private String closesBranchMatch(final String branchName, final Project.NameKey projectKey) {
+        return projectSpecificPluginConfig(projectKey).getSubsections(BRANCH_SECTION).stream()
                 .reduce((branchOne, branchTwo) -> closestMatch(branchName, branchOne, branchTwo))
                 // if non use default
                 .orElse(RefNames.REFS_HEADS);
