Index: /trunk/ppImage/src/ppImageArguments.c
===================================================================
--- /trunk/ppImage/src/ppImageArguments.c	(revision 9341)
+++ /trunk/ppImage/src/ppImageArguments.c	(revision 9342)
@@ -57,4 +57,5 @@
     pmConfigFileSetsMD (config->arguments, config, "BIAS", "-bias", "-biaslist");
     pmConfigFileSetsMD (config->arguments, config, "DARK", "-dark", "-darklist");
+    pmConfigFileSetsMD (config->arguments, config, "SHUTTER", "-shutter", "-shutterlist");
     pmConfigFileSetsMD (config->arguments, config, "FLAT", "-flat", "-flatlist");
     pmConfigFileSetsMD (config->arguments, config, "MASK", "-mask", "-masklist");
Index: /trunk/ppImage/src/ppImageDetrendReadout.c
===================================================================
--- /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 9341)
+++ /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 9342)
@@ -49,4 +49,12 @@
     }
 
+    // Shutter correction
+    if (options->doShutter) {
+        pmReadout *shutter = pmFPAfileThisReadout(config->files, detview, "PPIMAGE.SHUTTER");
+        if (!pmShutterCorrectionApply(input, shutter)) {
+            return false;
+        }
+    }
+
     // Flat-field correction (no options used?)
     if (options->doFlat) {
Index: /trunk/ppImage/src/ppImageOptions.c
===================================================================
--- /trunk/ppImage/src/ppImageOptions.c	(revision 9341)
+++ /trunk/ppImage/src/ppImageOptions.c	(revision 9342)
@@ -23,33 +23,34 @@
 
     // default flags for various activities
-    options->doMask   	= false;	// Mask bad pixels
+    options->doMask     = false;        // Mask bad pixels
     options->maskValue  = 0xff;         // Default mask value
 
-    options->doNonLin 	= false;	// Non-linearity correction
-    options->doBias   	= false;	// Bias subtraction
-    options->doDark     = false;	// Dark subtraction
+    options->doNonLin   = false;        // Non-linearity correction
+    options->doBias     = false;        // Bias subtraction
+    options->doDark     = false;        // Dark subtraction
     options->doOverscan = false;        // Overscan subtraction
-    options->doFlat   	= false;	// Flat-field normalisation
-    options->doFringe 	= false;	// Fringe subtraction
-    options->doPhotom 	= false;	// Source identification and photometry
-    options->doAstromChip = false;	// Astrometry
-    options->doAstromMosaic = false;	// Astrometry
-
-    options->BaseFITS 	= false;	// create binned image (scale 1)
-    options->ChipFITS 	= false;	// create binned image (scale 1)
-    options->FPA1FITS 	= false;	// create binned image (scale 1)
-    options->FPA2FITS 	= false;	// create binned image (scale 1)
-
-    options->Bin1FITS 	= false;	// create binned image (scale 1)
-    options->Bin2FITS 	= false;	// create binned image (scale 2)
-    options->Bin1JPEG 	= false;	// create jpeg of binned image (scale 1)
-    options->Bin2JPEG 	= false;	// create jpeg of binned image (scale 2)
+    options->doShutter  = false;        // Shutter correction
+    options->doFlat     = false;        // Flat-field normalisation
+    options->doFringe   = false;        // Fringe subtraction
+    options->doPhotom   = false;        // Source identification and photometry
+    options->doAstromChip = false;      // Astrometry
+    options->doAstromMosaic = false;    // Astrometry
+
+    options->BaseFITS   = false;        // create binned image (scale 1)
+    options->ChipFITS   = false;        // create binned image (scale 1)
+    options->FPA1FITS   = false;        // create binned image (scale 1)
+    options->FPA2FITS   = false;        // create binned image (scale 1)
+
+    options->Bin1FITS   = false;        // create binned image (scale 1)
+    options->Bin2FITS   = false;        // create binned image (scale 2)
+    options->Bin1JPEG   = false;        // create jpeg of binned image (scale 1)
+    options->Bin2JPEG   = false;        // create jpeg of binned image (scale 2)
 
     // Overscan defaults
-    options->overscan      = NULL;	// Overscan options
+    options->overscan      = NULL;      // Overscan options
 
     // Non-linearity default options
     options->nonLinearType   = 0;       // Type of non-linearity data (vector, string or metadata)
-    options->nonLinearData   = NULL;	// The non-linearity data
+    options->nonLinearData   = NULL;    // The non-linearity data
     options->nonLinearSource = NULL;    // If the non-linearity data is a menu, this provides the key
 
@@ -119,6 +120,6 @@
 
         // How do we fit it?
-	pmFit overscanFit = PM_FIT_NONE; // Fit type for overscan
-	int overscanOrder = 0;		// Order for overscan fit
+        pmFit overscanFit = PM_FIT_NONE; // Fit type for overscan
+        int overscanOrder = 0;          // Order for overscan fit
         psString fit = psMetadataLookupStr(NULL, recipe, "OVERSCAN.FIT");
         if (! strcasecmp(fit, "POLYNOMIAL")) {
@@ -132,9 +133,9 @@
         } else if (strcasecmp(fit, "NONE")) {
             psLogMsg(__func__, PS_LOG_WARN, "OVERSCAN.FIT (%s) in recipe %s is not one of NONE, POLYNOMIAL, or SPLINE", fit, RECIPE_NAME);
-	    exit(EXIT_FAILURE);
-        }
-
-	// What method do we use to measure the overscan statistics?
-	psStats *overscanStats = NULL;	// Statistics for overscan
+            exit(EXIT_FAILURE);
+        }
+
+        // What method do we use to measure the overscan statistics?
+        psStats *overscanStats = NULL;  // Statistics for overscan
         psString stat = psMetadataLookupStr(NULL, recipe, "OVERSCAN.STAT");
         if (! strcasecmp(stat, "MEAN")) {
@@ -144,5 +145,5 @@
         } else {
             psErrorStackPrint(stderr, "OVERSCAN.STAT (%s) in recipe %s is not one of MEAN or MEDIAN", stat, RECIPE_NAME);
-	    exit(EXIT_FAILURE);
+            exit(EXIT_FAILURE);
         }
 
