Index: trunk/ppBackground/src/ppBackground.h
===================================================================
--- trunk/ppBackground/src/ppBackground.h	(revision 34813)
+++ trunk/ppBackground/src/ppBackground.h	(revision 35118)
@@ -13,5 +13,8 @@
     psString patternName;               // Filename of pattern
     psString backgroundName;            // Filename of background
-    psString imageName, maskName;       // Filenames of input image/mask
+    psString imageName;                 // Filenames of input image
+    psString maskName;                  // Filenames of input mask
+    psString varianceName;              // Filenames of input variance
+    psString auxMaskName;               // Filename of auxillary mask
     psString outRoot;                   // Output root name
     psMetadata *stats;                  // Statistics for output
@@ -52,5 +55,6 @@
     const pmChip *pattern,              // Chip with pattern
     const pmFPAview *view,              // View to data
-    pmConfig *config                    // Configuration
+    pmConfig *config,                   // Configuration
+    psImageMaskType maskBad             // value to use for bad pixels
     );
 
Index: trunk/ppBackground/src/ppBackgroundArguments.c
===================================================================
--- trunk/ppBackground/src/ppBackgroundArguments.c	(revision 34813)
+++ trunk/ppBackground/src/ppBackgroundArguments.c	(revision 35118)
@@ -49,4 +49,6 @@
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-image", 0, "Filename of image (required)", NULL);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-mask", 0, "Filename of mask", NULL);
+    psMetadataAddStr(arguments, PS_LIST_TAIL, "-variance", 0, "Filename of variance image", NULL);
+    psMetadataAddStr(arguments, PS_LIST_TAIL, "-auxmask", 0, "Filename of auxiliary mask", NULL);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-stats", 0, "Output statistics file", NULL);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-dumpconfig", 0, "Output configuration file", NULL);
@@ -59,4 +61,6 @@
     data->imageName = psMemIncrRefCounter(psMetadataLookupStr(NULL, arguments, "-image"));
     data->maskName = psMemIncrRefCounter(psMetadataLookupStr(NULL, arguments, "-mask"));
+    data->varianceName = psMemIncrRefCounter(psMetadataLookupStr(NULL, arguments, "-variance"));
+    data->auxMaskName = psMemIncrRefCounter(psMetadataLookupStr(NULL, arguments, "-auxmask"));
     data->outRoot = psStringCopy(argv[1]);
     psMetadataAddStr(arguments, PS_LIST_TAIL, "OUTPUT", 0, "Output root name", data->outRoot);
@@ -64,6 +68,6 @@
     psTrace("ppBackground", 1, "Done reading command-line arguments\n");
 
-    if (!data->patternName && !data->backgroundName) {
-        psError(PPBACKGROUND_ERR_CONFIG, true, "Must specify at least one of -pattern and -background");
+    if (!data->patternName && !data->backgroundName && !data->auxMaskName) {
+        psError(PPBACKGROUND_ERR_CONFIG, true, "Must specify at least one of -pattern and -background -auxmask");
         return false;
     }
Index: trunk/ppBackground/src/ppBackgroundCamera.c
===================================================================
--- trunk/ppBackground/src/ppBackgroundCamera.c	(revision 34813)
+++ trunk/ppBackground/src/ppBackgroundCamera.c	(revision 35118)
@@ -65,4 +65,20 @@
     }
 
