Index: trunk/ppMops/src/ppMops.c
===================================================================
--- trunk/ppMops/src/ppMops.c	(revision 24241)
+++ trunk/ppMops/src/ppMops.c	(revision 24242)
@@ -1,4 +1,6 @@
 #include <stdio.h>
 #include <pslib.h>
+
+#include "ppMops.h"
 
 int main(int argc, char *argv[])
@@ -6,5 +8,5 @@
     if (argc != 4) {
         fprintf(stderr, "Insufficient arguments.\n");
-        fprintf(stderr, "Usage: %s DETECTIONS ASTROMETRY OUTPUT\n", argv[0]);
+        fprintf(stderr, "Usage: %s DETECTIONS ZP OUTPUT\n", argv[0]);
         exit(PS_EXIT_CONFIG_ERROR);
     }
@@ -21,5 +23,5 @@
         header = psFitsReadHeader(NULL, fits);
         if (!header) {
-            psErrorStackPrint("Unable to read header");
+            psErrorStackPrint(stderr, "Unable to read header");
             psFitsClose(fits);
             psFree(data);
@@ -27,5 +29,5 @@
         }
         if (!psFitsMoveExtName(fits, IN_EXTNAME)) {
-            psErrorStackPrint("Unable to move to extension %s", IN_EXTNAME);
+            psErrorStackPrint(stderr, "Unable to move to extension %s", IN_EXTNAME);
             psFitsClose(fits);
             psFree(header);
@@ -36,5 +38,5 @@
         psFitsClose(fits);
         if (!detections) {
-            psErrorStackPrint("Unable to read detections");
+            psErrorStackPrint(stderr, "Unable to read detections");
             psFree(data);
             psFree(header);
@@ -89,4 +91,5 @@
     // Translate the header
     psMetadata *outHeader = psMetadataAlloc(); // Output header
+    ppMopsVersionHeader(outHeader);
     {
         double ra = psMetadataLookupF64(NULL, header, "FPA.RA");
@@ -116,8 +119,8 @@
         psMetadataAddF64(outHeader, PS_LIST_TAIL, "FPA_ID", 0, "Exposure identifier", fpaid);
         psMetadataAddS32(outHeader, PS_LIST_TAIL, "OBSCODE", 0, "IAU Observatory code", OBSERVATORY_CODE);
-        psMetadataAddF32(outHeader, PS_LIST_TAIL, "LIMITMAG", 0, "Limiting magnitude", LIMITING_MAG);
         psMetadataAddF32(outHeader, PS_LIST_TAIL, "STARPSF", 0, "Stellar PSF (arcsec)", psf);
 
         // These are completely fake
+        psMetadataAddF32(outHeader, PS_LIST_TAIL, "LIMITMAG", 0, "Limiting magnitude", 25.0);
         psMetadataAddF32(outHeader, PS_LIST_TAIL, "DE1", 0, "Detection efficiency (FAKE)", 0.0);
         psMetadataAddF32(outHeader, PS_LIST_TAIL, "DE2", 0, "Detection efficiency (FAKE)", 0.0);
Index: trunk/ppMops/src/ppMops.h
===================================================================
--- trunk/ppMops/src/ppMops.h	(revision 24241)
+++ trunk/ppMops/src/ppMops.h	(revision 24242)
@@ -19,2 +19,19 @@
 
 
+
+/// Return version
+psString ppMopsVersion(void);
+
+/// Return source
+psString ppMopsSource(void);
+
+/// Return detailed version information
+psString ppMopsVersionLong(void);
+
+/// Put version into header
+bool ppMopsVersionHeader(psMetadata *header);
+
+/// Print version information
+void ppMopsVersionPrint(void);
+
+#endif
Index: trunk/ppMops/src/ppMopsData.c
===================================================================
--- trunk/ppMops/src/ppMopsData.c	(revision 24241)
+++ trunk/ppMops/src/ppMopsData.c	(revision 24242)
@@ -11,5 +11,4 @@
 {
     psFree(data->detections);
-    psFree(data->astrometry);
     psFree(data->output);
     return;
@@ -22,5 +21,5 @@
 
     data->detections = NULL;
-    data->astrometry = NULL;
+    data->zp = NAN;
     data->output = NULL;
 
Index: trunk/ppMops/src/ppMopsVersion.c
===================================================================
--- trunk/ppMops/src/ppMopsVersion.c	(revision 24242)
+++ trunk/ppMops/src/ppMopsVersion.c	(revision 24242)
@@ -0,0 +1,100 @@
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <stdio.h>
+#include <pslib.h>
+
+#include "ppMops.h"
+#include "ppMopsVersionDefinitions.h"
+
+#ifndef PPMOPS_VERSION
+#error "PPMOPS_VERSION is not set"
+#endif
+#ifndef PPMOPS_BRANCH
+#error "PPMOPS_BRANCH is not set"
+#endif
+#ifndef PPMOPS_SOURCE
+#error "PPMOPS_SOURCE is not set"
+#endif
+
+psString ppMopsVersion(void)
+{
+    char *value = NULL;
+    psStringAppend(&value, "%s@%s", PPMOPS_BRANCH, PPMOPS_VERSION);
+    return value;
+}
+
+psString ppMopsSource(void)
+{
+    return psStringCopy(PPMOPS_SOURCE);
+}
+
+psString ppMopsVersionLong(void)
+{
+    psString version = ppMopsVersion();  // Version, to return
+    psString source = ppMopsSource();    // Source
+
+    psStringPrepend(&version, "ppMops ");
+    psStringAppend(&version, " from %s, built %s, %s", source, __DATE__, __TIME__);
+    psFree(source);
+
+#ifdef __OPTIMIZE__
+    psStringAppend(&version, " optimised");
+#else
+    psStringAppend(&version, " unoptimised");
+#endif
+
+    return version;
+};
+
+
+bool ppMopsVersionHeader(psMetadata *header)
+{
+    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, "ppMops at %s", timeString);
+    psFree(timeString);
+    psMetadataAddStr(header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, NULL, history);
+    psFree(history);
+
+    psLibVersionHeader(header);
+
+    psString version = ppMopsVersion(); // Software version
+    psString source  = ppMopsSource();  // Software source
+
+    psStringPrepend(&version, "ppMops version: ");
+    psStringPrepend(&source, "ppMops source: ");
+
+    psMetadataAddStr(header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, NULL, version);
+    psMetadataAddStr(header, PS_LIST_TAIL, "HISTORY", PS_META_DUPLICATE_OK, NULL, source);
+
+    psFree(version);
+    psFree(source);
+
+    return true;
+}
+
+void ppMopsVersionPrint(void)
+{
+    psTime *time = psTimeGetNow(PS_TIME_TAI); // The time now
+    psString timeString = psTimeToISO(time); // The time in an ISO string
+    psFree(time);
+    psLogMsg("ppMops", PS_LOG_INFO, "ppMops at %s", timeString);
+    psFree(timeString);
+
+    psString pslib = psLibVersionLong();// psLib version
+    psString ppMops = ppMopsVersionLong(); // ppMops version
+
+    psLogMsg("ppMops", PS_LOG_INFO, "%s", pslib);
+    psLogMsg("ppMops", PS_LOG_INFO, "%s", ppMops);
+
+    psFree(pslib);
+    psFree(ppMops);
+
+    return;
+}
Index: trunk/ppMops/src/ppMopsVersionDefinitions.h.in
===================================================================
--- trunk/ppMops/src/ppMopsVersionDefinitions.h.in	(revision 24241)
+++ trunk/ppMops/src/ppMopsVersionDefinitions.h.in	(revision 24242)
@@ -1,8 +1,8 @@
-#ifndef PPSUB_VERSION_DEFINITIONS_H
-#define PPSUB_VERSION_DEFINITIONS_H
+#ifndef PPMOPS_VERSION_DEFINITIONS_H
+#define PPMOPS_VERSION_DEFINITIONS_H
 
-#define PPSUB_VERSION @PPSUB_VERSION@ // SVN version
-#define PPSUB_BRANCH  @PPSUB_BRANCH@  // SVN branch
-#define PPSUB_SOURCE  @PPSUB_SOURCE@  // SVN source
+#define PPMOPS_VERSION @PPMOPS_VERSION@ // SVN version
+#define PPMOPS_BRANCH  @PPMOPS_BRANCH@  // SVN branch
+#define PPMOPS_SOURCE  @PPMOPS_SOURCE@  // SVN source
 
 #endif
