Index: trunk/ppStack/src/ppStackCleanup.c
===================================================================
--- trunk/ppStack/src/ppStackCleanup.c	(revision 27342)
+++ trunk/ppStack/src/ppStackCleanup.c	(revision 27343)
@@ -71,4 +71,43 @@
     }
 
+    if (!ppStackFilesIterateUp(config)) {
+        psError(psErrorCodeLast(), false, "Unable to close files.");
+        return false;
+    }
+    ppStackFileActivation(config, PPSTACK_FILES_STACK, false);
+    ppStackFileActivation(config, PPSTACK_FILES_PHOT, false);
+
+    // Ensure files are freed
+    {
+        options->outRO->data_exists = false;
+        options->outRO->parent->data_exists = false;
+        options->outRO->parent->parent->data_exists = false;
+        psFree(options->outRO);
+        options->outRO = NULL;
+
+        pmFPAview *view = pmFPAviewAlloc(0);// Pointer into FPA hierarchy
+        view->chip = view->cell = 0;        // pmFPAviewFreeData doesn't want to deal with readouts
+        pmFPAfile *jpeg1 = pmFPAfileSelectSingle(config->files, "PPSTACK.OUTPUT.JPEG1", 0); // JPEG file
+        pmFPAviewFreeData(view, jpeg1);
+        pmFPAfile *jpeg2 = pmFPAfileSelectSingle(config->files, "PPSTACK.OUTPUT.JPEG2", 0); // JPEG file
+        pmFPAviewFreeData(view, jpeg2);
+        pmFPAfile *phot = NULL;         // Photometry file
+        if (options->photometry) {
+            phot = pmFPAfileSelectSingle(config->files, "PSPHOT.INPUT", 0); // Photometry file
+            pmFPAviewFreeData(view, phot);
+        }
+
+        view->readout = 0;
+        pmReadout *ro1 = pmFPAviewThisReadout(view, jpeg1->fpa); // JPEG readout
+        ro1->data_exists = ro1->parent->data_exists = ro1->parent->parent->data_exists = false;
+        pmReadout *ro2 = pmFPAviewThisReadout(view, jpeg2->fpa); // JPEG readout
+        ro2->data_exists = ro2->parent->data_exists = ro2->parent->parent->data_exists = false;
+        if (options->photometry) {
+            pmReadout *ro = pmFPAviewThisReadout(view, phot->fpa); // Photometry readout
+            ro->data_exists = ro->parent->data_exists = ro->parent->parent->data_exists = false;
+        }
+        psFree(view);
+    }
+
     return true;
 }
Index: trunk/ppStack/src/ppStackLoop.c
===================================================================
--- trunk/ppStack/src/ppStackLoop.c	(revision 27342)
+++ trunk/ppStack/src/ppStackLoop.c	(revision 27343)
@@ -128,4 +128,9 @@
     psLogMsg("ppStack", PS_LOG_INFO, "Stage 3: Make Initial Stack: %f sec", psTimerClear("PPSTACK_STEPS"));
 
+    // Done with stack inputs for now
+    for (int i = 0; i < options->num; i++) {
+        pmCellFreeData(options->cells->data[i]);
+    }
+    psFree(stack);
 
     // Pixel rejection
@@ -147,4 +152,10 @@
     }
 
+    stack = ppStackThreadDataSetup(options, config, true);
+    if (!stack) {
+        psError(psErrorCodeLast(), false, "Unable to initialise stack threads.");
+        return false;
+    }
+
     // Final combination
     psTrace("ppStack", 2, "Final stack of convolved images....\n");
@@ -158,4 +169,13 @@
     ppStackMemDump("final");
 
+    // Photometry
+    psTrace("ppStack", 1, "Photometering stacked image....\n");
+    if (!ppStackPhotometry(options, config)) {
+        psError(psErrorCodeLast(), false, "Unable to perform photometry.");
+        return false;
+    }
+    psLogMsg("ppStack", PS_LOG_INFO, "Stage 6: Photometry Analysis: %f sec", psTimerClear("PPSTACK_STEPS"));
+    ppStackMemDump("photometry");
+
     // Clean up
     psTrace("ppStack", 2, "Cleaning up after combination....\n");
@@ -165,30 +185,10 @@
         return false;
     }
-
-    // Photometry
-    psTrace("ppStack", 1, "Photometering stacked image....\n");
-    if (!ppStackPhotometry(options, config)) {
-        psError(psErrorCodeLast(), false, "Unable to perform photometry.");
-        return false;
-    }
-    psLogMsg("ppStack", PS_LOG_INFO, "Stage 6: Photometry Analysis: %f sec", psTimerClear("PPSTACK_STEPS"));
-    ppStackMemDump("photometry");
-
-    if (!ppStackFilesIterateUp(config)) {
-        psError(psErrorCodeLast(), false, "Unable to close files.");
-        return false;
-    }
-    ppStackFileActivation(config, PPSTACK_FILES_STACK, false);
-    ppStackFileActivation(config, PPSTACK_FILES_PHOT, false);
-    options->outRO->data_exists = false;
-    options->outRO->parent->data_exists = false;
-    options->outRO->parent->parent->data_exists = false;
-    psFree(options->outRO);
-    options->outRO = NULL;
-
+    for (int i = 0; i < options->num; i++) {
+        pmCellFreeData(options->cells->data[i]);
+    }
+    psFree(stack);
     psLogMsg("ppStack", PS_LOG_INFO, "Stage 7: Cleanup, WCS & JPEGS: %f sec", psTimerClear("PPSTACK_STEPS"));
     ppStackMemDump("cleanup");
-
-    psFree(stack);
 
 #if 1
@@ -232,4 +232,7 @@
         options->unconvRO = NULL;
 
+        for (int i = 0; i < options->num; i++) {
+            pmCellFreeData(options->cells->data[i]);
+        }
         psFree(stack);
     }
Index: trunk/ppStack/src/ppStackPhotometry.c
===================================================================
--- trunk/ppStack/src/ppStackPhotometry.c	(revision 27342)
+++ trunk/ppStack/src/ppStackPhotometry.c	(revision 27343)
@@ -98,4 +98,5 @@
         psMetadataAddF32(options->stats, PS_LIST_TAIL, "TIME_PHOT", 0, "Time to do photometry", psTimerMark("PPSTACK_PHOT"));
     }
+
     psFree(photView);
 
