diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java
index 32f51c5..21bc418 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfig.java
@@ -34,6 +34,7 @@
     static final String ENABLED = "enabled";
     static final String BLOCKED_REFS = "blockedRef";
     static final String BLOCKED_PROJECTS = "blockedProject";
+    static final String BLOCK_LIGHTWEIGHT_TAGS = "blockLightWeightTags";
 
     @VisibleForTesting
     static boolean filterMatches(String filter, String repoName) {
@@ -56,7 +57,8 @@
       return new EventListenersConfig(
           cfg.getBoolean(EVENT_LISTENERS, ENABLED, true),
           toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_PROJECTS)),
-          toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_REFS)));
+          toCombinedMatcher(cfg.getStringList(EVENT_LISTENERS, null, BLOCKED_REFS)),
+          cfg.getBoolean(EVENT_LISTENERS, BLOCK_LIGHTWEIGHT_TAGS, false));
     }
 
     private final PluginConfigFactory configFactory;
@@ -81,7 +83,7 @@
       } catch (NoSuchProjectException e) {
         logger.atSevere().withCause(e).log(
             "Unable to read project.config, using default EventListenersConfig");
-        return new EventListenersConfig(true, toCombinedMatcher(""), toCombinedMatcher(""));
+        return new EventListenersConfig(true, toCombinedMatcher(""), toCombinedMatcher(""), false);
       }
     }
   }
@@ -89,15 +91,18 @@
   private final boolean enabled;
   private final Function<String, Boolean> blockedRefMatcher;
   private final Function<String, Boolean> blockedProjectMatcher;
+  private final boolean blockLightWeightTags;
 
   @VisibleForTesting
   public EventListenersConfig(
       boolean enabled,
       Function<String, Boolean> blockedProjectMatcher,
-      Function<String, Boolean> blockedRefMatcher) {
+      Function<String, Boolean> blockedRefMatcher,
+      boolean blockLightWeightTags) {
     this.enabled = enabled;
     this.blockedProjectMatcher = blockedProjectMatcher;
     this.blockedRefMatcher = blockedRefMatcher;
+    this.blockLightWeightTags = blockLightWeightTags;
   }
 
   public boolean isEnabled() {
@@ -111,4 +116,8 @@
   public boolean projectIsBlocked(String repoName) {
     return blockedProjectMatcher.apply(repoName);
   }
+
+  public boolean blockLightWeightTags() {
+    return blockLightWeightTags;
+  }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java
index bd60da4..8da4990 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/RefUpdateListener.java
@@ -51,7 +51,7 @@
       }
       /* Updated reference is a tag. */
       else if (event.getRefName().startsWith(RefNames.REFS_TAGS)) {
-        queue.scheduleArtcCreation(event, branch -> config.refIsBlocked(branch));
+        queue.scheduleArtcCreation(event, branch -> config.refIsBlocked(branch), config.blockLightWeightTags());
       }
     }
   }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
index 7210ae7..6b38d55 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParser.java
@@ -221,13 +221,14 @@
       String tagName,
       Long creationTime,
       boolean force,