+    fileArguments("VARIANCE", data->varianceName, "Input uncorrected variance", data->config);
+    pmFPAfileBindFromArgs(&status, image, data->config, "PPBACKGROUND.VARIANCE", "VARIANCE"); // File
+    if (!status) {
+        psError(psErrorCodeLast(), false, "Failed to build file from PPBACKGROUND.VARIANCE");
+        return false;
+    }
+
+    if (data->auxMaskName) {
+        fileArguments("AUXMASK", data->auxMaskName, "Auxiliary mask", data->config);
+        pmFPAfileBindFromArgs(&status, image, data->config, "PPBACKGROUND.AUXMASK", "AUXMASK"); // File
+        if (!status) {
+            psError(psErrorCodeLast(), false, "Failed to build file from PPBACKGROUND.MASK");
+            return false;
+        }
+    }
+
     pmFPAfile *output = pmFPAfileDefineOutput(data->config, image->fpa, "PPBACKGROUND.OUTPUT");
     if (!output) {
@@ -79,4 +95,11 @@
     outMask->save = true;
 
+    pmFPAfile *outVariance = pmFPAfileDefineOutput(data->config, output->fpa, "PPBACKGROUND.OUTPUT.VARIANCE");
+    if (!outVariance) {
+        psError(psErrorCodeLast(), false, "Unable to define output.");
+        return false;
+    }
+    outVariance->save = true;
+
 #if 0
     // Now the camera has been determined, we can read the recipe
Index: trunk/ppBackground/src/ppBackgroundData.c
===================================================================
--- trunk/ppBackground/src/ppBackgroundData.c	(revision 34813)
+++ trunk/ppBackground/src/ppBackgroundData.c	(revision 35118)
@@ -17,4 +17,6 @@
     psFree(data->imageName);
     psFree(data->maskName);
+    psFree(data->varianceName);
+    psFree(data->auxMaskName);
     psFree(data->outRoot);
     psFree(data->stats);
@@ -33,4 +35,6 @@
     data->imageName = NULL;
     data->maskName = NULL;
+    data->varianceName = NULL;
+    data->auxMaskName = NULL;
     data->outRoot = NULL;
     data->stats = NULL;
Index: trunk/ppBackground/src/ppBackgroundLoop.c
===================================================================
--- trunk/ppBackground/src/ppBackgroundLoop.c	(revision 34813)
+++ trunk/ppBackground/src/ppBackgroundLoop.c	(revision 35118)
@@ -135,5 +135,5 @@
         pmChip *patternChip = patternFile ? pmFPAviewThisChip(view, patternMosaic) : NULL; // Chip with pattern
         pmChip *bgChip = bgFile ? pmFPAviewThisChip(view, bgFile->fpa) : NULL; // Chip with background model
-        if (!ppBackgroundRestore(chip, bgChip, patternChip, view, config)) {
+        if (!ppBackgroundRestore(chip, bgChip, patternChip, view, config, maskBad)) {
             psError(psErrorCodeLast(), false, "Unable to replace background");
             return false;
Index: trunk/ppBackground/src/ppBackgroundRestore.c
===================================================================
--- trunk/ppBackground/src/ppBackgroundRestore.c	(revision 34813)
+++ trunk/ppBackground/src/ppBackgroundRestore.c	(revision 35118)
@@ -35,5 +35,5 @@
 
 bool ppBackgroundRestore(pmChip *chip, const pmChip *background, const pmChip *pattern,
-                         const pmFPAview *oldView, pmConfig *config)
+                         const pmFPAview *oldView, pmConfig *config, psImageMaskType maskBad)
 {
     PS_ASSERT_PTR_NON_NULL(chip, false);
@@ -120,4 +120,23 @@
     }
 
+    psImage *auxMask = psMetadataLookupPtr(NULL, ro->analysis, "EXPNUM");
+    if (auxMask) {
+        if (auxMask->numCols != mask->numCols || auxMask->numRows != mask->numRows) {
+            psError(PPBACKGROUND_ERR_DATA, true, "auxiliary mask size (%d x %d) does not match input size (%d x %d)",
+                auxMask->numCols, auxMask->numRows, numCols, numRows);
+            return false;
+        }
+        // Arno's masks are floating point, fix later and zero means bad
+        #define AUXMASK_DATA F32
+        for (int y = 0; y < numRows; y++) {
+            for (int x = 0; x < numCols; x++) {
+                if (auxMask->data.AUXMASK_DATA[y][x] == 0) {
+                    mask->data.PS_TYPE_IMAGE_MASK_DATA[y][x] |= maskBad;
+                }
+            }
+        }
+    }
+
+
     ro->data_exists = true;
     ro->parent->data_exists = true;
