Index: /trunk/ppStack/src/ppStackMatch.c
===================================================================
--- /trunk/ppStack/src/ppStackMatch.c	(revision 15302)
+++ /trunk/ppStack/src/ppStackMatch.c	(revision 15303)
@@ -36,4 +36,5 @@
     psMaskType maskBlank = pmConfigMask(psMetadataLookupStr(NULL, recipe, "MASK.BLANK"),
                                         config); // Mask for blank reg.
+    float badFrac = psMetadataLookupF32(NULL, recipe, "BADFRAC"); // Maximum bad fraction
     bool optimum = psMetadataLookupBool(&mdok, recipe, "OPTIMUM"); // Derive optimum parameters?
     float optMin = psMetadataLookupF32(&mdok, recipe, "OPTIMUM.MIN"); // Minimum width for search
@@ -61,8 +62,10 @@
                             stampsName, target, type, size, order, widths, orders, inner, ringsOrder,
                             binning, optimum, optWidths, optOrder, optThresh, iter, rej, maskBad,
-                            maskBlank)) {
+                            maskBlank, badFrac)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to match images.");
+        psFree(optWidths);
         return false;
     }
+    psFree(optWidths);
 
     return true;
Index: /trunk/ppStack/src/ppStackReadout.c
===================================================================
--- /trunk/ppStack/src/ppStackReadout.c	(revision 15302)
+++ /trunk/ppStack/src/ppStackReadout.c	(revision 15303)
@@ -54,7 +54,4 @@
         pmReadout *ro = pmFPAviewThisReadout(view, inputFile->fpa); // Corresponding readout
 
-        psListAdd(fpaList, PS_LIST_TAIL, inputFile->fpa);
-        psListAdd(cellList, PS_LIST_TAIL, ro->parent);
-
         bool mdok;                      // Status of MD lookup
         float weighting = psMetadataLookupF32(&mdok, inputFile->fpa->analysis,
@@ -91,14 +88,9 @@
 #ifndef NO_CONVOLUTION
         if (!ppStackMatch(convolved, ro, sources, config)) {
-            psError(PS_ERR_UNKNOWN, false, "Unable to match image %d.", fileNum);
-            psFree(stats);
-            psFree(rng);
-            psFree(fileIter);
-            psFree(fpaList);
-            psFree(cellList);
-            psFree(stack);
-            psFree(outRO);
+            psWarning("Unable to match image %d --- ignoring.", fileNum);
+            psErrorClear();
             psFree(convolved);
-            return false;
+            // XXX Free the bad image so it's not taking up good memory!
+            continue;
         }
 
@@ -213,4 +205,7 @@
         }
 
+        psListAdd(fpaList, PS_LIST_TAIL, inputFile->fpa);
+        psListAdd(cellList, PS_LIST_TAIL, ro->parent);
+
         pmStackData *data = pmStackDataAlloc(convolved, weighting); // Data to stack
         psFree(convolved);
@@ -223,4 +218,13 @@
     psFree(stats);
     psFree(rng);
+
+    if (fileNum == 0) {
+        psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Not enough good files to combine.");
+        psFree(fpaList);
+        psFree(cellList);
+        psFree(stack);
+        psFree(outRO);
+        return false;
+    }
 
     if (!pmStackCombine(outRO, stack, maskBad, maskBlank, iter, combineRej)) {
@@ -240,5 +244,5 @@
     }
 
-    for (int i = 0; i < num; i++) {
+    for (int i = 0; i < stack->n; i++) {
         pmStackData *data = stack->data[i]; // Data for this image
         psImage *inspected = psPixelsToMask(NULL, data->pixels,
