diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
index a3c5e18..41c1bf5 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/ConfigLoader.java
@@ -165,6 +165,20 @@
   }
 
   /**
+   * Returns a string to append to the end of the merge conflict message for the manifest project.
+   *
+   * @return The message string, or the empty string if nothing is specified.
+   * @throws ConfigInvalidException
+   */
+  public String getManifestConflictMessage() throws ConfigInvalidException {
+    String conflictMessage = getConfig().getString("global", null, "manifestConflictMessage");
+    if (Strings.isNullOrEmpty(conflictMessage)) {
+      conflictMessage = getConflictMessage();
+    }
+    return conflictMessage;
+  }
+
+  /**
    * Get the projects that should be merged for the given pair of branches.
    *
    * @param fromBranch Branch we are merging from.
@@ -293,6 +307,19 @@
     return user.get().getAccountId();
   }
 
+  /**
+   * Returns overriden manifest config if specified, default if not
+   * @return The string name of the manifest project.
+   * @throws ConfigInvalidException
+   */
+  public String getManifestProject() throws ConfigInvalidException {
+    String manifestProject = getConfig().getString("global", null, "manifestProject");
+    if (manifestProject == null) {
+      throw new ConfigInvalidException("manifestProject not specified.");
+    }
+    return manifestProject;
+  }
+
   // Returns overriden manifest config if specified, default if not
   private String getManifestFile() throws ConfigInvalidException {
     String manifestFile = getConfig().getString("global", null, "manifestFile");
@@ -302,15 +329,6 @@
     return manifestFile;
   }
 
-  // Returns overriden manifest config if specified, default if not
-  private String getManifestProject() throws ConfigInvalidException {
-    String manifestProject = getConfig().getString("global", null, "manifestProject");
-    if (manifestProject == null) {
-      throw new ConfigInvalidException("manifestProject not specified.");
-    }
-    return manifestProject;
-  }
-
   // Returns contents of manifest file for the given branch pair
   // If manifest does not exist, return empty set.
   private Set<String> getManifestProjects(String fromBranch, String toBranch)
diff --git a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
index 070b9b7..d2b29c9 100644
--- a/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
+++ b/src/main/java/com/googlesource/gerrit/plugins/automerger/DownstreamCreator.java
@@ -412,6 +412,10 @@
       }
 
       if (!failedMergeBranchMap.isEmpty()) {
+        String conflictMessage = config.getConflictMessage();
+        if (mdsMergeInput.project.equals(config.getManifestProject())) {
+          conflictMessage = config.getManifestConflictMessage();
+        }
         throw new FailedMergeException(
             failedMergeBranchMap,
             mdsMergeInput.currentRevision,
@@ -419,7 +423,7 @@
             mdsMergeInput.project,
             mdsMergeInput.changeNumber,
             mdsMergeInput.patchsetNumber,
-            config.getConflictMessage(),
+            conflictMessage,
             mdsMergeInput.topic);
       }
     }
diff --git a/src/main/resources/Documentation/config.md b/src/main/resources/Documentation/config.md
index a1752b1..6e629b3 100644
--- a/src/main/resources/Documentation/config.md
+++ b/src/main/resources/Documentation/config.md
@@ -10,6 +10,7 @@
     hostName = https://hostname.example.com
     conflictMessage = Merge conflict found on ${branch}\n\
 " # Example of multiline conflict message"
+    manifestConflictMessage = Conflict found on platform/manifest
     manifestProject = platform/manifest
     manifestFile = default.xml
     alwaysBlankMerge = .*SKIP ME ALWAYS.*
@@ -71,6 +72,12 @@
     conflictMessage = Conflict message ${conflict} found on branch ${branch}
   ```
 
+global.manifestConflictMessage
+: Like conflictMessage, but only applies to the manifestProject.
+
+  Some messages on normal projects don't apply to manifest projects. This
+  provides users the option to have a different message for manifest projects.
+
 global.manifestProject
 : Project to look for a [repo manifest][1] in.
 
diff --git a/src/test/java/com/googlesource/gerrit/plugins/automerger/ConfigLoaderIT.java b/src/test/java/com/googlesource/gerrit/plugins/automerger/ConfigLoaderIT.java
index d20f878..0235cd8 100644
--- a/src/test/java/com/googlesource/gerrit/plugins/automerger/ConfigLoaderIT.java
+++ b/src/test/java/com/googlesource/gerrit/plugins/automerger/ConfigLoaderIT.java
@@ -222,6 +222,20 @@
   }
 
   @Test
+  public void getDefaultManifestConflictMessageTest() throws Exception {
+    defaultSetup("automerger.config");
+    assertThat(configLoader.getManifestConflictMessage())
+        .isEqualTo("Merge conflict found on ${branch}");
+  }
+
+  @Test
+  public void getMultilineManifestConflictMessageTest() throws Exception {
+    defaultSetup("alternate.config");
+    assertThat(configLoader.getManifestConflictMessage())
+        .isEqualTo("mline1\n" + "mline2\n" + "mline3 ${branch}\n" + "mline4");
+  }
+
+  @Test
   public void getMinAutomergeVoteTest() throws Exception {
     defaultSetup("alternate.config");
     assertThat(configLoader.getMinAutomergeVote()).isEqualTo(-3);
diff --git a/src/test/resources/com/googlesource/gerrit/plugins/automerger/alternate.config b/src/test/resources/com/googlesource/gerrit/plugins/automerger/alternate.config
index 19d69c1..80b7bb6 100644
--- a/src/test/resources/com/googlesource/gerrit/plugins/automerger/alternate.config
+++ b/src/test/resources/com/googlesource/gerrit/plugins/automerger/alternate.config
@@ -18,4 +18,8 @@
 line2\n\
 line3 ${branch}\n\
 line4
+  manifestConflictMessage = mline1\n\
+mline2\n\
+mline3 ${branch}\n\
+mline4
   missingDownstreamsMessage = there is no ${missingDownstreams}
\ No newline at end of file
