Index: trunk/ppStack/src/ppStackMatch.c
===================================================================
--- trunk/ppStack/src/ppStackMatch.c	(revision 19123)
+++ trunk/ppStack/src/ppStackMatch.c	(revision 19172)
@@ -34,6 +34,10 @@
     int size = psMetadataLookupS32(NULL, ppsub, "KERNEL.SIZE"); // Kernel half-size
 
-    psMaskType maskIn = pmConfigMaskGet("MASK.VALUE", config); // Bits to mask going in to pmSubtractionMatch
-    psMaskType maskOut = pmConfigMaskGet("BLANK", config); // Bits to mask after pmSubtractionMatch
+    psString maskValStr = psMetadataLookupStr(NULL, recipe, "MASK.VAL"); // Name of bits to mask going in
+    psMaskType maskVal = pmConfigMaskGet(maskValStr, config); // Bits to mask going in to pmSubtractionMatch
+    psString maskPoorStr = psMetadataLookupStr(NULL, recipe, "MASK.POOR"); // Name of bits to mask for poor
+    psMaskType maskPoor = pmConfigMaskGet(maskPoorStr, config); // Bits to mask for poor pixels
+    psString maskBadStr = psMetadataLookupStr(NULL, recipe, "MASK.BAD"); // Name of bits to mask for bad
+    psMaskType maskBad = pmConfigMaskGet(maskBadStr, config); // Bits to mask for bad pixels
 
     bool mdok;                          // Status of MD lookup
@@ -45,5 +49,5 @@
     int threads = psMetadataLookupS32(NULL, config->arguments, "-threads"); // Number of threads
 
-    if (!pmReadoutMaskNonfinite(readout, maskIn)) {
+    if (!pmReadoutMaskNonfinite(readout, maskVal)) {
         psError(PS_ERR_UNKNOWN, false, "Unable to mask non-finite pixels in readout.");
         return false;
@@ -75,4 +79,5 @@
         float optThresh = psMetadataLookupF32(&mdok, ppsub, "OPTIMUM.TOL"); // Tolerance for search
         int optOrder = psMetadataLookupS32(&mdok, ppsub, "OPTIMUM.ORDER"); // Order for search
+        float poorFrac = psMetadataLookupF32(&mdok, ppsub, "POOR.FRACTION"); // Fraction for "poor"
 
         // These values are specified specifically for stacking
@@ -87,5 +92,5 @@
         {
             psStats *bg = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics for bg
-            if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskIn, rng)) {
+            if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskVal, rng)) {
                 psWarning("Can't measure background for image.");
                 psErrorClear();
@@ -136,5 +141,5 @@
                                 sources, stampsName, type, size, order, widths, orders, inner, ringsOrder,
                                 binning, penalty, optimum, optWidths, optOrder, optThresh, iter, rej,
-                                maskIn, maskOut, badFrac, PM_SUBTRACTION_MODE_1)) {
+                                maskVal, maskBad, maskPoor, poorFrac, badFrac, PM_SUBTRACTION_MODE_1)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to match images.");
             psFree(fake);
@@ -226,5 +231,5 @@
     if (renorm) {
         psLogMsg("ppStack", PS_LOG_INFO, "Renormalising variance map.");
-        if (!pmReadoutWeightRenorm(readout, maskOut, renormMean, renormStdev, renormWidth, rng)) {
+        if (!pmReadoutWeightRenorm(readout, maskBad, renormMean, renormStdev, renormWidth, rng)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to renormalise variances.");
             psFree(output);
@@ -235,5 +240,5 @@
     // Ensure the background value is zero
     psStats *bg = psStatsAlloc(PS_STAT_ROBUST_MEDIAN | PS_STAT_ROBUST_STDEV); // Statistics for background
-    if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskOut, rng)) {
+    if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskVal | maskBad, rng)) {
         psWarning("Can't measure background for image.");
         psErrorClear();