@@ -156,5 +157,5 @@
     psMaskType maskValue = psMetadataLookupU8(&status, recipe, "MASK.VALUE");
     if (status) {
-	options->maskValue = maskValue;
+        options->maskValue = maskValue;
     }
 
@@ -162,14 +163,15 @@
     options->doDark = psMetadataLookupBool(NULL, recipe, "DARK");
     options->doFlat = psMetadataLookupBool(NULL, recipe, "FLAT");
+    options->doShutter = psMetadataLookupBool(NULL, recipe, "SHUTTER");
 
     // binned image options
-    options->xBin1 = psMetadataLookupS32(&status, recipe, "BIN1.XBIN"); 
+    options->xBin1 = psMetadataLookupS32(&status, recipe, "BIN1.XBIN");
     if (!status) options->xBin1 = 16;
-    options->yBin1 = psMetadataLookupS32(&status, recipe, "BIN1.YBIN"); 
+    options->yBin1 = psMetadataLookupS32(&status, recipe, "BIN1.YBIN");
     if (!status) options->yBin1 = 16;
 
-    options->xBin2 = psMetadataLookupS32(&status, recipe, "BIN2.XBIN"); 
+    options->xBin2 = psMetadataLookupS32(&status, recipe, "BIN2.XBIN");
     if (!status) options->xBin1 = 16;
-    options->yBin2 = psMetadataLookupS32(&status, recipe, "BIN2.YBIN"); 
+    options->yBin2 = psMetadataLookupS32(&status, recipe, "BIN2.YBIN");
     if (!status) options->yBin1 = 16;
 
