Index: trunk/ppArith/src/ppArith.c
===================================================================
--- trunk/ppArith/src/ppArith.c	(revision 23124)
+++ trunk/ppArith/src/ppArith.c	(revision 23195)
@@ -34,4 +34,6 @@
     }
 
+    ppArithVersionPrint();
+
     if (!ppArithArguments(argc, argv, config)) {
         psErrorStackPrint(stderr, "Error reading arguments.\n");
Index: trunk/ppArith/src/ppArith.h
===================================================================
--- trunk/ppArith/src/ppArith.h	(revision 23124)
+++ trunk/ppArith/src/ppArith.h	(revision 23195)
@@ -22,6 +22,6 @@
  * Parse the arguments
  */
-bool ppArithArguments(int argc, char *argv[], ///< Command-line arguments 
-                      pmConfig *config    ///< Configuration 
+bool ppArithArguments(int argc, char *argv[], ///< Command-line arguments
+                      pmConfig *config    ///< Configuration
     );
 
@@ -29,5 +29,5 @@
  * Parse the camera input
  */
-bool ppArithCamera(pmConfig *config       ///< Configuration 
+bool ppArithCamera(pmConfig *config       ///< Configuration
     );
 
@@ -35,5 +35,5 @@
  * Loop over the FPA hierarchy
  */
-bool ppArithLoop(pmConfig *config         ///< Configuration 
+bool ppArithLoop(pmConfig *config         ///< Configuration
     );
 
@@ -41,16 +41,19 @@
  * Perform arithmetic on the readout
  */
-bool ppArithReadout(pmReadout *output,  ///< Output readout 
-                    const pmReadout *input1, ///< Input readout 
-                    const pmReadout *input2, ///< Input readout 
-                    const pmConfig *config, ///< Configuration 
-                    const pmFPAview *view ///< View of readout on which to operate 
+bool ppArithReadout(pmReadout *output,  ///< Output readout
+                    const pmReadout *input1, ///< Input readout
+                    const pmReadout *input2, ///< Input readout
+                    const pmConfig *config, ///< Configuration
+                    const pmFPAview *view ///< View of readout on which to operate
     );
 
 /**
- * Put the program version information into a metadata
+ * Put the program version information into header
  */
-void ppArithVersionMetadata(psMetadata *metadata ///< Metadata to populate
+bool ppArithVersionHeader(psMetadata *header ///< Header to populate
     );
+
+/// Print version information
+void ppArithVersionPrint(void);
 
 ///@}
Index: trunk/ppArith/src/ppArithLoop.c
===================================================================
--- trunk/ppArith/src/ppArithLoop.c	(revision 23124)
+++ trunk/ppArith/src/ppArithLoop.c	(revision 23195)
@@ -113,5 +113,5 @@
                     hdu->header = psMetadataAlloc();
                 }
-                ppArithVersionMetadata(hdu->header);
+                ppArithVersionHeader(hdu->header);
                 lastHDU = hdu;
             }
Index: trunk/ppArith/src/ppArithVersion.c
===================================================================
--- trunk/ppArith/src/ppArithVersion.c	(revision 23124)
+++ trunk/ppArith/src/ppArithVersion.c	(revision 23195)
@@ -59,7 +59,42 @@
 };
 
-void ppArithVersionMetadata(psMetadata *metadata)
+bool ppArithVersionHeader(psMetadata *header)
 {
-    PS_ASSERT_METADATA_NON_NULL(metadata,);
+    PS_ASSERT_METADATA_NON_NULL(header, false);
+
+    psTime *time = psTimeGetNow(PS_TIME_TAI); // The time now
+    psString timeString = psTimeToISO(time); // The time in an ISO string
+    psFree(time);
+    psString history = NULL;               // History string
+    psStringAppend(&history, "ppArith at %s", timeString);
+    psFree(timeString);
+    psMetadataAddStr(header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, NULL, history);
+    psFree(history);
+
+    psLibVersionHeader(header);
+    psModulesVersionHeader(header);
+    ppStatsVersionHeader(header);
+
+    psString version = ppArithVersion(); // Software version
+    psString source  = ppArithSource();  // Software source
+
+    psMetadataAddStr(header, PS_LIST_TAIL, "IPP.PPARITH.VERSION", PS_META_REPLACE,
+                     "Software version", version);
+    psMetadataAddStr(header, PS_LIST_TAIL, "IPP.PPARITH.SOURCE", PS_META_REPLACE,
+                     "S/W source", source);
+
+    psFree(version);
+    psFree(source);
+
+    return true;
+}
+
+void ppArithVersionPrint(void)
+{
+    psTime *time = psTimeGetNow(PS_TIME_TAI); // The time now
+    psString timeString = psTimeToISO(time); // The time in an ISO string
+    psFree(time);
+    psLogMsg("ppArith", PS_LOG_INFO, "ppArith at %s", timeString);
+    psFree(timeString);
 
     psString pslib = psLibVersionLong();// psLib version
@@ -68,18 +103,9 @@
     psString ppArith = ppArithVersionLong(); // ppArith 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, "ppArith processing at %s. Component information:", timeString);
-    psFree(timeString);
+    psLogMsg("ppArith", PS_LOG_INFO, "%s", pslib);
+    psLogMsg("ppArith", PS_LOG_INFO, "%s", psmodules);
+    psLogMsg("ppArith", PS_LOG_INFO, "%s", ppStats);
+    psLogMsg("ppArith", PS_LOG_INFO, "%s", ppArith);
 
-    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, ppArith, "");
-
-    psFree(head);
     psFree(pslib);
     psFree(psmodules);
