diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
index f48e000..a2f7d33 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AtomicityHelper.java
@@ -21,12 +21,17 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
 import java.io.IOException;
 import java.util.List;
 import java.util.Set;
 
 public class AtomicityHelper {
 
+  private final static Logger log = LoggerFactory.getLogger(AtomicityHelper.class);
+
   @Inject
   private AccountByEmailCache byEmailCache;
 
@@ -39,6 +44,7 @@
   @Inject
   private ChangesCollection collection;
 
+  @Inject
   AutomergeConfig config;
 
   @Inject
@@ -59,10 +65,6 @@
   @Inject
   Submit submitter;
 
-  public AtomicityHelper(final AutomergeConfig config) {
-    this.config = config;
-  }
-
   /**
    * Check if the current patchset of the specified change has dependent
    * unmerged changes.
@@ -78,10 +80,9 @@
     final IdentifiedUser bot = factory.create(ids.iterator().next());
     final ChangeControl ctl = changeFactory.controlFor(new Change.Id(number), bot);
     final ChangeData changeData = changeDataFactory.create(db.get(), new Change.Id(number));
-
     final RevisionResource r = new RevisionResource(collection.parse(ctl), changeData.currentPatchSet());
     final RelatedInfo related = getRelated.apply(r);
-
+    log.debug(String.format("Checking for related changes on review %d", number));
     return related.changes.size() > 0;
   }
 
@@ -93,7 +94,9 @@
    * @return true or false
    */
   public boolean isAtomicReview(final ChangeAttribute change) {
-    return change.topic != null && change.topic.startsWith(config.getTopicPrefix());
+    final boolean atomic = change.topic != null && change.topic.startsWith(config.getTopicPrefix());
+    log.debug(String.format("Checking if change %s is an atomic change: %b", change.number, atomic));
+    return atomic;
   }
 
   /**
@@ -106,12 +109,14 @@
   public boolean isSubmittable(final int change) throws OrmException {
     final ChangeData changeData = changeDataFactory.create(db.get(), new Change.Id(change));
     final List<SubmitRecord> cansubmit = changeData.changeControl().canSubmit(db.get(), changeData.currentPatchSet());
-
+    log.debug(String.format("Checking if change %d is submitable.", change));
     for (final SubmitRecord submit : cansubmit) {
       if (submit.status != SubmitRecord.Status.OK) {
+        log.debug(String.format("Change %d is not submitable", change));
         return false;
       }
     }
+    log.debug(String.format("Change %d is submitable", change));
     return true;
   }
 }
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
index 102b71d..73aa030 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
@@ -35,7 +35,6 @@
 import com.google.gerrit.server.change.PostReview;
 import com.google.gerrit.server.change.RevisionResource;
 import com.google.gerrit.server.change.Submit;
-import com.google.gerrit.server.config.GerritServerConfig;
 import com.google.gerrit.server.data.ChangeAttribute;
 import com.google.gerrit.server.events.ChangeEvent;
 import com.google.gerrit.server.events.CommentAddedEvent;
@@ -50,7 +49,8 @@
 import com.google.inject.Provider;
 
 import org.eclipse.jgit.errors.RepositoryNotFoundException;
-import org.eclipse.jgit.lib.Config;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.io.IOException;
 import java.util.EnumSet;
@@ -63,9 +63,13 @@
  */
 public class AutomaticMerger implements ChangeListener, LifecycleListener {
 
+  private final static Logger log = LoggerFactory.getLogger(AutomaticMerger.class);
+
   @Inject
   private GerritApi api;
-  private final AtomicityHelper atomicityHelper;
+
+  @Inject
+  private AtomicityHelper atomicityHelper;
 
   @Inject
   private AccountByEmailCache byEmailCache;
@@ -79,7 +83,8 @@
   @Inject
   private ChangesCollection collection;
 
-  private final AutomergeConfig config;
+  @Inject
+  private AutomergeConfig config;
 
   @Inject
   Provider<ReviewDb> db;
@@ -95,24 +100,22 @@
 
   @Inject
   Provider<PostReview> reviewer;
-  private final ReviewUpdater reviewUpdater;
+
+  @Inject
+  private ReviewUpdater reviewUpdater;
+
   @Inject
   Submit submitter;
 
-  @Inject
-  public AutomaticMerger(@GerritServerConfig final Config gerritConfig) {
-    config = new AutomergeConfig(gerritConfig);
-    reviewUpdater = new ReviewUpdater(config);
-    atomicityHelper = new AtomicityHelper(config);
-  }
-
   @Override
   synchronized public void onChangeEvent(final ChangeEvent event) {
+    log.info("A change has been recieved");
     try {
       if (event instanceof TopicChangedEvent) {
         final TopicChangedEvent newComment = (TopicChangedEvent) event;
         final ChangeAttribute change = newComment.change;
         final int reviewNumber = Integer.parseInt(change.number);
+        log.info(String.format("Change on review %d is a topic change.", reviewNumber));
         try {
           api.changes().id(reviewNumber).get(EnumSet.of(ListChangesOption.CURRENT_REVISION));
         } catch (final RestApiException e1) {
@@ -121,8 +124,11 @@
 
         if (atomicityHelper.isAtomicReview(change)) {
           if (atomicityHelper.hasDependentReview(reviewNumber)) {
+            log.info(String.format("Setting -2 on change %d, other atomic changes exists on the same repository.",
+                reviewNumber));
             reviewUpdater.setMinusTwo(reviewNumber, AutomergeConfig.ATOMIC_REVIEWS_SAME_REPO_FILE);
           } else {
+            log.info(String.format("Detected atomic review on change %d", reviewNumber));
             reviewUpdater.commentOnReview(reviewNumber, AutomergeConfig.ATOMIC_REVIEW_DETECTED_FILE);
           }
         }
@@ -167,6 +173,7 @@
       final String topic = change.topic;
       try {
         if (atomicityHelper.isSubmittable(Integer.parseInt(newComment.change.number))) {
+          log.info(String.format("Change %d is submittable. Will try to merge all related changes.", reviewNumber));
           final List<ChangeInfo> related = Lists.newArrayList();
           if (topic != null) {
             related.addAll(api.changes().query("status: open AND topic: " + topic)
@@ -189,6 +196,7 @@
             }
           }
           if (mergeable) {
+            log.debug(String.format("Change %d is mergeable", reviewNumber));
             for (final ChangeInfo info : related) {
               final SubmitInput input = new SubmitInput();
               input.waitForMerge = true;
@@ -228,6 +236,7 @@
 
   @Override
   public void start() {
+    log.info("Starting automatic merger plugin.");
   }
 
   @Override
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java
index 9b84fdc..135c8df 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeConfig.java
@@ -4,7 +4,6 @@
 import com.google.gerrit.server.config.SitePaths;
 import com.google.inject.Inject;
 
-import org.apache.commons.io.FileUtils;
 import org.eclipse.jgit.lib.Config;
 
 import java.io.File;
@@ -25,28 +24,31 @@
 
   public static final String getDefaultBotEmail() {
     return defaultBotEmail;
-
   }
 
   public static final String getDefaultTopicPrefix() {
     return defaultTopicPrefix;
   }
 
-  private final Config config;
+  private String botEmail;
+  private final File templatesPath;
+  private String topicPrefix;
 
   @Inject
-  private SitePaths sitePaths;
+  public AutomergeConfig(@GerritServerConfig final Config config, final SitePaths paths) {
+    botEmail = config.getString(AUTOMERGE_SECTION, null, BOT_EMAIL_KEY);
+    if (botEmail == null) {
+      botEmail = defaultBotEmail;
+    }
+    topicPrefix = config.getString(AUTOMERGE_SECTION, null, TOPIC_PREFIX_KEY);
+    if (topicPrefix == null) {
+      topicPrefix = defaultTopicPrefix;
+    }
 
-
-  public AutomergeConfig(@GerritServerConfig final Config config) {
-    this.config = config;
+    templatesPath = paths.etc_dir;
   }
 
   public final String getBotEmail() {
-    final String botEmail = config.getString(AUTOMERGE_SECTION, null, BOT_EMAIL_KEY);
-    if (botEmail == null) {
-      return defaultBotEmail;
-    }
     return botEmail;
   }
 
@@ -57,21 +59,11 @@
    * @return a string containing a comment.
    * @throws IOException
    */
-  public final String getCommentFromFile(final String filename) {
-    final File commentFile = new File(sitePaths.etc_dir, filename);
-    try {
-      return FileUtils.readFileToString(commentFile);
-    } catch (final IOException exc) {
-      return String.format("Cannot find %s file in gerrit etc dir. Please check your gerrit configuration", filename);
-    }
+  public final String getTemplatesPath() {
+    return templatesPath.getPath();
   }
 
   public final String getTopicPrefix() {
-    final String topicPrefix = config.getString(AUTOMERGE_SECTION, null, TOPIC_PREFIX_KEY);
-    if (topicPrefix == null) {
-      return defaultTopicPrefix;
-    }
     return topicPrefix;
   }
-
 }
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java b/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
index 8ae8977..32da151 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
@@ -4,7 +4,7 @@
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
-//   http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
 //
 // Unless required by applicable law or agreed to in writing, software
 // distributed under the License is distributed on an "AS IS" BASIS,
@@ -14,9 +14,13 @@
 
 package com.criteo.gerrit.plugins.automerge;
 
-import com.google.gerrit.extensions.events.LifecycleListener;
+import com.google.common.base.Supplier;
+import com.google.common.base.Suppliers;
+import com.google.gerrit.common.ChangeListener;
 import com.google.gerrit.extensions.registration.DynamicSet;
 import com.google.inject.AbstractModule;
+import com.google.inject.Guice;
+import com.google.inject.Injector;
 
 /**
  * Main automerge Guice module.
@@ -25,8 +29,22 @@
  */
 public class Module extends AbstractModule {
 
+  protected static final Supplier<Injector> injector = Suppliers.memoize(new Supplier<Injector>() {
+    @Override
+    public Injector get() {
+      return Guice.createInjector(new Module());
+    }
+  });
+
+  public static <T> T getInstance(final Class<T> type) {
+    return injector.get().getInstance(type);
+  }
+
   @Override
   protected void configure() {
-    DynamicSet.bind(binder(), LifecycleListener.class).to(AutomaticMerger.class);
+    DynamicSet.bind(binder(), ChangeListener.class).to(AutomaticMerger.class);
+    bind(AutomergeConfig.class).asEagerSingleton();
+    bind(AtomicityHelper.class);
+    bind(ReviewUpdater.class);
   }
 }
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java b/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java
index 12138f1..9f40f2c 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/ReviewUpdater.java
@@ -1,5 +1,7 @@
 package com.criteo.gerrit.plugins.automerge;
 
+import com.google.common.base.Charsets;
+import com.google.common.io.Files;
 import com.google.gerrit.extensions.api.changes.ReviewInput;
 import com.google.gerrit.extensions.restapi.AuthException;
 import com.google.gerrit.extensions.restapi.BadRequestException;
@@ -19,10 +21,16 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
 import java.io.IOException;
 import java.util.Set;
 
 public class ReviewUpdater {
+  private final static Logger log = LoggerFactory.getLogger(AutomaticMerger.class);
+
   @Inject
   private AccountByEmailCache byEmailCache;
 
@@ -35,7 +43,9 @@
   @Inject
   private ChangesCollection collection;
 
-  final AutomergeConfig config;
+  @Inject
+  AutomergeConfig config;
+
   @Inject
   Provider<ReviewDb> db;
 
@@ -45,14 +55,10 @@
   @Inject
   Provider<PostReview> reviewer;
 
-  public ReviewUpdater(final AutomergeConfig config) {
-    this.config = config;
-  }
-
   public void commentOnReview(final int number, final String commentTemplate) throws NoSuchChangeException,
       OrmException, AuthException, BadRequestException, UnprocessableEntityException, IOException {
     final ReviewInput message = new ReviewInput();
-    message.message = config.getCommentFromFile(commentTemplate);
+    message.message = getCommentFromFile(commentTemplate);
     final Set<Account.Id> ids = byEmailCache.get(config.getBotEmail());
     final IdentifiedUser bot = factory.create(ids.iterator().next());
     final ChangeControl ctl = changeFactory.controlFor(new Change.Id(number), bot);
@@ -62,10 +68,22 @@
     reviewer.get().apply(r, message);
   }
 
+  private final String getCommentFromFile(final String filename) {
+    try {
+      return Files.toString(new File(config.getTemplatesPath(), filename), Charsets.UTF_8);
+
+    } catch (final IOException exc) {
+      final String errmsg =
+          String.format("Cannot find %s file in gerrit etc dir. Please check your gerrit configuration", filename);
+      log.error(errmsg);
+      return errmsg;
+    }
+  }
+
   public void setMinusTwo(final int number, final String commentTemplate) throws NoSuchChangeException, OrmException,
       AuthException, BadRequestException, UnprocessableEntityException, IOException {
     final ReviewInput message = new ReviewInput();
-    message.message = config.getCommentFromFile(commentTemplate);
+    message.message = getCommentFromFile(commentTemplate);
     message.label("Code-Review", -2);
     final Set<Account.Id> ids = byEmailCache.get(config.getBotEmail());
     final IdentifiedUser bot = factory.create(ids.iterator().next());
