Index: trunk/ppMerge/src/Makefile.am
===================================================================
--- trunk/ppMerge/src/Makefile.am	(revision 10270)
+++ trunk/ppMerge/src/Makefile.am	(revision 10294)
@@ -12,5 +12,6 @@
 	ppMergeMask.c		\
 	ppMergeOptions.c	\
-	ppMergeScaleZero.c
+	ppMergeScaleZero.c	\
+	ppMergeVersion.c
 
 
@@ -23,5 +24,6 @@
 	ppMergeMask.h		\
 	ppMergeOptions.h	\
-	ppMergeScaleZero.h
+	ppMergeScaleZero.h	\
+	ppMergeVersion.h
 
 CLEANFILES = *~
Index: trunk/ppMerge/src/ppMergeCombine.c
===================================================================
--- trunk/ppMerge/src/ppMergeCombine.c	(revision 10270)
+++ trunk/ppMerge/src/ppMergeCombine.c	(revision 10294)
@@ -14,4 +14,5 @@
 #include "ppMergeData.h"
 #include "ppMergeCombine.h"
+#include "ppMergeVersion.h"
 
 #if 0
@@ -107,4 +108,5 @@
     pmChip *chip;                       // Chip of interest
     psRandom *rng = NULL;               // Random number generator; required for building a mask
+    pmHDU *lastHDU = NULL;              // Last HDU to be updated
     if (options->mask) {
         rng = psRandomAlloc(PS_RANDOM_TAUS, 0);
@@ -130,4 +132,17 @@
             int numRead;  // Number of inputs read
             int numScan = 0;
+
+            // Put version metadata into header
+            pmHDU *hdu = pmHDUFromCell(cell);
+            if (!hdu) {
+                psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find HDU for chip %d cell %d.\n",
+                        view->chip, view->cell);
+                return false;
+            }
+            if (hdu != lastHDU) {
+                ppMergeVersionMetadata(hdu->header);
+                lastHDU = hdu;
+            }
+
 
             do {
Index: trunk/ppMerge/src/ppMergeVersion.c
===================================================================
--- trunk/ppMerge/src/ppMergeVersion.c	(revision 10294)
+++ trunk/ppMerge/src/ppMergeVersion.c	(revision 10294)
@@ -0,0 +1,60 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <pslib.h>
+#include <psmodules.h>
+#include <ppStats.h>
+
+#include "ppMergeVersion.h"
+
+static const char *cvsTag = "$Name: not supported by cvs2svn $";// CVS tag name
+
+psString ppMergeVersion(void)
+{
+    psString version = NULL;            // Version, to return
+    psStringAppend(&version, "%s-%s",PACKAGE_NAME,PACKAGE_VERSION);
+    return version;
+}
+
+psString ppMergeVersionLong(void)
+{
+    psString version = ppMergeVersion(); // Version, to return
+    psString tag = psStringStripCVS(cvsTag, "Name"); // CVS tag
+    psStringAppend(&version, " (cvs tag %s) %s, %s", tag, __DATE__, __TIME__);
+    psFree(tag);
+    return version;
+}
+
+
+void ppMergeVersionMetadata(psMetadata *metadata)
+{
+    PS_ASSERT_METADATA_NON_NULL(metadata,);
+
+    psString pslib = psLibVersionLong();// psLib version
+    psString psmodules = psModulesVersionLong(); // psModules version
+    psString ppStats = ppStatsVersionLong(); // ppStats version
+    psString ppMerge = ppMergeVersionLong(); // ppMerge version
+
+    psTime *time = psTimeGetNow(PS_TIME_TAI); // The time now
+    psString timeString = psTimeToISO(time); // The time in an ISO string
+    psFree(time);
+    psString head = NULL;               // Head string
+    psStringAppend(&head, "ppMerge processing at %s. Component information:", timeString);
+    psFree(timeString);
+
+    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, head, "");
+    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, pslib, "");
+    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, psmodules, "");
+    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, ppStats, "");
+    psMetadataAddStr(metadata, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, ppMerge, "");
+
+    psFree(head);
+    psFree(pslib);
+    psFree(psmodules);
+    psFree(ppStats);
+    psFree(ppMerge);
+
+    return;
+}
Index: trunk/ppMerge/src/ppMergeVersion.h
===================================================================
--- trunk/ppMerge/src/ppMergeVersion.h	(revision 10294)
+++ trunk/ppMerge/src/ppMergeVersion.h	(revision 10294)
@@ -0,0 +1,14 @@
+#ifndef PP_MERGE_VERSION_H
+#define PP_MERGE_VERSION_H
+
+/// Return short version information
+psString ppMergeVersion(void);
+
+/// Return long version information
+psString ppMergeVersionLong(void);
+
+/// Update the metadata with version information for all dependencies
+void ppMergeVersionMetadata(psMetadata *metadata ///< Metadata to update with version information
+    );
+
+#endif
