diff --git a/src/main/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractor.java b/src/main/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractor.java
index 92521a5..456eacf 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractor.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractor.java
@@ -22,7 +22,9 @@
 public class DependsOnExtractor {
   public List<String> extract(String commitMessage) {
     List<String> dependsOn = new ArrayList<>();
-    Pattern pattern = Pattern.compile("[Dd]epends-[Oo]n:? (I[0-9a-f]{8,40})", Pattern.DOTALL);
+    Pattern pattern =
+        Pattern.compile(
+            "^Depends-On: (I[0-9a-f]{40})\\s*$", Pattern.MULTILINE | Pattern.CASE_INSENSITIVE);
     Matcher matcher = pattern.matcher(commitMessage);
     while (matcher.find()) {
       String key = matcher.group(1);
diff --git a/src/test/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractorTest.java b/src/test/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractorTest.java
index 7e24229..70344f7 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractorTest.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/zuul/util/DependsOnExtractorTest.java
@@ -30,7 +30,27 @@
   }
 
   @Test
-  public void testExtractSingleDependency() throws Exception {
+  public void testExtractNoDependencyTooShortChangeId() throws Exception {
+    DependsOnExtractor extractor = new DependsOnExtractor();
+    String commitMessage = "subject\n\nDepends-On: I123456789112345678921234567893123456789";
+
+    List<String> extracted = extractor.extract(commitMessage);
+
+    assertThat(extracted).isEmpty();
+  }
+
+  @Test
+  public void testExtractNoDependencyTooLongChangeId() throws Exception {
+    DependsOnExtractor extractor = new DependsOnExtractor();
+    String commitMessage = "subject\n\nDepends-On: I12345678911234567892123456789312345678941";
+
+    List<String> extracted = extractor.extract(commitMessage);
+
+    assertThat(extracted).isEmpty();
+  }
+
+  @Test
+  public void testExtractSingleDependencyLineEnd() throws Exception {
     DependsOnExtractor extractor = new DependsOnExtractor();
     String commitMessage = "subject\n\nDepends-On: " + getChangeKey(1);
 
@@ -40,6 +60,16 @@
   }
 
   @Test
+  public void testExtractSingleDependencyContinuedLine() throws Exception {
+    DependsOnExtractor extractor = new DependsOnExtractor();
+    String commitMessage = "subject\n\nDepends-On: " + getChangeKey(1) + " ";
+
+    List<String> extracted = extractor.extract(commitMessage);
+
+    assertThat(extracted).containsExactly(getChangeKey(1));
+  }
+
+  @Test
   public void testExtractMultipleDependencies() throws Exception {
     DependsOnExtractor extractor = new DependsOnExtractor();
     String commitMessage =
@@ -69,7 +99,7 @@
   public void testExtractMixedCases() throws Exception {
     DependsOnExtractor extractor = new DependsOnExtractor();
     String commitMessage =
-        "subject\n\ndepends-On: " + getChangeKey(1) + "\nDepends-on: " + getChangeKey(2);
+        "subject\n\ndepends-On: " + getChangeKey(1) + "\nDePeNds-on: " + getChangeKey(2);
 
     List<String> extracted = extractor.extract(commitMessage);
 
