Index: /trunk/ppImage/src/ppImage.h
===================================================================
--- /trunk/ppImage/src/ppImage.h	(revision 23824)
+++ /trunk/ppImage/src/ppImage.h	(revision 23825)
@@ -26,4 +26,6 @@
     bool doMaskBuild;                   // Build internal mask
     bool doVarianceBuild;               // Build internal variance map
+    bool doMaskSat;                     // mask saturated pixels
+    bool doMaskLow;                     // mask low pixels
     bool doMask;                        // Mask bad pixels
     bool doNonLin;                      // Non-linearity correction
@@ -62,5 +64,5 @@
     psImageMaskType markValue;          // apply this bit-mask to choose masked bits
     psImageMaskType satMask;            // Mask value to give saturated pixels
-    psImageMaskType badMask;            // Mask value to give bad pixels
+    psImageMaskType lowMask;            // Mask value to give bad pixels
     psImageMaskType flatMask;           // Mask value to give bad flat pixels
     psImageMaskType blankMask;          // Mask value to give blank pixels
Index: /trunk/ppImage/src/ppImageDetrendReadout.c
===================================================================
--- /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 23824)
+++ /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 23825)
@@ -17,5 +17,7 @@
     // Masking on the basis of pixel value needs to be done before anything else, so the values are pristine.
     if (options->doMaskBuild) {
-        pmReadoutGenerateMask(input, options->satMask, options->badMask);
+	psImageMaskType satMask = options->doMaskSat ? options->satMask : 0;
+	psImageMaskType lowMask = options->doMaskLow ? options->lowMask : 0;
+        pmReadoutGenerateMask(input, satMask, lowMask);
     }
     // apply the externally supplied mask to the input->mask pixels
@@ -74,5 +76,5 @@
 
     if (options->doRemnance) {
-        if (!pmRemnance(input, options->maskValue, options->badMask,
+        if (!pmRemnance(input, options->maskValue, options->lowMask,
                         options->remnanceSize, options->remnanceThresh)) {
             psError(PS_ERR_UNKNOWN, false, "Unable to mask remnance.");
Index: /trunk/ppImage/src/ppImageOptions.c
===================================================================
--- /trunk/ppImage/src/ppImageOptions.c	(revision 23824)
+++ /trunk/ppImage/src/ppImageOptions.c	(revision 23825)
@@ -19,5 +19,7 @@
     // actions which ppImage should perform
     options->doMaskBuild     = false;   // Build internal mask
-    options->doVarianceBuild   = false;   // Build internal variance
+    options->doMaskSat       = false;   // mask saturated pixels
+    options->doMaskLow       = false;   // mask low pixels
+    options->doVarianceBuild = false;   // Build internal variance
     options->doMask          = false;   // Mask bad pixels
     options->doNonLin        = false;   // Non-linearity correction
@@ -54,5 +56,5 @@
     options->maskValue       = 0x00;    // Default mask value (used to skip / ignore pixels)
     options->satMask         = 0x00;    // Saturated pixels (supplied to pmReadoutGenerateMask)
-    options->badMask         = 0x00;    // Bad (low) pixels (supplied to pmReadoutGenerateMask)
+    options->lowMask         = 0x00;    // out-of-bounds (low) pixels (supplied to pmReadoutGenerateMask)
     options->flatMask        = 0x00;    // Bad flat pixels (supplied to pmFlatField)
     options->blankMask       = 0x00;    // Blank (no data, cell gap) pixels (supplied to pmChipMosaic, pmFPAMosaic)
@@ -198,4 +200,6 @@
     // for these images, even if not required otherwise
     options->doMaskBuild = psMetadataLookupBool(NULL, recipe, "MASK.BUILD");
+    options->doMaskSat   = psMetadataLookupBool(NULL, recipe, "MASK.SATURATED");
+    options->doMaskLow   = psMetadataLookupBool(NULL, recipe, "MASK.LOW");
     options->doVarianceBuild = psMetadataLookupBool(NULL, recipe, "VARIANCE.BUILD");
 
Index: /trunk/ppImage/src/ppImageReplaceBackground.c
===================================================================
--- /trunk/ppImage/src/ppImageReplaceBackground.c	(revision 23824)
+++ /trunk/ppImage/src/ppImageReplaceBackground.c	(revision 23825)
@@ -147,5 +147,5 @@
             if (!isfinite(value)) {
                 image->data.F32[y][x] = NAN;
-                mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= options->badMask;
+                mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= options->lowMask;
             } else {
                 image->data.F32[y][x] -= value;
@@ -164,5 +164,5 @@
                 if (!isfinite(value)) {
                     image->data.F32[y][x] = NAN;
-                    mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= options->badMask;
+                    mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= options->lowMask;
                 } else {
                     image->data.F32[y][x] -= value;
Index: /trunk/ppImage/src/ppImageSetMaskBits.c
===================================================================
--- /trunk/ppImage/src/ppImageSetMaskBits.c	(revision 23824)
+++ /trunk/ppImage/src/ppImageSetMaskBits.c	(revision 23825)
@@ -27,10 +27,10 @@
 
     // mask for below-range data  (default to RANGE if not defined)
-    options->badMask = pmConfigMaskGet("LOW", config);
-    if (!options->badMask) {
-        // XXX look up old name for backward compatability
-        options->badMask = pmConfigMaskGet("BAD", config);
+    options->lowMask = pmConfigMaskGet("LOW", config);
+    if (!options->lowMask) {
+        // look up old name for backward compatability
+        options->lowMask = pmConfigMaskGet("BAD", config);
     }
-    psAssert (options->badMask, "low mask not set");
+    psAssert (options->lowMask, "low mask not set");
 
     // save MASK and MARK on the PSPHOT recipe