@@ -183,17 +185,17 @@
     options->Bin2FITS = psMetadataLookupBool(NULL, recipe, "BIN2.FITS");
     options->Bin2JPEG = psMetadataLookupBool(NULL, recipe, "BIN2.JPEG");
-    
+
     options->doPhotom = psMetadataLookupBool(NULL, recipe, "PHOTOM");
     options->doAstromChip = psMetadataLookupBool(NULL, recipe, "ASTROM.CHIP");
     options->doAstromMosaic = psMetadataLookupBool(NULL, recipe, "ASTROM.MOSAIC");
     if ((options->doAstromChip || options->doAstromMosaic) && !options->doPhotom) {
-	psLogMsg(__func__, PS_LOG_ERROR, "Invalid Phase2 Options: cannot do ASTROMetry without PHOTOMetry");
-	exit(EXIT_FAILURE);
+        psLogMsg(__func__, PS_LOG_ERROR, "Invalid Phase2 Options: cannot do ASTROMetry without PHOTOMetry");
+        exit(EXIT_FAILURE);
     }
 
     options->doAddstar = psMetadataLookupBool(NULL, recipe, "ADDSTAR");
     if (options->doAddstar && !(options->doAstromChip || options->doAstromMosaic)) {
-	psLogMsg(__func__, PS_LOG_ERROR, "Invalid Phase2 Options: cannot Addstar without Astrometry");
-	exit(EXIT_FAILURE);
+        psLogMsg(__func__, PS_LOG_ERROR, "Invalid Phase2 Options: cannot Addstar without Astrometry");
+        exit(EXIT_FAILURE);
     }
 
Index: /trunk/ppImage/src/ppImageOptions.h
===================================================================
--- /trunk/ppImage/src/ppImageOptions.h	(revision 9341)
+++ /trunk/ppImage/src/ppImageOptions.h	(revision 9342)
@@ -9,4 +9,5 @@
     bool doBias;                        // Bias subtraction
     bool doDark;                        // Dark subtraction
+    bool doShutter;                     // Shutter correction
     bool doFlat;                        // Flat-field normalisation
     bool doFringe;                      // Fringe subtraction
@@ -14,5 +15,5 @@
     bool doAstromChip;                  // per-chip Astrometry
     bool doAstromMosaic;                // full-mosaic Astrometry
-    bool doAddstar;			// add results to object database?
+    bool doAddstar;                     // add results to object database?
 
     bool doOverscan;                    // Overscan subtraction
Index: /trunk/ppImage/src/ppImageParseCamera.c
===================================================================
--- /trunk/ppImage/src/ppImageParseCamera.c	(revision 9341)
+++ /trunk/ppImage/src/ppImageParseCamera.c	(revision 9342)
@@ -48,4 +48,11 @@
         pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.MASK", input->fpa, PM_DETREND_TYPE_MASK);
         if (!status) psAbort ("ppImageParseDetrend", "can't find a mask image source");
