Index: /branches/pap_branch_080207/ppStack/src/ppStack.h
===================================================================
--- /branches/pap_branch_080207/ppStack/src/ppStack.h	(revision 16407)
+++ /branches/pap_branch_080207/ppStack/src/ppStack.h	(revision 16408)
@@ -51,4 +51,6 @@
 /// Convolve image to match specified seeing
 bool ppStackMatch(pmReadout *readout, ///< Readout to be convolved; replaced with output
+                  psArray **regions, // Array of regions used in each PSF matching, returned
+                  psArray **kernels, // Array of kernels used in each PSF matching, returned
                   const pmReadout *sourcesRO, ///< Readout with sources
                   const pmPSF *psf,     ///< Target PSF
Index: /branches/pap_branch_080207/ppStack/src/ppStackLoop.c
===================================================================
--- /branches/pap_branch_080207/ppStack/src/ppStackLoop.c	(revision 16407)
+++ /branches/pap_branch_080207/ppStack/src/ppStackLoop.c	(revision 16408)
@@ -10,6 +10,4 @@
 
 #include "ppStack.h"
-
-#define ARRAY_BUFFER 16                 // Number to add to array at a time
 
 // Here follows lists of files for activation/deactivation at various stages.  Each must be NULL-terminated.
@@ -327,5 +325,6 @@
 #ifndef CONVOLVED_ALREADY
         // Background subtraction, scaling and normalisation is performed automatically by the image matching
-        if (!ppStackMatch(readout, sources, targetPSF, config)) {
+        psArray *regions = NULL, *kernels = NULL; // Regions and kernels used in subtraction
+        if (!ppStackMatch(readout, &regions, &kernels, sources, targetPSF, config)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to match image %d --- ignoring.", i);
             psFree(sources);
@@ -333,4 +332,7 @@
             return false;
         }
+
+        subRegions->data[i] = regions;
+        subKernels->data[i] = kernels;
 
         // Write the temporary convolved files
@@ -342,34 +344,5 @@
 #endif
 
-        // Extract the regions and solutions used in the image matching
-        // This stops them from being freed when we iterate back up the FPA
-        psArray *regions = psArrayAllocEmpty(ARRAY_BUFFER); // Array of regions
-        {
-            psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
-                                                               PM_SUBTRACTION_ANALYSIS_REGION); // Iterator
-            psMetadataItem *item = NULL;// Item from iteration
-            while ((item = psMetadataGetAndIncrement(iter))) {
-                assert(item->type == PS_DATA_REGION);
-                regions = psArrayAdd(regions, ARRAY_BUFFER, item->data.V);
-            }
-            psFree(iter);
-        }
-        psArray *kernels = psArrayAllocEmpty(ARRAY_BUFFER); // Array of kernels
-        {
-            psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
-                                                               PM_SUBTRACTION_ANALYSIS_KERNEL); // Iterator
-            psMetadataItem *item = NULL;// Item from iteration
-            while ((item = psMetadataGetAndIncrement(iter))) {
-                assert(item->type == PS_DATA_VECTOR);
-                kernels = psArrayAdd(kernels, ARRAY_BUFFER, item->data.V);
-            }
-            psFree(iter);
-        }
-        assert(regions->n == kernels->n);
-
-        subRegions->data[i] = regions;
-        subKernels->data[i] = kernels;
         cells->data[i] = psMemIncrRefCounter(readout->parent);
-
         filesIterateUp(config);
     }
Index: /branches/pap_branch_080207/ppStack/src/ppStackMatch.c
===================================================================
--- /branches/pap_branch_080207/ppStack/src/ppStackMatch.c	(revision 16407)
+++ /branches/pap_branch_080207/ppStack/src/ppStackMatch.c	(revision 16408)
@@ -9,8 +9,19 @@
 #include "ppStack.h"
 
+#define ARRAY_BUFFER 16                 // Number to add to array at a time
+
+
 //#define TESTING
 
-bool ppStackMatch(pmReadout *readout, const pmReadout *sourcesRO, const pmPSF *psf, const pmConfig *config)
+bool ppStackMatch(pmReadout *readout, psArray **regions, psArray **kernels,
+                  const pmReadout *sourcesRO, const pmPSF *psf, const pmConfig *config)
 {
+    assert(readout);
+    assert(regions && !*regions);
+    assert(kernels && !*kernels);
+    assert(sourcesRO);
+    assert(psf);
+    assert(config);
+
     // Look up appropriate values from the ppSub recipe
     bool mdok;                          // Status of MD lookup
@@ -105,4 +116,32 @@
     readout->mask   = psMemIncrRefCounter(output->mask);
     readout->weight = psMemIncrRefCounter(output->weight);
+
+    // Extract the regions and solutions used in the image matching
+    // This stops them from being freed when we iterate back up the FPA
+    *regions = psArrayAllocEmpty(ARRAY_BUFFER); // Array of regions
+    {
+        psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
+                                                           PM_SUBTRACTION_ANALYSIS_REGION); // Iterator
+        psMetadataItem *item = NULL;// Item from iteration
+        while ((item = psMetadataGetAndIncrement(iter))) {
+            assert(item->type == PS_DATA_REGION);
+            *regions = psArrayAdd(*regions, ARRAY_BUFFER, item->data.V);
+        }
+        psFree(iter);
+    }
+    *kernels = psArrayAllocEmpty(ARRAY_BUFFER); // Array of kernels
+    {
+        psMetadataIterator *iter = psMetadataIteratorAlloc(readout->analysis, PS_LIST_HEAD,
+                                                           PM_SUBTRACTION_ANALYSIS_KERNEL); // Iterator
+        psMetadataItem *item = NULL;// Item from iteration
+        while ((item = psMetadataGetAndIncrement(iter))) {
+            assert(item->type == PS_DATA_VECTOR);
+            *kernels = psArrayAdd(*kernels, ARRAY_BUFFER, item->data.V);
+        }
+        psFree(iter);
+    }
+    assert((*regions)->n == (*kernels)->n);
+
+
     psFree(output);
 
