diff --git a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/RepositoryWorkItem.java b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/RepositoryWorkItem.java
index 197e40991..e803a75e9 100644
--- a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/RepositoryWorkItem.java
+++ b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/RepositoryWorkItem.java
@@ -182,7 +182,7 @@ private List<Throwable> handleTags(Repository localRepo, UpdateHistory history,
                                 .map(OpenJDKTag::create)
                                 .filter(Optional::isPresent)
                                 .map(Optional::get)
-                                .sorted(Comparator.comparingInt(OpenJDKTag::buildNum))
+                                .sorted(Comparator.comparingInt(tag -> tag.buildNum().orElse(-1)))
                                 .collect(Collectors.toList());
         for (var tag : newJdkTags) {
             var commits = new ArrayList<Commit>();
diff --git a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/issue/IssueNotifier.java b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/issue/IssueNotifier.java
index 487965d07..238e5ddc0 100644
--- a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/issue/IssueNotifier.java
+++ b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/issue/IssueNotifier.java
@@ -281,6 +281,9 @@ public void onNewOpenJDKTagCommits(HostedRepository repository, Repository local
         if (buildName == null) {
             return;
         }
+        if (tag.buildNum().isEmpty()) {
+            return;
+        }
 
         for (var commit : commits) {
             var commitMessage = CommitMessageParsers.v1.parse(commit);
@@ -343,7 +346,7 @@ public void onNewOpenJDKTagCommits(HostedRepository repository, Repository local
 
                 // Check if the build name should be updated
                 var oldBuild = issue.properties().getOrDefault("customfield_10006", JSON.of());
-                var newBuild = "b" + String.format("%02d", tag.buildNum());
+                var newBuild = "b" + String.format("%02d", tag.buildNum().get());
                 if (BuildCompare.shouldReplace(newBuild, oldBuild.asString())) {
                     issue.setProperty("customfield_10006", JSON.of(newBuild));
                 } else {
diff --git a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/json/JsonNotifier.java b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/json/JsonNotifier.java
index a26641182..5eb95bce6 100644
--- a/bots/notify/src/main/java/org/openjdk/skara/bots/notify/json/JsonNotifier.java
+++ b/bots/notify/src/main/java/org/openjdk/skara/bots/notify/json/JsonNotifier.java
@@ -95,7 +95,10 @@ public void onNewCommits(HostedRepository repository, Repository localRepository
 
     @Override
     public void onNewOpenJDKTagCommits(HostedRepository repository, Repository localRepository, List<Commit> commits, OpenJDKTag tag, Tag.Annotated annotation) throws NonRetriableException {
-        var build = String.format("b%02d", tag.buildNum());
+        if (tag.buildNum().isEmpty()) {
+            return;
+        }
+        var build = String.format("b%02d", tag.buildNum().get());
         try (var writer = new JsonWriter(path, repository.name())) {
             var issues = new ArrayList<Issue>();
             for (var commit : commits) {
diff --git a/vcs/src/main/java/org/openjdk/skara/vcs/openjdk/OpenJDKTag.java b/vcs/src/main/java/org/openjdk/skara/vcs/openjdk/OpenJDKTag.java
index 6969123dd..0183f0a46 100644
--- a/vcs/src/main/java/org/openjdk/skara/vcs/openjdk/OpenJDKTag.java
+++ b/vcs/src/main/java/org/openjdk/skara/vcs/openjdk/OpenJDKTag.java
@@ -108,25 +108,25 @@ public String version() {
      *
      * @return
      */
-    public int buildNum() {
+    public Optional<Integer> buildNum() {
         if (buildNum == null) {
-            return 0;
+            return Optional.empty();
         }
-        return Integer.parseInt(buildNum);
+        return Optional.of(Integer.parseInt(buildNum));
     }
 
     /**
-     * Tag of the previous build (if any).
+     * Tag of the previous build (if any). Build 0 (and no build number at all) have no previous build.
      *
      * @return
      */
     public Optional<OpenJDKTag> previous() {
-        if (buildNum() == 0) {
+        if (buildNum().orElse(0) == 0) {
             return Optional.empty();
         }
 
         // Make sure build numbers < 10 for JDK 9 tags are not prefixed with '0'
-        var previousBuildNum = buildNum() - 1;
+        var previousBuildNum = buildNum().get() - 1;
         var formattedBuildNum = String.format(buildPrefix.equals("+") ? "%d" : "%02d", previousBuildNum);
         var tagName = prefix + buildPrefix + formattedBuildNum;
         var tag = new Tag(tagName);
diff --git a/vcs/src/test/java/org/openjdk/skara/vcs/openjdk/OpenJDKTagTests.java b/vcs/src/test/java/org/openjdk/skara/vcs/openjdk/OpenJDKTagTests.java
index dd0ef2298..7287ca4d7 100644
--- a/vcs/src/test/java/org/openjdk/skara/vcs/openjdk/OpenJDKTagTests.java
+++ b/vcs/src/test/java/org/openjdk/skara/vcs/openjdk/OpenJDKTagTests.java
@@ -33,64 +33,64 @@ class OpenJDKTagTests {
     void parseTags() {
         var tag = new Tag("jdk-10+20");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
-        assertEquals(20, jdkTag.buildNum());
+        assertEquals(20, jdkTag.buildNum().orElseThrow());
         var previousTag = jdkTag.previous().orElseThrow();
-        assertEquals(19, previousTag.buildNum());
+        assertEquals(19, previousTag.buildNum().orElseThrow());
     }
 
     @Test
     void parseSingleDigitTags() {
         var tag = new Tag("jdk-10+10");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
-        assertEquals(10, jdkTag.buildNum());
+        assertEquals(10, jdkTag.buildNum().orElseThrow());
         var previousTag = jdkTag.previous().orElseThrow();
         assertEquals("jdk-10+9", previousTag.tag().name());
-        assertEquals(9, previousTag.buildNum());
+        assertEquals(9, previousTag.buildNum().orElseThrow());
     }
 
     @Test
     void parseLegacyTags() {
         var tag = new Tag("jdk7-b147");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
-        assertEquals(147, jdkTag.buildNum());
+        assertEquals(147, jdkTag.buildNum().orElseThrow());
         var previousTag = jdkTag.previous().orElseThrow();
-        assertEquals(146, previousTag.buildNum());
+        assertEquals(146, previousTag.buildNum().orElseThrow());
     }
 
     @Test
     void parseSingleDigitLegacyTags() {
         var tag = new Tag("jdk7-b10");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
-        assertEquals(10, jdkTag.buildNum());
+        assertEquals(10, jdkTag.buildNum().orElseThrow());
         var previousTag = jdkTag.previous().orElseThrow();
         assertEquals("jdk7-b09", previousTag.tag().name());
-        assertEquals(9, previousTag.buildNum());
+        assertEquals(9, previousTag.buildNum().orElseThrow());
     }
 
     @Test
     void parseHotspotTags() {
         var tag = new Tag("hs23.6-b19");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
-        assertEquals(19, jdkTag.buildNum());
+        assertEquals(19, jdkTag.buildNum().orElseThrow());
         var previousTag = jdkTag.previous().orElseThrow();
-        assertEquals(18, previousTag.buildNum());
+        assertEquals(18, previousTag.buildNum().orElseThrow());
     }
 
     @Test
     void parseSingleDigitHotspotTags() {
         var tag = new Tag("hs23.6-b10");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
-        assertEquals(10, jdkTag.buildNum());
+        assertEquals(10, jdkTag.buildNum().orElseThrow());
         var previousTag = jdkTag.previous().orElseThrow();
         assertEquals("hs23.6-b09", previousTag.tag().name());
-        assertEquals(9, previousTag.buildNum());
+        assertEquals(9, previousTag.buildNum().orElseThrow());
     }
 
     @Test
     void noPrevious() {
         var tag = new Tag("jdk-10+0");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
-        assertEquals(0, jdkTag.buildNum());
+        assertEquals(0, jdkTag.buildNum().orElseThrow());
         assertFalse(jdkTag.previous().isPresent());
     }
 
@@ -99,9 +99,9 @@ void parseJfxTags() {
         var tag = new Tag("12.1.3+14");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
         assertEquals("12.1.3", jdkTag.version());
-        assertEquals(14, jdkTag.buildNum());
+        assertEquals(14, jdkTag.buildNum().orElseThrow());
         var previousTag = jdkTag.previous().orElseThrow();
-        assertEquals(13, previousTag.buildNum());
+        assertEquals(13, previousTag.buildNum().orElseThrow());
     }
 
     @Test
@@ -109,6 +109,6 @@ void parseJfxTagsGa() {
         var tag = new Tag("12.1-ga");
         var jdkTag = OpenJDKTag.create(tag).orElseThrow();
         assertEquals("12.1", jdkTag.version());
-        assertEquals(0, jdkTag.buildNum());
+        assertTrue(jdkTag.buildNum().isEmpty());
     }
 }