Index: trunk/ppStack/src/ppStackLoop.c
===================================================================
--- trunk/ppStack/src/ppStackLoop.c	(revision 17625)
+++ trunk/ppStack/src/ppStackLoop.c	(revision 17626)
@@ -307,4 +307,5 @@
     psArray *subRegions = psArrayAlloc(num); // Subtraction regions --- required in the stacking
     psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS, 0); // Random number generator
+    int numGood = 0;                    // Number of good frames
     for (int i = 0; i < num; i++) {
         psTrace("ppStack", 2, "Convolving input %d of %d to target PSF....\n", i, num);
@@ -326,9 +327,7 @@
         psArray *regions = NULL, *kernels = NULL; // Regions and kernels used in subtraction
         if (!ppStackMatch(readout, &regions, &kernels, sources, targetPSF, rng, config)) {
-            psError(PS_ERR_UNKNOWN, false, "Unable to match image %d --- ignoring.", i);
-            psFree(sources);
-            psFree(targetPSF);
-            psFree(rng);
-            return false;
+            psErrorStackPrint(stderr, "Unable to match image %d --- ignoring.", i);
+            psErrorClear();
+            continue;
         }
 
@@ -345,8 +344,14 @@
         cells->data[i] = psMemIncrRefCounter(readout->parent);
         filesIterateUp(config);
+        numGood++;
     }
     psFree(sources);
     psFree(targetPSF);
     psFree(rng);
+
+    if (numGood == 0) {
+        psError(PS_ERR_UNKNOWN, false, "No good images to combine.");
+        return false;
+    }
 
 
@@ -374,4 +379,8 @@
         for (int i = 0; i < num; i++) {
             pmCell *cell = cells->data[i]; // Cell of interest
+            if (!cell) {
+                // Bad image
+                continue;
+            }
             pmReadout *ro = cell->readouts->data[0]; // Readout of interest
             if (!ro) {
@@ -387,4 +396,8 @@
         psArray *weightFits = psArrayAlloc(num);
         for (int i = 0; i < num; i++) {
+            if (!readouts->data[i]) {
+                // Bad image
+                continue;
+            }
             // Resolved names
             psString imageResolved = pmConfigConvertFilename(imageNames->data[i], config, false);
@@ -412,5 +425,8 @@
             for (int i = 0; i < num; i++) {
                 pmReadout *readout = readouts->data[i];
-                assert(readout);
+                if (!readout) {
+                    // Bad image
+                    continue;
+                }
 
                 if (!pmReadoutReadChunk(readout, imageFits->data[i], 0, numScans, overlap) ||
@@ -447,5 +463,8 @@
             for (int i = 0; i < num && more; i++) {
                 pmReadout *readout = readouts->data[i];
-                assert(readout);
+                if (!readout) {
+                    // Bad image
+                    continue;
+                }
                 more &= pmReadoutMore(readout, imageFits->data[i], 0, numScans);
                 more &= pmReadoutMoreMask(readout, maskFits->data[i], 0, numScans);
@@ -460,4 +479,9 @@
         for (int i = 0; i < num; i++) {
             pmReadout *ro = readouts->data[i]; // Readout of interest
+            if (!readout) {
+                // Bad image
+                numRejected++;
+                continue;
+            }
             psPixels *inspect = NULL;   // Inspection list for this readout
             psMetadataIterator *iter = psMetadataIteratorAlloc(ro->analysis, PS_LIST_HEAD,
@@ -575,4 +599,7 @@
         // Close up
         for (int i = 0; i < num; i++) {
+            if (!readouts->data[i]) {
+                continue;
+            }
             psFitsClose(imageFits->data[i]);
             psFitsClose(maskFits->data[i]);
