diff --git a/pom.xml b/pom.xml
index a1af88d..f0c1710 100644
--- a/pom.xml
+++ b/pom.xml
@@ -6,7 +6,7 @@
 
     <groupId>io.fd.gerrit</groupId>
     <artifactId>maintainer-plugin</artifactId>
-    <version>2.13-SR3</version>
+    <version>2.13-SR4-SNAPSHOT</version>
     <packaging>jar</packaging>
 
     <properties>
@@ -80,5 +80,11 @@
             <version>1.10.19</version>
             <scope>test</scope>
         </dependency>
+        <dependency>
+            <groupId>com.google.inject.extensions</groupId>
+            <artifactId>guice-testlib</artifactId>
+            <version>4.1.0</version>
+            <scope>test</scope>
+        </dependency>
     </dependencies>
 </project>
\ No newline at end of file
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 ca6d23c..b402bcd 100644
--- a/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
+++ b/src/main/java/io/fd/maintainer/plugin/service/MaintainersProvider.java
@@ -16,9 +16,6 @@
 
 package io.fd.maintainer.plugin.service;
 
-import static java.lang.String.format;
-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;
@@ -33,11 +30,6 @@
 import io.fd.maintainer.plugin.service.dto.PluginBranchSpecificSettings;
 import io.fd.maintainer.plugin.util.ClosestMatch;
 import io.fd.maintainer.plugin.util.PatchListProcessing;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.util.List;
-import java.util.Optional;
-import javax.annotation.Nonnull;
 import org.eclipse.jgit.lib.ObjectId;
 import org.eclipse.jgit.lib.ObjectLoader;
 import org.eclipse.jgit.lib.Ref;
@@ -49,6 +41,16 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
+import javax.annotation.Nonnull;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.util.List;
+import java.util.Optional;
+
+import static com.google.common.base.Preconditions.checkState;
+import static java.lang.String.format;
+import static java.util.Objects.nonNull;
+
 @Singleton
 public class MaintainersProvider implements ClosestMatch, PatchListProcessing {
 
@@ -68,7 +70,6 @@
     @Nonnull
     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, projectKey);
@@ -92,15 +93,14 @@
                 if (nonNull(maintainersFileContent)) {
                     return maintainersParser.parseMaintainers(maintainersFileContent);
                 } else {
+                    LOG.info("Unable to find file {} in branch {}", settings.getLocalFilePath(), fullFileRef);
                     throw new IllegalStateException(
                             format("Unable to find file %s in branch %s", settings.getLocalFilePath(),
                                     fullFileRef));
                 }
-            } catch (IOException | MaintainerMismatchException e) {
-                throw new IllegalStateException(e);
             }
-
-        } catch (OrmException e) {
+        } catch (OrmException | IOException | MaintainerMismatchException e) {
+            LOG.error("Error while searching maintainers file", e);
             throw new IllegalStateException(e);
         }
     }
