diff --git a/BUCK b/BUCK
index 657539f..9a96483 100644
--- a/BUCK
+++ b/BUCK
@@ -19,7 +19,7 @@
   srcs = glob(['src/main/java/**/*.java']),
   manifest_entries = [
     'Gerrit-PluginName: automerge',
-    'Gerrit-Module: com.criteo.gerrit.plugins.automerge.Module',
+    'Gerrit-Module: com.criteo.gerrit.plugins.automerge.AutomergeModule',
     'Implementation-Title: Automerge plugin',
     'Implementation-URL: https://github.com/criteo/automerge-plugin'
   ]
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 73aa030..c21c973 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomaticMerger.java
@@ -48,7 +48,6 @@
 import com.google.inject.Inject;
 import com.google.inject.Provider;
 
-import org.eclipse.jgit.errors.RepositoryNotFoundException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -107,71 +106,31 @@
   @Inject
   Submit submitter;
 
+
   @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) {
-          throw new RuntimeException(e1);
-        }
-
-        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);
-          }
-        }
-      }
-      if (event instanceof PatchSetCreatedEvent) {
-        final PatchSetCreatedEvent newComment = (PatchSetCreatedEvent) event;
-
-        final ChangeAttribute change = newComment.change;
-        final int reviewNumber = Integer.parseInt(change.number);
-        try {
-          api.changes().id(reviewNumber).get(EnumSet.of(ListChangesOption.CURRENT_REVISION));
-        } catch (final RestApiException e1) {
-          throw new RuntimeException(e1);
-        }
-        if (atomicityHelper.isAtomicReview(change)) {
-          if (atomicityHelper.hasDependentReview(reviewNumber)) {
-            reviewUpdater.setMinusTwo(reviewNumber, AutomergeConfig.ATOMIC_REVIEWS_SAME_REPO_FILE);
-          } else {
-            reviewUpdater.commentOnReview(reviewNumber, AutomergeConfig.ATOMIC_REVIEW_DETECTED_FILE);
-          }
-        }
-      }
-
-
-    } catch (NoSuchChangeException | OrmException | IOException | AuthException | BadRequestException
-        | UnprocessableEntityException e) {
-      throw new RuntimeException(e);
+    if (event instanceof TopicChangedEvent) {
+      final TopicChangedEvent newComment = (TopicChangedEvent) event;
+      final ChangeAttribute change = newComment.change;
+      processAtomicChange(change);
     }
+    if (event instanceof PatchSetCreatedEvent) {
+      final PatchSetCreatedEvent newComment = (PatchSetCreatedEvent) event;
+      final ChangeAttribute change = newComment.change;
+      Integer.parseInt(change.number);
+      processAtomicChange(change);
+    }
+
     if (event instanceof CommentAddedEvent) {
       final CommentAddedEvent newComment = (CommentAddedEvent) event;
       final ChangeAttribute change = newComment.change;
       final int reviewNumber = Integer.parseInt(change.number);
       try {
         api.changes().id(reviewNumber).get(EnumSet.of(ListChangesOption.CURRENT_REVISION));
-      } catch (final RestApiException e1) {
-        throw new RuntimeException(e1);
-      }
-
-      if (newComment.author.email.contains("qabot")) {
-        return;
-      }
-      final String topic = change.topic;
-      try {
+        if (newComment.author.email == config.getBotEmail()) {
+          return;
+        }
+        final String topic = change.topic;
         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();
@@ -214,26 +173,40 @@
             }
           }
         }
-      } catch (final RestApiException e) {
+      } catch (final RestApiException | NoSuchChangeException | OrmException | IOException e) {
+        log.error("An exception occured while trying to atomic merge a change.", e);
         throw new RuntimeException(e);
-      } catch (final OrmException e) {
-        throw new RuntimeException(e);
-      } catch (final NumberFormatException e) {
-        // TODO Auto-generated catch block
-        e.printStackTrace();
-      } catch (final NoSuchChangeException e) {
-        // TODO Auto-generated catch block
-        e.printStackTrace();
-      } catch (final RepositoryNotFoundException e) {
-        // TODO Auto-generated catch block
-        e.printStackTrace();
-      } catch (final IOException e) {
-        // TODO Auto-generated catch block
-        e.printStackTrace();
       }
     }
   }
 
+  private void processAtomicChange(final ChangeAttribute 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) {
+      throw new RuntimeException(e1);
+    }
+
+    if (atomicityHelper.isAtomicReview(change)) {
+      try {
+        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);
+        }
+      } catch (AuthException | BadRequestException | UnprocessableEntityException | IOException | NoSuchChangeException
+          | OrmException e) {
+        throw new RuntimeException(e);
+      }
+    }
+
+  }
+
   @Override
   public void start() {
     log.info("Starting automatic merger plugin.");
diff --git a/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeModule.java
similarity index 69%
rename from src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
rename to src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeModule.java
index 32da151..b5f180e 100644
--- a/src/main/java/com/criteo/gerrit/plugins/automerge/Module.java
+++ b/src/main/java/com/criteo/gerrit/plugins/automerge/AutomergeModule.java
@@ -14,31 +14,16 @@
 
 package com.criteo.gerrit.plugins.automerge;
 
-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.
  *
  * Configures how all classes in the plugin are instantiated via Guice.
  */
-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);
-  }
+public class AutomergeModule extends AbstractModule {
 
   @Override
   protected void configure() {