-      Function<String, Boolean> blockedRefMatcher) {
+      Function<String, Boolean> blockedRefMatcher,
+      boolean blockLightWeightTags) {
     try {
       CompositionDefinedEventKey cd =
           CompositionDefinedEventKey.create(mapper.tagCompositionName(projectName), tagName);
       Optional<UUID> oldCdId = eventHub.getExistingId(cd);
       if (oldCdId.isEmpty() || force) {
-        createAndScheduleCd(projectName, tagName, creationTime, force, blockedRefMatcher);
+        createAndScheduleCd(projectName, tagName, creationTime, force, blockedRefMatcher, blockLightWeightTags);
         Optional<UUID> cdId = eventHub.getExistingId(cd);
         if (cdId.isPresent() && !cdId.equals(oldCdId)) {
           pushToHub(mapper.toArtc(projectName, tagName, creationTime, cdId.get()), force);
@@ -254,12 +255,13 @@
       String tagName,
       Long creationTime,
       boolean force,
-      Function<String, Boolean> blockedRefMatcher) {
+      Function<String, Boolean> blockedRefMatcher,
+      boolean blockLightWeightTags) {
     Optional<UUID> scsId = Optional.empty();
     List<Ref> refs = null;
 
     try {
-      ObjectId objectId = peelTag(projectName, tagName);
+      ObjectId objectId = peelTag(projectName, tagName, blockLightWeightTags);
       if (objectId == null) {
         return;
       }
@@ -344,12 +346,17 @@
     }
   }
 
-  private ObjectId peelTag(String projectName, String tagName) {
+  private ObjectId peelTag(String projectName, String tagName, boolean blockLightWeightTags) {
     try (Repository repo = repoManager.openRepository(Project.nameKey(projectName))) {
       Ref tagRef = repo.getRefDatabase().exactRef(Constants.R_TAGS + tagName);
       if (tagRef != null) {
         ObjectId peeled = repo.getRefDatabase().peel(tagRef).getPeeledObjectId();
-        return peeled != null ? peeled : tagRef.getObjectId();
+        if (peeled != null)
+          return peeled;
+        if (!blockLightWeightTags)
+          return tagRef.getObjectId();
+        logger.atInfo().log("Creation of CD is blocked for lightweight tags");
+        return null;
       }
       logger.atSevere().log("Cannot find tag: %s:%s", projectName, tagName);
     } catch (IOException e) {
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
index ba99d07..36e69ca 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParsingQueue.java
@@ -144,16 +144,17 @@
   }
 
   public void scheduleArtcCreation(
-      GitReferenceUpdatedListener.Event event, Function<String, Boolean> blockedRefMatcher) {
+      GitReferenceUpdatedListener.Event event, Function<String, Boolean> blockedRefMatcher, boolean blockLightWeightTags) {
     scheduleArtcCreation(
         event.getProjectName(),
         event.getRefName().substring(RefNames.REFS_TAGS.length()),
         TimeUtil.nowMs(),
         false,
-        blockedRefMatcher);
+        blockedRefMatcher,
+        blockLightWeightTags);
   }
 
-  public void scheduleArtcCreation(TagResource resource, boolean force) {
+  public void scheduleArtcCreation(TagResource resource, boolean force, boolean blockLightWeightTags) {
     String tagRef = resource.getRef();
     scheduleArtcCreation(
         resource.getName(),
@@ -162,7 +163,8 @@
             : tagRef,
         resource.getTagInfo().created.getTime(),
         force,
-        branch -> false);
+        branch -> false,
+        blockLightWeightTags);
   }
 
   public void scheduleArtcCreation(
@@ -170,7 +172,8 @@
       String tagName,
       Long creationTime,
       boolean force,
-      Function<String, Boolean> blockedRefMatcher) {
+      Function<String, Boolean> blockedRefMatcher,
+      boolean blockLightWeightTags) {
     schedule(
         new EventParsingWorker(ARTC, projectName, tagName) {
 
@@ -178,7 +181,7 @@
           public void doRun() {
             try {
               eventParser.createAndScheduleArtc(
-                  projectName, tagName, creationTime, force, blockedRefMatcher);
+                  projectName, tagName, creationTime, force, blockedRefMatcher, blockLightWeightTags);
             } catch (Exception e) {
               logger.atSevere().withCause(e).log(
                   "Failed to create ARTC for %s:%s", projectName, tagName);
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java
index 9a07c0f..7c53a2d 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/CreateArtcs.java
@@ -25,6 +25,8 @@
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
 import com.googlesource.gerrit.plugins.eventseiffel.parsing.EiffelEventParsingQueue;
+import com.google.inject.Provider;
+import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig;
 
 @Singleton
 @RequiresCapability(GlobalCapability.ADMINISTRATE_SERVER)
@@ -34,16 +36,18 @@
   }
 
   private final EiffelEventParsingQueue queue;
+  private final Provider<EventListenersConfig> configProvider;
 
   @Inject
-  CreateArtcs(EiffelEventParsingQueue queue) {
+  CreateArtcs(EiffelEventParsingQueue queue, Provider<EventListenersConfig> configProvider) {
     this.queue = queue;
+    this.configProvider = configProvider;
   }
 
   @Override
   public Response<?> apply(TagResource resource, CreateArtcs.Input input)
       throws AuthException, BadRequestException, ResourceConflictException, Exception {
-    queue.scheduleArtcCreation(resource, input.force);
+    queue.scheduleArtcCreation(resource, input.force, configProvider.get().blockLightWeightTags());
     return EventCreationResponse.artc(resource);
   }
 }
diff --git a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java
index 29a643e..637f764 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/eventseiffel/rest/RestModule.java
@@ -18,11 +18,16 @@
 import static com.google.gerrit.server.project.TagResource.TAG_KIND;
 
 import com.google.gerrit.extensions.restapi.RestApiModule;
+import com.google.inject.Scopes;
+import com.googlesource.gerrit.plugins.eventseiffel.config.EventListenersConfig;
 
 public class RestModule extends RestApiModule {
 
   @Override
   public void configure() {
+    bind(EventListenersConfig.class)
+        .toProvider(EventListenersConfig.Provider.class)
+        .in(Scopes.SINGLETON);
     post(BRANCH_KIND, "createSccs").to(CreateSccs.class);
     post(BRANCH_KIND, "createScss").to(CreateScss.class);
     post(TAG_KIND, "createArtcs").to(CreateArtcs.class);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java
index ab2ca17..bee0989 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/config/EventListenersConfigTest.java
@@ -148,10 +148,10 @@
   }
 
   private EventListenersConfig refsPatterns(String... patterns) {
-    return new EventListenersConfig(true, toCombinedMatcher(), toCombinedMatcher(patterns));
+    return new EventListenersConfig(true, toCombinedMatcher(), toCombinedMatcher(patterns), false);
   }
 
   private EventListenersConfig projectsPatterns(String... patterns) {
-    return new EventListenersConfig(true, toCombinedMatcher(patterns), toCombinedMatcher());
+    return new EventListenersConfig(true, toCombinedMatcher(patterns), toCombinedMatcher(), false);
   }
 }
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
index b4cd29c..93ec6a6 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/listeners/GerritEventListenersIT.java
@@ -340,7 +340,7 @@
     @Override
     public EventListenersConfig get() {
       return new EventListenersConfig(
-          enabled, toCombinedMatcher(projectPatterns), toCombinedMatcher(refPatterns));
+          enabled, toCombinedMatcher(projectPatterns), toCombinedMatcher(refPatterns), false);
     }
   }
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
index cf4194c..9257cb0 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/eventseiffel/parsing/EiffelEventParserIT.java
@@ -210,7 +210,7 @@
     String ref = setCdHandled();
     ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref));
     markAsHandled(artc);
-    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false);
     assertEquals(0, TestEventHub.EVENTS.size());
   }
 
@@ -224,7 +224,7 @@
     markAsHandled(cd);
     ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref));
     markAsHandled(artc);