+    }
+    if (options->doShutter) {
+        bool status = false;
+        pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.SHUTTER", "SHUTTER");
+        pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.SHUTTER");
+        pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.SHUTTER", input->fpa, PM_DETREND_TYPE_FLAT);
+        if (!status) psAbort ("ppImageParseDetrend", "can't find a shutter image source");
     }
     if (options->doFlat) {
Index: /trunk/ppImage/src/ppImageParseDetrend.c
===================================================================
--- /trunk/ppImage/src/ppImageParseDetrend.c	(revision 9341)
+++ /trunk/ppImage/src/ppImageParseDetrend.c	(revision 9342)
@@ -6,5 +6,5 @@
 
 // identify all needed detrend and other I/O files
-// create the pmFPAfiles for the active I/O files 
+// create the pmFPAfiles for the active I/O files
 
 bool ppImageParseDetrend(ppImageOptions *options, pmConfig *config)
@@ -16,33 +16,40 @@
     pmFPAfile *input = psMetadataLookupPtr (&status, config->files, "PPIMAGE.INPUT");
 
-    // the following are defined from the argument list, if given, 
+    // the following are defined from the argument list, if given,
     // otherwise they revert to the config information
 
     if (options->doBias) {
-	bool status = false;
-	pmFPAfileFromArgs (&status, config, "PPIMAGE.BIAS", "BIAS");
-	pmFPAfileFromConf (&status, config, "PPIMAGE.BIAS", input->fpa);
-	if (!status) psAbort ("ppImageParseDetrend", "can't find a bias image source");
+        bool status = false;
+        pmFPAfileFromArgs (&status, config, "PPIMAGE.BIAS", "BIAS");
+        pmFPAfileFromConf (&status, config, "PPIMAGE.BIAS", input->fpa);
+        if (!status) psAbort ("ppImageParseDetrend", "can't find a bias image source");
     }
 
     if (options->doDark) {
-	bool status = false;
-	pmFPAfileFromArgs (&status, config, "PPIMAGE.DARK", "DARK");
-	pmFPAfileFromConf (&status, config, "PPIMAGE.DARK", input->fpa);
-	if (!status) psAbort ("ppImageParseDetrend", "can't find a dark image source");
+        bool status = false;
+        pmFPAfileFromArgs (&status, config, "PPIMAGE.DARK", "DARK");
+        pmFPAfileFromConf (&status, config, "PPIMAGE.DARK", input->fpa);
+        if (!status) psAbort ("ppImageParseDetrend", "can't find a dark image source");
     }
 
     if (options->doMask) {
-	bool status = false;
-	pmFPAfileFromArgs (&status, config, "PPIMAGE.MASK", "MASK");
-	pmFPAfileFromConf (&status, config, "PPIMAGE.MASK", input->fpa);
-	if (!status) psAbort ("ppImageParseDetrend", "can't find a mask image source");
+        bool status = false;
+        pmFPAfileFromArgs (&status, config, "PPIMAGE.MASK", "MASK");
+        pmFPAfileFromConf (&status, config, "PPIMAGE.MASK", input->fpa);
+        if (!status) psAbort ("ppImageParseDetrend", "can't find a mask image source");
+    }
+
+    if (options->doShutter) {
+        bool status = false;
+        pmFPAfileFromArgs (&status, config, "PPIMAGE.SHUTTER", "SHUTTER");
+        pmFPAfileFromConf (&status, config, "PPIMAGE.SHUTTER", input->fpa);
+        if (!status) psAbort ("ppImageParseDetrend", "can't find a shutter image source");
     }
 
     if (options->doFlat) {
-	bool status = false;
-	pmFPAfileFromArgs (&status, config, "PPIMAGE.FLAT", "FLAT");
-	pmFPAfileFromConf (&status, config, "PPIMAGE.FLAT", input->fpa);
-	if (!status) psAbort ("ppImageParseDetrend", "can't find a flat image source");
+        bool status = false;
+        pmFPAfileFromArgs (&status, config, "PPIMAGE.FLAT", "FLAT");
+        pmFPAfileFromConf (&status, config, "PPIMAGE.FLAT", input->fpa);
+        if (!status) psAbort ("ppImageParseDetrend", "can't find a flat image source");
     }
 
@@ -53,10 +60,10 @@
     // XXX do these need to construct a new fpa?
     if (options->doBin1) {
-	pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin1, options->yBin1, "PPIMAGE.BIN1");
-	pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG1");
+        pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin1, options->yBin1, "PPIMAGE.BIN1");
+        pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG1");
     }
     if (options->doBin2) {
-	pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin2, options->yBin2, "PPIMAGE.BIN2");
-	pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG2");
+        pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin2, options->yBin2, "PPIMAGE.BIN2");
+        pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG2");
     }
 
