Index: trunk/ppSub/src/ppSubLoop.c
===================================================================
--- trunk/ppSub/src/ppSubLoop.c	(revision 23315)
+++ trunk/ppSub/src/ppSubLoop.c	(revision 23688)
@@ -28,7 +28,8 @@
     pmConfigRecipesCull(config, "PPSUB,PPSTATS,PSPHOT,MASKS,JPEG");
 
+    ppSubData *data = ppSubDataAlloc(); // Processing data
+
     bool mdok;                          // Status of MD lookup
     const char *statsName = psMetadataLookupStr(&mdok, config->arguments, "STATS"); // Filename for statistics
-    psMetadata *stats = NULL;           // Container for statistics
     FILE *statsFile = NULL;             // File stream for statistics
     if (statsName && strlen(statsName) > 0) {
@@ -38,7 +39,5 @@
             psError(PS_ERR_IO, true, "Unable to open statistics file %s for writing.\n", resolved);
             psFree(resolved);
-            return false;
-        } else {
-            stats = psMetadataAlloc();
+            goto ERROR;
         }
         psFree(resolved);
@@ -48,5 +47,5 @@
     if (!input) {
         psError(PS_ERR_UNEXPECTED_NULL, false, "Can't find input data!\n");
-        return false;
+        goto ERROR;
     }
 
@@ -54,5 +53,5 @@
     if (!reference) {
         psError(PS_ERR_UNEXPECTED_NULL, false, "Can't find reference data!\n");
-        return false;
+        goto ERROR;
     }
 
@@ -60,5 +59,5 @@
     if (!output) {
         psError(PS_ERR_UNEXPECTED_NULL, false, "Can't find output data!\n");
-        return false;
+        goto ERROR;
     }
 
@@ -67,5 +66,5 @@
     // Iterate over the FPA hierarchy
     if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) {
-        return false;
+        goto ERROR;
     }
 
@@ -77,5 +76,5 @@
             psError(PS_ERR_BAD_PARAMETER_VALUE, true, "FPA format discrepency between input and reference");
             psFree(view);
-            return false;
+            goto ERROR;
         }
 
@@ -85,5 +84,5 @@
 
         if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) {
-            return false;
+            goto ERROR;
         }
 
@@ -96,5 +95,5 @@
                         "FPA format discrepency between input and reference");
                 psFree(view);
-                return false;
+                goto ERROR;
             }
             if (!inCell->file_exists) {
@@ -102,5 +101,5 @@
             }
             if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) {
-                return false;
+                goto ERROR;
             }
 
@@ -108,5 +107,5 @@
             while ((inRO = pmFPAviewNextReadout(view, input->fpa, 1))) {
                 if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) {
-                    return false;
+                    goto ERROR;
                 }
                 pmReadout *refRO = pmFPAviewThisReadout(view, reference->fpa);// Reference readout of interest
@@ -116,5 +115,5 @@
                             "FPA format discrepency between input and reference");
                     psFree(view);
-                    return false;
+                    goto ERROR;
                 }
                 if (!inRO->data_exists) {
@@ -123,37 +122,37 @@
 
                 // Perform the analysis
-                if (!ppSubReadout(config, stats, view)) {
+                if (!ppSubReadout(config, data, view)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to subtract images.\n");
-                    return false;
+                    goto ERROR;
                 }
 
                 if (!pmFPAfileIOChecks(config, view, PM_FPA_BEFORE)) {
-                    return false;
+                    goto ERROR;
                 }
             }
 
             // Perform statistics on the cell
-            if (stats) {
+            if (statsFile) {
                 pmFPAfile *output = psMetadataLookupPtr(NULL, config->files, "PPSUB.OUTPUT"); // Output file
                 if (!output) {
                     psError(PS_ERR_UNEXPECTED_NULL, true, "Unable to find file PPSUB.OUTPUT.\n");
-                    return false;
+                    goto ERROR;
                 }
                 psImageMaskType maskValue = pmConfigMaskGet("MASK.VALUE", config);
-                ppStatsFPA(stats, output->fpa, view, maskValue, config);
+                ppStatsFPA(data->stats, output->fpa, view, maskValue, config);
             }
 
             if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) {
-                return false;
+                goto ERROR;
             }
         }
 
         if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) {
-            return false;
+            goto ERROR;
         }
     }
 
     if (!pmFPAfileIOChecks(config, view, PM_FPA_AFTER)) {
-        return false;
+        goto ERROR;
     }
 
@@ -161,9 +160,9 @@
 
     // Write out summary statistics
-    if (stats) {
-        psMetadataAddF32(stats, PS_LIST_TAIL, "TIME_SUB", 0, "Time for subtraction completion",
+    if (statsFile) {
+        psMetadataAddF32(data->stats, PS_LIST_TAIL, "TIME_SUB", 0, "Time for subtraction completion",
                          psTimerMark("ppSub"));
 
-        const char *statsMDC = psMetadataConfigFormat(stats);
+        const char *statsMDC = psMetadataConfigFormat(data->stats);
         if (!statsMDC || strlen(statsMDC) == 0) {
             psWarning("Unable to generate statistics MDC file.\n");
@@ -173,15 +172,17 @@
         psFree((void *)statsMDC);
         fclose(statsFile);
-
-        psFree(stats);
     }
 
     psString dump_file = psMetadataLookupStr(&mdok, config->arguments, "-dumpconfig");
     if (dump_file) {
-
         pmFPAfile *input = psMetadataLookupPtr(NULL, config->files, "PPSUB.INPUT"); // Input file
         pmConfigDump(config, input->fpa, dump_file);
     }
 
+    psFree(data);
     return true;
+
+ERROR:
+    psFree(data);
+    return false;
 }