-    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, true, branch -> false);
+    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, true, branch -> false, false);
     assertEquals(2, TestEventHub.EVENTS.size());
     assertCorrectEvent(0, cd);
     assertCorrectEvent(1, artc);
@@ -258,7 +258,7 @@
     CompositionDefinedEventKey cd =
         CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), ref);
 
-    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false);
     assertEquals(4, TestEventHub.EVENTS.size());
     assertCorrectEvent(0, scc);
     assertCorrectEvent(1, scs);
@@ -272,7 +272,7 @@
         createTagRef(getHead(repo(), "HEAD").getName(), true).substring(Constants.R_TAGS.length());
 
     eventParser.createAndScheduleArtc(
-        project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"));
+        project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"), false);
     assertEquals(0, TestEventHub.EVENTS.size());
   }
 
@@ -290,7 +290,7 @@
         CompositionDefinedEventKey.create(tagCompositionName(project.get(), "localhost"), ref);
 
     eventParser.createAndScheduleArtc(
-        project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"));
+        project.get(), ref, EPOCH_MILLIS, false, branch -> branch.equals("refs/heads/master"), false);
     assertEquals(4, TestEventHub.EVENTS.size());
     assertCorrectEvent(0, scc);
     assertCorrectEvent(1, scs);
@@ -301,18 +301,34 @@
   @Test
   public void artcQueuedNoTagCreated() throws Exception {
     eventParser.createAndScheduleArtc(
-        project.get(), TAG_NAME, EPOCH_MILLIS, false, branch -> false);
+        project.get(), TAG_NAME, EPOCH_MILLIS, false, branch -> false, false);
     assertEquals(0, TestEventHub.EVENTS.size());
   }
 
   @Test
   public void annotatedTagArtcQueuedscsHandled() throws Exception {
-    assertArtcQueuedScsHandled(true);
+    assertArtcQueuedScsHandled(true, false);
   }
 
   @Test
