Index: trunk/ppStack/src/ppStackLoop.c
===================================================================
--- trunk/ppStack/src/ppStackLoop.c	(revision 19475)
+++ trunk/ppStack/src/ppStackLoop.c	(revision 19476)
@@ -466,8 +466,4 @@
 #endif
 
-    ppStackThreadInit();
-    ppStackThreadData *stack = ppStackThreadDataSetup(cells, imageNames, maskNames, weightNames,
-                                                      config); // Data for stacking
-    psFree(cells);
 
     memDump("preinitial");
@@ -478,4 +474,6 @@
     pmFPAview *view = NULL;             // View to readout
     psArray *inspect = NULL;            // Array of arrays of pixels to inspect
+    ppStackThreadData *stack = NULL;    // Data for stacking
+    psVector *exptimes = psVectorAlloc(num, PS_TYPE_F32); // Exposure times for each input
     {
         int row0, col0;                 // Offset for readout
@@ -488,4 +486,5 @@
             psFree(stack);
             psFree(inputMask);
+            psFree(exptimes);
             return false;
         }
@@ -499,4 +498,5 @@
             psFree(stack);
             psFree(inputMask);
+            psFree(exptimes);
             return false;
         }
@@ -515,6 +515,29 @@
             psFree(view);
             psFree(outRO);
-            return false;
-        }
+            psFree(exptimes);
+            return false;
+        }
+
+        psList *fpaList = psListAlloc(NULL); // List of input FPAs, for concept averaging
+        psList *cellList = psListAlloc(NULL); // List of input cells, for concept averaging
+        for (int i = 0; i < num; i++) {
+            pmCell *inCell = cells->data[i]; // Input cell
+            exptimes->data.F32[i] = psMetadataLookupF32(NULL, inCell->concepts, "CELL.EXPOSURE");
+            psListAdd(cellList, PS_LIST_TAIL, inCell);
+            psListAdd(fpaList, PS_LIST_TAIL, inCell->parent->parent);
+        }
+
+        // Copy concepts
+        pmChip *outChip = outCell->parent;  // Output chip
+        pmFPA *outFPA = outChip->parent;    // Output FPA
+        pmConceptsAverageFPAs(outFPA, fpaList);
+        pmConceptsAverageCells(outCell, cellList, NULL, NULL, true);
+        psFree(fpaList);
+        psFree(cellList);
+
+        // Start threading
+        ppStackThreadInit();
+        ppStackThreadData *stack = ppStackThreadDataSetup(cells, imageNames, maskNames, weightNames, config);
+        psFree(cells);
 
         bool status;                    // Status of read
@@ -531,4 +554,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(exptimes);
                 return false;
             }
@@ -553,4 +577,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(exptimes);
                 return false;
             }
@@ -566,4 +591,5 @@
             psFree(view);
             psFree(outRO);
+            psFree(exptimes);
             return false;
         }
@@ -622,4 +648,5 @@
                 psFree(inspect);
                 psFree(rejected);
+                psFree(exptimes);
                 return false;
             }
@@ -637,4 +664,5 @@
             psFree(inspect);
             psFree(rejected);
+            psFree(exptimes);
             return false;
         }
@@ -714,4 +742,5 @@
             psFree(view);
             psFree(outRO);
+            psFree(exptimes);
             return false;
         }
@@ -735,4 +764,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(exptimes);
                 return false;
             }
@@ -755,4 +785,5 @@
                 psFree(view);
                 psFree(outRO);
+                psFree(exptimes);
                 return false;
             }
@@ -767,4 +798,5 @@
             psFree(view);
             psFree(outRO);
+            psFree(exptimes);
             return false;
         }
@@ -788,6 +820,4 @@
     // Close up
     bool wcsDone = false;           // Have we done the WCS?
-    psList *fpaList = psListAlloc(NULL); // List of input FPAs, for concept averaging
-    psList *cellList = psListAlloc(NULL); // List of input cells, for concept averaging
     float totExposure = 0.0;            // Total exposure time
     for (int i = 0; i < num; i++) {
@@ -795,20 +825,9 @@
             continue;
         }
+        totExposure += exptimes->data.F32[i];
+
         ppStackThread *thread = stack->threads->data[0]; // Representative stack
         pmReadout *inRO = thread->readouts->data[i]; // Template readout
-        if (!inRO) {
-            continue;
-        }
-        float exposure = psMetadataLookupF32(NULL, inRO->parent->concepts, "CELL.EXPOSURE"); // Exposure time
-        if (!isfinite(exposure)) {
-            psWarning("CELL.EXPOSURE not set for readout %d", i);
-        } else {
-            totExposure += exposure;
-        }
-
-        psListAdd(cellList, PS_LIST_TAIL, inRO->parent);
-        psListAdd(fpaList, PS_LIST_TAIL, inRO->parent->parent->parent);
-
-        if (!wcsDone) {
+        if (inRO && !wcsDone) {
             // Copy astrometry over
             wcsDone = true;
@@ -856,18 +875,5 @@
     psFree(weightNames);
 
-    // Copy concepts
-    pmCell *outCell = outRO->parent;    // Output cell
-    pmChip *outChip = outCell->parent;  // Output chip
-    pmFPA *outFPA = outChip->parent;    // Output FPA
-    psMetadataAddF32(outCell->concepts, PS_LIST_TAIL, "CELL.EXPOSURE", PS_META_REPLACE,
-                     "Summed exposure time (sec)", totExposure);
-    psMetadataAddF32(outFPA->concepts, PS_LIST_TAIL, "FPA.EXPOSURE", PS_META_REPLACE,
-                     "Summed exposure time (sec)", totExposure);
-
-    pmConceptsAverageFPAs(outFPA, fpaList);
-    pmConceptsAverageCells(outCell, cellList, NULL, NULL, true);
-    psFree(fpaList);
-    psFree(cellList);
-
+    psFree(exptimes);
     psFree(inputMask);
     psFree(stack);
