diff --git a/src/main/java/com/amd/gerrit/plugins/manifestsubscription/ManifestSubscription.java b/src/main/java/com/amd/gerrit/plugins/manifestsubscription/ManifestSubscription.java
index 0376815..70873c4 100644
--- a/src/main/java/com/amd/gerrit/plugins/manifestsubscription/ManifestSubscription.java
+++ b/src/main/java/com/amd/gerrit/plugins/manifestsubscription/ManifestSubscription.java
@@ -64,6 +64,12 @@
   private Table<String, String, Manifest> manifestStores = HashBasedTable.create();
 
   /**
+   * manifest source lookup
+   * repo name, branch (branchPath), manifest source repo
+   */
+  private Table<String, String, String> manifestSource = HashBasedTable.create();
+
+  /**
    * lookup
    * subscribed project name and branch, manifest dest store, <manifest dest branch Project>
    **/
@@ -127,6 +133,8 @@
       processManifestChange(event, projectName, branchName);
 
     } else if (subscribedRepos.containsRow(pbKey)) {
+      //updates in subscribed repos
+
       // Manifest store and branch
       Map<String, Map<String, Set<
           com.amd.gerrit.plugins.manifestsubscription.manifest.Project>>>
@@ -138,6 +146,7 @@
               = destinations.get(store).get(storeBranch);
 
           Manifest manifest = manifestStores.get(store, storeBranch);
+          String manifestSrc = manifestSource.get(store, storeBranch);
           // these are project from the above manifest previously
           // cached in the lookup table
           for (com.amd.gerrit.plugins.manifestsubscription.manifest.Project
@@ -146,7 +155,8 @@
           }
 
           try {
-            updateManifest(store, STORE_BRANCH_PREFIX + storeBranch, manifest);
+            updateManifest(store, STORE_BRANCH_PREFIX + storeBranch,
+                           manifest, manifestSrc);
           } catch (JAXBException | IOException e) {
             e.printStackTrace();
           }
@@ -154,7 +164,6 @@
         }
       }
 
-      //updates in subscribed repos
     }
 
 
@@ -221,6 +230,7 @@
               if (branchPath.startsWith(branchName)) {
                 iter.remove();
                 manifestStores.remove(store, branchPath);
+                manifestSource.remove(store, branchPath);
               }
             }
           }
@@ -237,11 +247,12 @@
 
             VersionedManifests.affixManifest(gitRepoManager, manifest, lookup);
 
-            watchCanonicalManifest(manifest, store, bp);
+            watchCanonicalManifest(manifest, store, bp, projectName);
             //save manifest
             //TODO added the m/ to the ref to to work around LOCK_FAILURE error of creating master/bla/bla
             //TODO (because default master ref already exists) better solution?
-            updateManifest(store, STORE_BRANCH_PREFIX + bp, manifest);
+            updateManifest(store, STORE_BRANCH_PREFIX + bp,
+                           manifest, projectName);
 
           } catch (ManifestReadException e) {
             e.printStackTrace();
@@ -257,7 +268,7 @@
   }
 
   private void watchCanonicalManifest(Manifest manifest, String store,
-                                      String branchPath) {
+                                      String branchPath, String manifestSrc) {
     String defaultBranch;
     if (manifest.getDefault() != null &&
         manifest.getDefault().getRevision() != null) {
@@ -267,6 +278,7 @@
     }
 
     manifestStores.put(store, branchPath, manifest);
+    manifestSource.put(store, branchPath, manifestSrc);
 
     List<com.amd.gerrit.plugins.manifestsubscription.manifest.Project> projects
         = manifest.getProject();
@@ -335,6 +347,7 @@
         if (oldStore != null && !oldStore.isEmpty()) {
           //TODO FIX assume unique store for each manifest source (1-1 map)
           manifestStores.row(oldStore).clear();
+          manifestSource.row(oldStore).clear();
           enabledManifestSource.remove(event.getProjectName());
 
           Iterator<Table.Cell<ProjectBranchKey, String, Map<String,
@@ -411,7 +424,7 @@
   }
 
   private void updateManifest(String projectName, String refName,
-                              Manifest manifest)
+                              Manifest manifest, String manifestSrc)
       throws JAXBException, IOException {
     Project.NameKey p = new Project.NameKey(projectName);
     MetaDataUpdate update = metaDataUpdateFactory.create(p);
@@ -429,6 +442,7 @@
       Map<String, Manifest> entry = Maps.newHashMapWithExpectedSize(1);
       entry.put("default.xml", manifest);
       vManifests.setManifests(entry);
+      vManifests.setSrcManifestRepo(manifestSrc);
       vManifests.commit(update);
     } else {
       vManifests = new VersionedManifests("master");
diff --git a/src/main/java/com/amd/gerrit/plugins/manifestsubscription/VersionedManifests.java b/src/main/java/com/amd/gerrit/plugins/manifestsubscription/VersionedManifests.java
index b7ea26e..99a255a 100644
--- a/src/main/java/com/amd/gerrit/plugins/manifestsubscription/VersionedManifests.java
+++ b/src/main/java/com/amd/gerrit/plugins/manifestsubscription/VersionedManifests.java
@@ -46,6 +46,19 @@
   private Unmarshaller manifestUnmarshaller;
   private Marshaller manifestMarshaller;
   private Map<String, Manifest> manifests;
+  private String srcManifestRepo = "";
+
+  public String getSrcManifestRepo() {
+    return srcManifestRepo;
+  }
+
+  public void setSrcManifestRepo(String srcManifestRepo) {
+    this.srcManifestRepo = srcManifestRepo;
+  }
+
+  public Map<String, Manifest> getManifests() {
+    return Collections.unmodifiableMap(manifests);
+  }
 
   public void setManifests(Map<String, Manifest> manifests) {
     this.manifests = manifests;
@@ -55,10 +68,6 @@
     return manifests.keySet();
   }
 
-  public Map<String, Manifest> getManifests() {
-    return Collections.unmodifiableMap(manifests);
-  }
-
   private VersionedManifests() throws JAXBException {
     JAXBContext jaxbctx = JAXBContext.newInstance(Manifest.class);
     this.manifestUnmarshaller = jaxbctx.createUnmarshaller();
@@ -129,7 +138,8 @@
   @Override
   protected boolean onSave(CommitBuilder commit) throws IOException {
     StringBuilder commitMsg = new StringBuilder();
-    commitMsg.append("Updated manifest\n\n");
+    commitMsg.append("Snapshot manifest from " +
+        srcManifestRepo + " updated\n\n");
 
     String path;
     Manifest manifest;
@@ -241,5 +251,4 @@
       }
     }
   }
-
 }