-  public void LightweightTagArtcQueuedscsHandled() throws Exception {
-    assertArtcQueuedScsHandled(false);
+  public void lightWeightTagArtcQueuedscsHandled() throws Exception {
+    assertArtcQueuedScsHandled(false, false);
+  }
+
+  @Test
+  public void annotatedTagArtcQueuedscsHandledLightWeightBlocked() throws Exception {
+    assertArtcQueuedScsHandled(true, true);
+  }
+
+  @Test
+  public void lightWeightTagArtcQueuedscsHandledLightWeightBlocked() throws Exception {
+    setScsHandled();
+    String ref =
+        createTagRef(getHead(repo(), "HEAD").getName(), false)
+            .substring(Constants.R_TAGS.length());
+
+    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, true);
+    assertEquals(0, TestEventHub.EVENTS.size());
   }
 
   @Test
@@ -320,7 +336,7 @@
     String ref = setCdHandled();
     ArtifactEventKey artc = ArtifactEventKey.create(tagPURL(project.get(), ref));
 
-    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, false);
     assertEquals(0, TestEventHub.EVENTS.size());
   }
 
@@ -328,14 +344,14 @@
   @UseLocalDisk
   @GlobalPluginConfig(pluginName = PLUGIN_NAME, name = "EiffelEvent.namespace", value = NAMESPACE)
   public void artcQueuedscsHandledWithCustomNameSpace() throws Exception {
-    assertArtcQueuedScsHandled(false, NAMESPACE);
+    assertArtcQueuedScsHandled(false, false, NAMESPACE);
   }
 
-  private void assertArtcQueuedScsHandled(boolean annotated) throws Exception {
-    assertArtcQueuedScsHandled(annotated, "localhost");
+  private void assertArtcQueuedScsHandled(boolean annotated, boolean blockLightWeight) throws Exception {
+    assertArtcQueuedScsHandled(annotated, blockLightWeight, "localhost");
   }
 
-  private void assertArtcQueuedScsHandled(boolean annotated, String namespace) throws Exception {
+  private void assertArtcQueuedScsHandled(boolean annotated, boolean blockLightWeight, String namespace) throws Exception {
     setScsHandled();
     String ref =
         createTagRef(getHead(repo(), "HEAD").getName(), annotated)
@@ -344,7 +360,7 @@
     CompositionDefinedEventKey cd =
         CompositionDefinedEventKey.create(tagCompositionName(project.get(), namespace), ref);
 
-    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false);
+    eventParser.createAndScheduleArtc(project.get(), ref, EPOCH_MILLIS, false, branch -> false, blockLightWeight);
     assertEquals(2, TestEventHub.EVENTS.size());
     assertCorrectEvent(0, cd);
     assertCorrectEvent(1, artc);
