Index: trunk/ppStack/src/ppStackLoop.c
===================================================================
--- trunk/ppStack/src/ppStackLoop.c	(revision 16686)
+++ trunk/ppStack/src/ppStackLoop.c	(revision 16693)
@@ -413,5 +413,5 @@
 #endif
 
-            if (!ppStackReadout(config, outRO, readouts, subRegions, subKernels)) {
+            if (!ppStackReadoutInitial(config, outRO, readouts, subRegions, subKernels)) {
                 psError(PS_ERR_UNKNOWN, false, "Unable to stack images.\n");
                 psFree(readouts);
@@ -432,7 +432,76 @@
         }
 
-        psFree(readouts);
+        // Reset for the second read
+        // Extract the rejection lists
         psFree(subKernels);
         psFree(subRegions);
+        psArray *rejected = psArrayAlloc(num); // Rejected pixels
+        for (int i = 0; i < num; i++) {
+            pmReadout *ro = readouts->data[i]; // Readout of interest
+            pmReadoutFreeData(ro);
+
+            psPixels *rejects = NULL;   // Rejection list for this readout
+            psMetadataIterator *iter = psMetadataIteratorAlloc(ro->analysis, PS_LIST_HEAD,
+                                                               "^" PPSTACK_REJECTED_PIXELS "$"); // Iterator
+            psMetadataItem *item;
+            while ((item = psMetadataGetAndIncrement(iter))) {
+                psPixels *pixels = item->data.V; // Rejected pixels
+                psTrace("ppStack", 5, "Adding %ld rejected pixels to image %d", pixels->n, i);
+                rejects = psPixelsConcatenate(rejects, pixels);
+            }
+            psFree(iter);
+            psTrace("ppStack", 5, "%ld rejected pixels rejected from image %d", rejects->n, i);
+            psMetadataRemoveKey(ro->analysis, PPSTACK_REJECTED_PIXELS);
+            rejected->data[i] = rejects;
+        }
+
+
+        // Read convolutions by chunks
+        more = true;
+        for (int numChunk = 0; more; numChunk++) {
+            for (int i = 0; i < num; i++) {
+                pmReadout *readout = readouts->data[i];
+                assert(readout);
+
+                if (!pmReadoutReadChunk(readout, imageFits->data[i], 0, numScans, 0) ||
+                    !pmReadoutReadChunkMask(readout, maskFits->data[i], 0, numScans, 0) ||
+                    !pmReadoutReadChunkWeight(readout, weightFits->data[i], 0, numScans, 0)) {
+                    psError(PS_ERR_IO, false, "Unable to read chunk %d for file %d", numChunk, i);
+                    psFree(readouts);
+                    psFree(rejected);
+                    psFree(outRO);
+                    psFree(view);
+                    return false;
+                }
+            }
+
+#ifdef TESTING
+            {
+                pmReadout *ro = readouts->data[0];
+                psTrace("ppStack", 1, "Stack: [%d:%d,%d:%d]\n", ro->col0, ro->col0 + ro->image->numCols,
+                        ro->row0, ro->row0 + ro->image->numRows);
+            }
+#endif
+
+            if (!ppStackReadoutFinal(config, outRO, readouts, rejected)) {
+                psError(PS_ERR_UNKNOWN, false, "Unable to stack images.\n");
+                psFree(readouts);
+                psFree(rejected);
+                psFree(outRO);
+                psFree(view);
+                return false;
+            }
+
+            for (int i = 0; i < num && more; i++) {
+                pmReadout *readout = readouts->data[i];
+                assert(readout);
+                more &= pmReadoutMore(readout, imageFits->data[i], 0, numScans);
+                more &= pmReadoutMoreMask(readout, maskFits->data[i], 0, numScans);
+                more &= pmReadoutMoreWeight(readout, weightFits->data[i], 0, numScans);
+            }
+        }
+
+        psFree(readouts);
+
         for (int i = 0; i < num; i++) {
             psFitsClose(imageFits->data[i]);