@@ -113,6 +113,7 @@
             final RevCommit headCommit) {
         LOG.info("Starting search at {}", headCommit);
 
+        checkState(headCommit.getParentCount() > 0, "Bottom of the branch has been reached and maintainers file hasnt been found");
         final RevCommit parent = getRevCommit(revWalk, headCommit.getParent(0).getId());
         LOG.info("Finding most recent maintainers file in {}", parent);
 
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 7c69e0a..01034bc 100644
--- a/src/main/java/io/fd/maintainer/plugin/service/SettingsProvider.java
+++ b/src/main/java/io/fd/maintainer/plugin/service/SettingsProvider.java
@@ -16,7 +16,7 @@
 
 package io.fd.maintainer.plugin.service;
 
-import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Strings;
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.reviewdb.client.RefNames;
 import com.google.gerrit.server.config.PluginConfigFactory;
@@ -37,7 +37,7 @@
 import static java.lang.String.format;
 
 @Singleton
-public final class SettingsProvider implements ClosestMatch {
+public class SettingsProvider implements ClosestMatch {
 
     private static final Logger LOG = LoggerFactory.getLogger(SettingsProvider.class);
 
@@ -65,11 +65,11 @@
     private static final String DISLIKE_WARNINGS = "dislikewarnings";
     private static final boolean DEFAULT_DISLIKE_WARNINGS = false;
 
-    @Inject
-    private PluginConfigFactory cfg;
 
-    @VisibleForTesting
-    SettingsProvider(PluginConfigFactory cfg) {
+    private final PluginConfigFactory cfg;
+
+    @Inject
+    public SettingsProvider(PluginConfigFactory cfg) {
         this.cfg = cfg;
     }
 
@@ -156,12 +156,16 @@
                                      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(() -> {
-                            LOG.error("Plugin user not specified for branch {}", branch);
-                            return new IllegalStateException(format("Plugin user not specified for branch %s", branch));
-                        }));
+
+        final String user = Optional.ofNullable(config.getString(BRANCH_SECTION, branch, PLUGIN_USER))
+                .orElse(config.getString(BRANCH_SECTION, alternativeBranch, PLUGIN_USER));
+
+        if (Strings.isNullOrEmpty(user)) {
+            LOG.error("Plugin user not specified for branch {}", branch);
+            throw new IllegalStateException(format("Plugin user not specified for branch %s", branch));
+        } else {
+            return user;
+        }
     }
 
     private <T> T getKey(final Project.NameKey projectKey,
diff --git a/src/main/java/io/fd/maintainer/plugin/service/push/ReviewerPusher.java b/src/main/java/io/fd/maintainer/plugin/service/push/ReviewerPusher.java
index 4354df3..00d958c 100644
--- a/src/main/java/io/fd/maintainer/plugin/service/push/ReviewerPusher.java
+++ b/src/main/java/io/fd/maintainer/plugin/service/push/ReviewerPusher.java
@@ -41,6 +41,7 @@
 import io.fd.maintainer.plugin.util.WarningGenerator;
 import java.util.Collection;
 import java.util.Map;
+import java.util.Objects;
 import java.util.Set;
 import java.util.stream.Collectors;
 import javax.annotation.Nonnull;
@@ -93,6 +94,7 @@
                 .flatMap(Collection::stream)
                 .map(Maintainer::getName)
                 .map(accountIndex::get)
+                .filter(Objects::nonNull)
                 .collect(Collectors.toSet());
 
         LOG.info("Adding reviewers for change {}", change.getId());
diff --git a/src/test/java/io/fd/maintainer/plugin/MaintainerPluginModuleTest.java b/src/test/java/io/fd/maintainer/plugin/MaintainerPluginModuleTest.java
new file mode 100644
index 0000000..222074c
--- /dev/null
+++ b/src/test/java/io/fd/maintainer/plugin/MaintainerPluginModuleTest.java
@@ -0,0 +1,79 @@
+package io.fd.maintainer.plugin;
+
+import com.google.gerrit.reviewdb.server.ReviewDb;
+import com.google.gerrit.server.CurrentUser;
+import com.google.gerrit.server.account.AccountByEmailCache;
+import com.google.gerrit.server.change.*;
+import com.google.gerrit.server.config.PluginConfigFactory;
+import com.google.gerrit.server.git.GitRepositoryManager;
+import com.google.gerrit.server.patch.PatchListCache;
+import com.google.gwtorm.server.SchemaFactory;
+import com.google.inject.Guice;
+import com.google.inject.testing.fieldbinder.Bind;
+import com.google.inject.testing.fieldbinder.BoundFieldModule;
+import org.junit.Before;
+import org.junit.Test;
+import org.mockito.Mock;
+import org.mockito.MockitoAnnotations;
+
+public class MaintainerPluginModuleTest {
+
+    @Mock
+    @Bind
+    private PluginConfigFactory pluginConfigFactory;
+
+    @Mock
+    @Bind
+    private GitRepositoryManager repoManager;
+
+    @Mock
+    @Bind
+    private SchemaFactory<ReviewDb> reviewDbSchemaFactory;
+
+    @Mock
+    @Bind
+    private PatchListCache patchListCache;
+
+    @Mock
+    @Bind
+    private ReviewDb reviewDb;
+
+    @Mock
+    @Bind
+    private CurrentUser currentUser;
+
+    @Mock
+    @Bind
+    private PostReview postReview;
+
+    @Mock
+    @Bind
+    private PostReviewers postReviewers;
+
+    @Mock
+    @Bind
+    private ChangesCollection changesCollection;
+
+    @Mock
+    @Bind
+    private Revisions revisions;
+
+    @Mock
+    @Bind
+    private Submit submitPusher;
+
+    @Mock
+    @Bind
+    private AccountByEmailCache accountByEmailCache;
+
+    @Before
+    public void init() {
+        MockitoAnnotations.initMocks(this);
+    }
+
+    @Test
+    public void configure() throws Exception {
+        Guice.createInjector(new MaintainerPluginModule(), BoundFieldModule.of(this)).injectMembers(this);
+    }
+
+}
\ No newline at end of file
