Index: /trunk/ippconfig/recipes/filerules-mef.mdc
===================================================================
--- /trunk/ippconfig/recipes/filerules-mef.mdc	(revision 34527)
+++ /trunk/ippconfig/recipes/filerules-mef.mdc	(revision 34528)
@@ -88,4 +88,18 @@
 PSPHOT.INPUT.TEXT       INPUT    @FILES        CHIP       SRCTEXT       
 PSPHOT.EXPNUM           INPUT    @FILES        CHIP       MASK       
+
+## files used by psphotStack
+PSPHOT.STACK.INPUT.RAW    INPUT    @FILES        CHIP       IMAGE
+PSPHOT.STACK.MASK.RAW     INPUT    @FILES        CHIP       MASK     
+PSPHOT.STACK.VARIANCE.RAW INPUT    @FILES        CHIP       VARIANCE     
+PSPHOT.STACK.EXPNUM.RAW   INPUT    @FILES        CHIP       EXPNUM     
+PSPHOT.STACK.PSF.RAW      INPUT    @FILES        CHIP       PSF       
+PSPHOT.STACK.INPUT.CNV    INPUT    @FILES        CHIP       IMAGE
+PSPHOT.STACK.MASK.CNV     INPUT    @FILES        CHIP       MASK     
+PSPHOT.STACK.VARIANCE.CNV INPUT    @FILES        CHIP       VARIANCE     
+PSPHOT.STACK.EXPNUM.CNV   INPUT    @FILES        CHIP       EXPNUM     
+PSPHOT.STACK.PSF.CNV      INPUT    @FILES        CHIP       PSF       
+PSPHOT.STACK.SOURCES      INPUT    @FILES        FPA        CMF
+
 
 ## files used by psastro 
@@ -220,4 +234,5 @@
 PSPHOT.BACKSUB          OUTPUT {OUTPUT}.sub.fits                 IMAGE     NONE       CHIP       FALSE     MEF
 PSPHOT.BACKMDL          OUTPUT {OUTPUT}.mdl.fits                 IMAGE     NONE       CHIP       FALSE     MEF
+PSPHOT.BACKMDL.STDEV    OUTPUT {OUTPUT}.mdl.std.fits             IMAGE     NONE       CHIP       FALSE     MEF
 PSPHOT.BACKMDL.MEF      OUTPUT {OUTPUT}.mdl.fits                 IMAGE     NONE       CHIP       FALSE     MEF
                                                                                      
@@ -234,10 +249,28 @@
 PSPHOT.SKY.CONFIG       OUTPUT {OUTPUT}.psphot.mdc               TEXT      NONE       FPA        TRUE      NONE
 
-                                                                                     
 # outputs for psphotStack:
-PSPHOT.CHISQ.IMAGE      OUTPUT {OUTPUT}.{CHIP.NAME}.chisq.im.fits IMAGE    NONE       FPA        TRUE      SIMPLE
-PSPHOT.CHISQ.MASK       OUTPUT {OUTPUT}.{CHIP.NAME}.chisq.mk.fits MASK     NONE       FPA        TRUE      SIMPLE
-PSPHOT.CHISQ.VARIANCE   OUTPUT {OUTPUT}.{CHIP.NAME}.chisq.wt.fits VARIANCE NONE       FPA        TRUE      SIMPLE
-PSPHOT.STACK.OUTPUT     OUTPUT {OUTPUT}.{CHIP.NAME}.sky.{FILE.ID}.cmf CMF      NONE       FPA        TRUE      NONE
+PSPHOT.CHISQ.IMAGE           OUTPUT {OUTPUT}.chisq.im.fits            IMAGE           NONE       FPA        TRUE      NONE
+PSPHOT.CHISQ.MASK            OUTPUT {OUTPUT}.chisq.mk.fits            MASK            NONE       FPA        TRUE      NONE
+PSPHOT.CHISQ.VARIANCE        OUTPUT {OUTPUT}.chisq.wt.fits            VARIANCE        NONE       FPA        TRUE      NONE
+PSPHOT.STACK.OUTPUT.IMAGE    OUTPUT {OUTPUT}.stk.{FILE.ID}.im.fits    IMAGE           NONE       FPA        TRUE      NONE
+PSPHOT.STACK.OUTPUT.MASK     OUTPUT {OUTPUT}.stk.{FILE.ID}.mk.fits    MASK            NONE       FPA        TRUE      NONE
+PSPHOT.STACK.OUTPUT.VARIANCE OUTPUT {OUTPUT}.stk.{FILE.ID}.wt.fits    VARIANCE        NONE       FPA        TRUE      NONE
+PSPHOT.STACK.OUTPUT          OUTPUT {OUTPUT}.stk.{FILE.ID}.cmf        CMF             NONE       FPA        TRUE      NONE
+PSPHOT.STACK.PSF.SAVE        OUTPUT {OUTPUT}.stk.{FILE.ID}.psf        PSF             NONE       FPA        TRUE      NONE
+PSPHOT.STACK.BACKMDL         OUTPUT {OUTPUT}.stk.{FILE.ID}.mdl.fits   IMAGE           NONE       FPA        TRUE      NONE
+PSPHOT.STACK.BACKMDL.STDEV   OUTPUT {OUTPUT}.stk.{FILE.ID}.mdl.sdv.fits IMAGE         NONE       FPA        TRUE      NONE
+
+PSPHOT.STACK.CONFIG          OUTPUT {OUTPUT}.psphotStack.mdc          TEXT            NONE       FPA        TRUE      NONE
+
+PSPHOT.STACK.RESID           OUTPUT {OUTPUT}.stk.{FILE.ID}.res.fits   IMAGE           COMP_SUB   FPA        TRUE      NONE
+PSPHOT.STACK.BACKGND         OUTPUT {OUTPUT}.stk.{FILE.ID}.bck.fits   IMAGE           COMP_IMG   FPA        TRUE      NONE
+PSPHOT.STACK.BACKSUB         OUTPUT {OUTPUT}.stk.{FILE.ID}.sub.fits   IMAGE           COMP_SUB   FPA        TRUE      NONE
+                                                     
+# old outputs for psphotStack:
+# I think these are wrong
+#PSPHOT.CHISQ.IMAGE      OUTPUT {OUTPUT}.{CHIP.NAME}.chisq.im.fits IMAGE    NONE       FPA        TRUE      SIMPLE
+#PSPHOT.CHISQ.MASK       OUTPUT {OUTPUT}.{CHIP.NAME}.chisq.mk.fits MASK     NONE       FPA        TRUE      SIMPLE
+#PSPHOT.CHISQ.VARIANCE   OUTPUT {OUTPUT}.{CHIP.NAME}.chisq.wt.fits VARIANCE NONE       FPA        TRUE      SIMPLE
+#PSPHOT.STACK.OUTPUT     OUTPUT {OUTPUT}.{CHIP.NAME}.sky.{FILE.ID}.cmf CMF      NONE       FPA        TRUE      NONE
                                                      
 SOURCE.PLOT.MOMENTS     OUTPUT {OUTPUT}.mnt.png                  KAPA      NONE       FPA        TRUE      NONE
Index: /trunk/ippconfig/recipes/filerules-simple.mdc
===================================================================
--- /trunk/ippconfig/recipes/filerules-simple.mdc	(revision 34527)
+++ /trunk/ippconfig/recipes/filerules-simple.mdc	(revision 34528)
@@ -64,8 +64,10 @@
 PSPHOT.STACK.MASK.RAW     INPUT    @FILES        CHIP       MASK     
 PSPHOT.STACK.VARIANCE.RAW INPUT    @FILES        CHIP       VARIANCE     
+PSPHOT.STACK.EXPNUM.RAW   INPUT    @FILES        CHIP       MASK     
 PSPHOT.STACK.PSF.RAW      INPUT    @FILES        CHIP       PSF       
 PSPHOT.STACK.INPUT.CNV    INPUT    @FILES        CHIP       IMAGE
 PSPHOT.STACK.MASK.CNV     INPUT    @FILES        CHIP       MASK     
 PSPHOT.STACK.VARIANCE.CNV INPUT    @FILES        CHIP       VARIANCE     
+PSPHOT.STACK.EXPNUM.CNV   INPUT    @FILES        CHIP       MASK     
 PSPHOT.STACK.PSF.CNV      INPUT    @FILES        CHIP       PSF       
 PSPHOT.STACK.SOURCES      INPUT    @FILES        FPA        CMF
@@ -195,4 +197,5 @@
 PSPHOT.BACKMDL               OUTPUT {OUTPUT}.mdl.fits             IMAGE           NONE       FPA        TRUE      SIMPLE
 PSPHOT.BACKMDL.MEF           OUTPUT {OUTPUT}.mdl.fits             IMAGE           NONE       FPA        TRUE      SIMPLE
+PSPHOT.BACKMDL.STDEV         OUTPUT {OUTPUT}.mdl.std.fits         IMAGE           NONE       FPA        TRUE      SIMPLE
                                                      
 PSPHOT.OUTPUT.RAW            OUTPUT {OUTPUT}                      RAW             NONE       FPA        TRUE      NONE
@@ -213,11 +216,19 @@
 
 # outputs for psphotStack:
-PSPHOT.CHISQ.IMAGE           OUTPUT {OUTPUT}.chisq.im.fits        IMAGE           NONE       FPA        TRUE      NONE
-PSPHOT.CHISQ.MASK            OUTPUT {OUTPUT}.chisq.mk.fits        MASK            NONE       FPA        TRUE      NONE
-PSPHOT.CHISQ.VARIANCE        OUTPUT {OUTPUT}.chisq.wt.fits        VARIANCE        NONE       FPA        TRUE      NONE
+PSPHOT.CHISQ.IMAGE           OUTPUT {OUTPUT}.chisq.im.fits            IMAGE           NONE       FPA        TRUE      NONE
+PSPHOT.CHISQ.MASK            OUTPUT {OUTPUT}.chisq.mk.fits            MASK            NONE       FPA        TRUE      NONE
+PSPHOT.CHISQ.VARIANCE        OUTPUT {OUTPUT}.chisq.wt.fits            VARIANCE        NONE       FPA        TRUE      NONE
 PSPHOT.STACK.OUTPUT.IMAGE    OUTPUT {OUTPUT}.stk.{FILE.ID}.im.fits    IMAGE           NONE       FPA        TRUE      NONE
 PSPHOT.STACK.OUTPUT.MASK     OUTPUT {OUTPUT}.stk.{FILE.ID}.mk.fits    MASK            NONE       FPA        TRUE      NONE
 PSPHOT.STACK.OUTPUT.VARIANCE OUTPUT {OUTPUT}.stk.{FILE.ID}.wt.fits    VARIANCE        NONE       FPA        TRUE      NONE
 PSPHOT.STACK.OUTPUT          OUTPUT {OUTPUT}.stk.{FILE.ID}.cmf        CMF             NONE       FPA        TRUE      NONE
+PSPHOT.STACK.PSF.SAVE        OUTPUT {OUTPUT}.stk.{FILE.ID}.psf        PSF             NONE       FPA        TRUE      NONE
+PSPHOT.STACK.BACKMDL         OUTPUT {OUTPUT}.stk.{FILE.ID}.mdl.fits   IMAGE           NONE       FPA        TRUE      NONE
+PSPHOT.STACK.BACKMDL.STDEV   OUTPUT {OUTPUT}.stk.{FILE.ID}.mdl.sdv.fits IMAGE         NONE       FPA        TRUE      NONE
+PSPHOT.STACK.BACKGND         OUTPUT {OUTPUT}.stk.{FILE.ID}.bck.fits   IMAGE           COMP_IMG   FPA        TRUE      NONE
+PSPHOT.STACK.BACKSUB         OUTPUT {OUTPUT}.stk.{FILE.ID}.sub.fits   IMAGE           COMP_SUB   FPA        TRUE      NONE
+PSPHOT.STACK.RESID           OUTPUT {OUTPUT}.stk.{FILE.ID}.res.fits   IMAGE           COMP_SUB   FPA        TRUE      NONE
+PSPHOT.STACK.CONFIG          OUTPUT {OUTPUT}.psphotStack.mdc          TEXT            NONE       FPA        TRUE      NONE
+                                                     
                                                      
 SOURCE.PLOT.MOMENTS          OUTPUT {OUTPUT}.mnt.png              KAPA            NONE       FPA        TRUE      NONE
Index: /trunk/ippconfig/recipes/filerules-split.mdc
===================================================================
--- /trunk/ippconfig/recipes/filerules-split.mdc	(revision 34527)
+++ /trunk/ippconfig/recipes/filerules-split.mdc	(revision 34528)
@@ -131,4 +131,5 @@
 PPSTAMP.INPUT.MASK        INPUT    @FILES        CHIP       MASK
 PPSTAMP.INPUT.VARIANCE    INPUT    @FILES        CHIP       VARIANCE
+PPSTAMP.INPUT.SOURCES     INPUT    @FILES        CHIP       CMF
                           
 # files used by pparith   
@@ -214,4 +215,5 @@
 PSPHOT.BACKSUB               OUTPUT {OUTPUT}.{CHIP.NAME}.sub.fits     IMAGE           COMP_SUB   CHIP       TRUE      NONE
 PSPHOT.BACKMDL               OUTPUT {OUTPUT}.{CHIP.NAME}.mdl.fits     IMAGE           NONE       CHIP       TRUE      NONE
+PSPHOT.BACKMDL.STDEV         OUTPUT {OUTPUT}.{CHIP.NAME}.mdl.std.fits  IMAGE           NONE       CHIP       TRUE      NONE
 PSPHOT.BACKMDL.MEF           OUTPUT {OUTPUT}.mdl.fits                 IMAGE           NONE       CHIP       TRUE      NONE
                                                                                                               
@@ -235,8 +237,17 @@
 PSPHOT.CHISQ.MASK            OUTPUT {OUTPUT}.chisq.mk.fits            MASK            NONE       FPA        TRUE      NONE
 PSPHOT.CHISQ.VARIANCE        OUTPUT {OUTPUT}.chisq.wt.fits            VARIANCE        NONE       FPA        TRUE      NONE
-PSPHOT.STACK.OUTPUT.IMAGE    OUTPUT {OUTPUT}.stk.{FILE.ID}.im.fits        IMAGE           NONE       FPA        TRUE      NONE
-PSPHOT.STACK.OUTPUT.MASK     OUTPUT {OUTPUT}.stk.{FILE.ID}.mk.fits        MASK            NONE       FPA        TRUE      NONE
-PSPHOT.STACK.OUTPUT.VARIANCE OUTPUT {OUTPUT}.stk.{FILE.ID}.wt.fits        VARIANCE        NONE       FPA        TRUE      NONE
-PSPHOT.STACK.OUTPUT          OUTPUT {OUTPUT}.stk.{FILE.ID}.cmf            CMF             NONE       FPA        TRUE      NONE
+
+PSPHOT.STACK.OUTPUT.IMAGE    OUTPUT {OUTPUT}.stk.{FILE.ID}.im.fits    IMAGE           NONE       FPA        TRUE      NONE
+PSPHOT.STACK.OUTPUT.MASK     OUTPUT {OUTPUT}.stk.{FILE.ID}.mk.fits    MASK            NONE       FPA        TRUE      NONE
+PSPHOT.STACK.OUTPUT.VARIANCE OUTPUT {OUTPUT}.stk.{FILE.ID}.wt.fits    VARIANCE        NONE       FPA        TRUE      NONE
+PSPHOT.STACK.OUTPUT          OUTPUT {OUTPUT}.stk.{FILE.ID}.cmf        CMF             NONE       FPA        TRUE      NONE
+
+PSPHOT.STACK.PSF.SAVE        OUTPUT {OUTPUT}.stk.{FILE.ID}.psf        PSF             NONE       FPA        TRUE      NONE
+PSPHOT.STACK.BACKMDL         OUTPUT {OUTPUT}.stk.{FILE.ID}.mdl.fits   IMAGE           NONE       FPA        TRUE      NONE
+
+PSPHOT.STACK.BACKMDL.STDEV   OUTPUT {OUTPUT}.stk.{FILE.ID}.mdl.sdv.fits IMAGE         NONE       FPA        TRUE      NONE
+PSPHOT.STACK.BACKGND         OUTPUT {OUTPUT}.stk.{FILE.ID}.bck.fits   IMAGE           COMP_IMG   FPA        TRUE      NONE
+PSPHOT.STACK.BACKSUB         OUTPUT {OUTPUT}.stk.{FILE.ID}.sub.fits   IMAGE           COMP_SUB   FPA        TRUE      NONE
+PSPHOT.STACK.RESID           OUTPUT {OUTPUT}.stk.{FILE.ID}.res.fits   IMAGE           COMP_SUB   FPA        TRUE      NONE
 PSPHOT.STACK.CONFIG          OUTPUT {OUTPUT}.psphotStack.mdc          TEXT            NONE       FPA        TRUE      NONE
                                                      
@@ -333,4 +344,5 @@
 PPSTAMP.OUTPUT.VARIANCE.NOCOMP OUTPUT {OUTPUT}.wt.fits                VARIANCE        NONE       FPA        TRUE      NONE
 PPSTAMP.OUTPUT.JPEG          OUTPUT {OUTPUT}.jpg                      JPEG            NONE       FPA        TRUE      NONE
+PPSTAMP.OUTPUT.SOURCES       OUTPUT {OUTPUT}.cmf                      CMF             NONE       FPA        TRUE      NONE
 # mosaic image used for making stamps of raw images. Not saved.
 PPSTAMP.CHIP                 OUTPUT {OUTPUT}.ch.fits                  IMAGE           NONE       CHIP       FALSE     MEF
Index: /trunk/psphot/src/psphot.h
===================================================================
--- /trunk/psphot/src/psphot.h	(revision 34527)
+++ /trunk/psphot/src/psphot.h	(revision 34528)
@@ -525,3 +525,6 @@
 bool psphotSourceMemoryReadout(pmConfig *config, const pmFPAview *view, const char *filerule, int index);
 
+const char * psphotGetFilerule(const char *baseRule);
+extern bool psphotINpsphotStack;
+
 #endif
Index: /trunk/psphot/src/psphotDefineFiles.c
===================================================================
--- /trunk/psphot/src/psphotDefineFiles.c	(revision 34527)
+++ /trunk/psphot/src/psphotDefineFiles.c	(revision 34528)
@@ -1,3 +1,5 @@
 # include "psphotInternal.h"
+
+bool psphotINpsphotStack = false;
 
 // List of output files
@@ -181,2 +183,26 @@
     return;
 }
+
+// psphotGetFilerule
+// Since psphotStack processes multipe FPAs at a time it has a different file rule structure than regular psphot. 
+// For the background output files we define a function psphotGetFilerule which given a base psphot file rule
+// returns the corresponding psphotStack rule *if* the program is psphotStack. That is indicated by a global
+// boolean which defaults to false, and psphotStack only sets to true
+
+const char *psphotGetFilerule(const char *psphotRule) {
+    const char *rule = psphotRule;
+    if (psphotINpsphotStack) {
+        if (!strcmp(psphotRule, "PSPHOT.BACKMDL")) {
+            rule =  "PSPHOT.STACK.BACKMDL";
+        } else if (!strcmp(psphotRule, "PSPHOT.BACKMDL.STDEV")) {
+            rule = "PSPHOT.STACK.BACKMDL.STDEV";
+        } else if (!strcmp(psphotRule, "PSPHOT.BACKSUB")) {
+            rule = "PSPHOT.STACK.BACKSUB";
+        } else if (!strcmp(psphotRule, "PSPHOT.BACKGND")) {
+            rule = "PSPHOT.STACK.BACKGND";
+        } else {
+            psAssert(0, "unsupported file rule %s", psphotRule);
+        }
+    }
+    return rule;
+}
Index: /trunk/psphot/src/psphotMaskBackground.c
===================================================================
--- /trunk/psphot/src/psphotMaskBackground.c	(revision 34527)
+++ /trunk/psphot/src/psphotMaskBackground.c	(revision 34528)
@@ -17,8 +17,8 @@
 
     // find the currently selected readout (XXX note that the model is saved on PSPHOT.BACKMDL regardless of 'filename'
-    pmFPAfile *modelFile = pmFPAfileSelectSingle(config->files, "PSPHOT.BACKMDL", index); // File of interest
+    pmFPAfile *modelFile = pmFPAfileSelectSingle(config->files, psphotGetFilerule("PSPHOT.BACKMDL"), index); // File of interest
     assert (modelFile);
 
-    pmFPAfile *stdevFile = pmFPAfileSelectSingle(config->files, "PSPHOT.BACKMDL.STDEV", index);
+    pmFPAfile *stdevFile = pmFPAfileSelectSingle(config->files, psphotGetFilerule("PSPHOT.BACKMDL.STDEV"), index);
     assert (stdevFile);
 
Index: /trunk/psphot/src/psphotModelBackground.c
===================================================================
--- /trunk/psphot/src/psphotModelBackground.c	(revision 34527)
+++ /trunk/psphot/src/psphotModelBackground.c	(revision 34528)
@@ -405,6 +405,6 @@
 
     psImageBinning *binning = psphotBackgroundBinning(readout->image, config); // Image binning parameters
-    pmReadout *model = pmFPAGenerateReadout(config, view, "PSPHOT.BACKMDL", inFPA, binning, index);
-    pmReadout *modelStdev = pmFPAGenerateReadout(config, view, "PSPHOT.BACKMDL.STDEV", inFPA, binning, index);
+    pmReadout *model = pmFPAGenerateReadout(config, view, psphotGetFilerule("PSPHOT.BACKMDL"), inFPA, binning, index);
+    pmReadout *modelStdev = pmFPAGenerateReadout(config, view, psphotGetFilerule("PSPHOT.BACKMDL.STDEV"), inFPA, binning, index);
 
     if (!psphotModelBackgroundReadout(model->image, modelStdev->image, model->analysis, readout, binning, config, false)) {
Index: /trunk/psphot/src/psphotOutput.c
===================================================================
--- /trunk/psphot/src/psphotOutput.c	(revision 34527)
+++ /trunk/psphot/src/psphotOutput.c	(revision 34528)
@@ -34,5 +34,5 @@
     
 
-    pmFPAfile *file = psMetadataLookupPtr (&status, config->files, "PSPHOT.BACKMDL");
+    pmFPAfile *file = psMetadataLookupPtr (&status, config->files, psphotGetFilerule("PSPHOT.BACKMDL"));
     if (!file) return NULL;
 
@@ -45,5 +45,5 @@
     bool status;
 
-    pmFPAfile *file = psMetadataLookupPtr (&status, config->files, "PSPHOT.BACKMDL.STDEV");
+    pmFPAfile *file = psMetadataLookupPtr (&status, config->files, psphotGetFilerule("PSPHOT.BACKMDL.STDEV"));
     if (!file) return NULL;
 
Index: /trunk/psphot/src/psphotSkyReplace.c
===================================================================
--- /trunk/psphot/src/psphotSkyReplace.c	(revision 34527)
+++ /trunk/psphot/src/psphotSkyReplace.c	(revision 34528)
@@ -36,5 +36,5 @@
 
     // select background pixels, from output background file, or create
-    pmReadout *background = pmFPAfileThisReadout (config->files, view, "PSPHOT.BACKGND");
+    pmReadout *background = pmFPAfileThisReadout (config->files, view, psphotGetFilerule("PSPHOT.BACKGND"));
     if (background == NULL) psAbort("background not defined");
 
Index: /trunk/psphot/src/psphotStack.c
===================================================================
--- /trunk/psphot/src/psphotStack.c	(revision 34527)
+++ /trunk/psphot/src/psphotStack.c	(revision 34528)
@@ -2,4 +2,8 @@
 
 int main (int argc, char **argv) {
+
+    // Set flag to tell certain library functions that we are in the psphotStack program. 
+    // (This is defined in psphotDefineFiles.c)
+    psphotINpsphotStack = true;
 
     // uncomment to turn on memory dumps (move this to an option)
Index: /trunk/psphot/src/psphotStackImageLoop.c
===================================================================
--- /trunk/psphot/src/psphotStackImageLoop.c	(revision 34527)
+++ /trunk/psphot/src/psphotStackImageLoop.c	(revision 34528)
@@ -43,4 +43,7 @@
     if (!needConvolved) {
         pmFPAfileActivate (config->files, false, "PSPHOT.STACK.INPUT.CNV");
+        pmFPAfileActivate (config->files, false, "PSPHOT.STACK.MASK.CNV");
+        pmFPAfileActivate (config->files, false, "PSPHOT.STACK.VARIANCE.CNV");
+        pmFPAfileActivate (config->files, false, "PSPHOT.STACK.PSF.CNV");
     }
 
@@ -97,7 +100,7 @@
 	    // drop all versions of the internal files
 	    status = true;
-	    status &= pmFPAfileDropInternal (config->files, "PSPHOT.BACKMDL");
-	    status &= pmFPAfileDropInternal (config->files, "PSPHOT.BACKMDL.STDEV");
-	    status &= pmFPAfileDropInternal (config->files, "PSPHOT.BACKGND");
+	    status &= pmFPAfileDropInternal (config->files, psphotGetFilerule("PSPHOT.BACKMDL"));
+	    status &= pmFPAfileDropInternal (config->files, psphotGetFilerule("PSPHOT.BACKMDL.STDEV"));
+	    status &= pmFPAfileDropInternal (config->files, psphotGetFilerule("PSPHOT.BACKGND"));
 	    if (!status) {
 		psError(PSPHOT_ERR_PROG, false, "trouble dropping internal files");
Index: /trunk/psphot/src/psphotStackParseCamera.c
===================================================================
--- /trunk/psphot/src/psphotStackParseCamera.c	(revision 34527)
+++ /trunk/psphot/src/psphotStackParseCamera.c	(revision 34528)
@@ -14,4 +14,17 @@
 	return false;
     }
+
+    // select the appropriate recipe information
+    psMetadata *recipe  = psMetadataLookupPtr (&status, config->recipes, PSPHOT_RECIPE);
+    bool savePSF = psMetadataLookupBool(&status, recipe, "SAVE.PSF");
+    bool saveBackgroundModel = psMetadataLookupBool(&status, recipe, "SAVE.BACKMDL");
+    bool saveBackground = psMetadataLookupBool(&status, recipe, "SAVE.BACKGND");
+    bool saveBackSub = psMetadataLookupBool(&status, recipe, "SAVE.BACKSUB");
+    bool saveResid = psMetadataLookupBool(&status, recipe, "SAVE.RESID");
+
+    bool saveCnv = psMetadataLookupBool(&status, recipe, "SAVE.CNV");
+    bool saveChisq = psMetadataLookupBool(&status, recipe, "SAVE.CHISQ");
+    bool useRaw = psMetadataLookupBool(&status, recipe, "PSPHOT.STACK.USE.RAW");
+
 
     int nRaw = 0;
@@ -120,4 +133,14 @@
 	    }
 	}
+        pmFPAfile *inputTemplate;
+        if (useRaw) {
+            inputTemplate = rawInputFile;
+        } else {
+            inputTemplate = cnvInputFile;
+        }
+        if (!inputTemplate) {
+            psError(PS_ERR_UNKNOWN, true, "cannot determinte inputTemplate: USE.RAW: %d\n", useRaw);
+            return false;
+        }
 
 	psString sources = psMetadataLookupStr(&status, input, "SOURCES"); // Name of mask
@@ -135,5 +158,4 @@
         }
 	// generate an pmFPAimage for the output convolved image
-	// XXX output of these files should be optional
 	{
 	    // pmFPAfile *srcInputFile = rawInputFile ? rawInputFile : cnvInputFile;
@@ -143,5 +165,5 @@
 		return false;
 	    }
-	    outputImage->save = true;
+	    outputImage->save = saveCnv;
 	    outputImage->fileID = stack_id;		// this is used to generate output names
 
@@ -155,5 +177,5 @@
 		return NULL;
 	    }
-	    outputMask->save = true;
+	    outputMask->save = saveCnv;
 	    outputMask->fileID = stack_id;		// this is used to generate output names
 
@@ -167,5 +189,5 @@
 		return NULL;
 	    }
-	    outputVariance->save = true;
+	    outputVariance->save = saveCnv;
 	    outputVariance->fileID = stack_id;		// this is used to generate output names
 
@@ -178,4 +200,53 @@
 	    outsources->save = true;
 	    outsources->fileID = stack_id;		// this is used to generate output names
+
+            if (savePSF) {
+                pmFPAfile *output = pmFPAfileDefineOutputFromFile (config, inputTemplate, "PSPHOT.STACK.PSF.SAVE");
+                if (!output) {
+                    psError(PSPHOT_ERR_CONFIG, false, "Cannot find a rule for PSPHOT.STACK.PSF.SAVE");
+                    return false;
+                }
+                output->save = true;
+                output->fileID = stack_id;
+            }
+            if (saveBackgroundModel) {
+                int DX = psMetadataLookupS32 (&status, recipe, "BACKGROUND.XBIN");
+                int DY = psMetadataLookupS32 (&status, recipe, "BACKGROUND.YBIN");
+                pmFPAfile *output = pmFPAfileDefineFromFile (config, inputTemplate, DX, DY, "PSPHOT.STACK.BACKMDL");
+                if (!output) {
+                    psError(PSPHOT_ERR_CONFIG, false, "Cannot find a rule for PSPHOT.STACK.BACKMDL");
+                    return false;
+                }
+
+                output->save = true;
+                output->fileID = stack_id;
+            }
+            if (saveBackground) {
+                pmFPAfile *output = pmFPAfileDefineFromFile (config, inputTemplate, 1, 1, "PSPHOT.STACK.BACKGND");
+                if (!output) {
+                    psError(PSPHOT_ERR_CONFIG, false, "Cannot find a rule for PSPHOT.STACK.STACK.BACKGND");
+                    return false;
+                }
+                output->save = true;
+                output->fileID = stack_id;
+            }
+            if (saveBackSub) {
+                pmFPAfile *output = pmFPAfileDefineFromFile (config, inputTemplate, 1, 1, "PSPHOT.STACK.BACKSUB");
+                if (!output) {
+                    psError(PSPHOT_ERR_CONFIG, false, "Cannot find a rule for PSPHOT.STACK.STACK.BACKSUB");
+                    return false;
+                }
+                output->save = true;
+                output->fileID = stack_id;
+            }
+            if (saveResid) {
+                pmFPAfile *output = pmFPAfileDefineOutputFromFile (config, inputTemplate, "PSPHOT.STACK.RESID");
+                if (!output) {
+                    psError(PSPHOT_ERR_CONFIG, false, "Cannot find a rule for PSPHOT.STACK.RESID");
+                    return false;
+                }
+                output->save = true;
+                output->fileID = stack_id;
+            }
 	}
     }
@@ -191,25 +262,5 @@
     }
 
-    // select the appropriate recipe information
-    psMetadata *recipe  = psMetadataLookupPtr (&status, config->recipes, PSPHOT_RECIPE);
-    bool saveCnv = psMetadataLookupBool(&status, recipe, "SAVE.CNV");
-    bool saveChisq = psMetadataLookupBool(&status, recipe, "SAVE.CHISQ");
-
-    // loop over the available readouts
-    for (int i = 0; i < nInputs; i++) {
-	pmFPAfile *file = NULL;
-
-	file = pmFPAfileSelectSingle(config->files, "PSPHOT.STACK.OUTPUT.IMAGE", i);
-	file->save = saveCnv;
-
-	file = pmFPAfileSelectSingle(config->files, "PSPHOT.STACK.OUTPUT.MASK", i);
-	file->save = saveCnv;
-
-	file = pmFPAfileSelectSingle(config->files, "PSPHOT.STACK.OUTPUT.VARIANCE", i);
-	file->save = saveCnv;
-    }
-
     // generate an pmFPAimage for the chisqImage
-    // XXX output of these files should be optional
     {
 	pmFPAfile *chisqImage = pmFPAfileDefineOutput(config, NULL, "PSPHOT.CHISQ.IMAGE");
Index: /trunk/psphot/src/psphotSubtractBackground.c
===================================================================
--- /trunk/psphot/src/psphotSubtractBackground.c	(revision 34527)
+++ /trunk/psphot/src/psphotSubtractBackground.c	(revision 34528)
@@ -21,5 +21,5 @@
 
     // find the currently selected readout (XXX note that the model is saved on PSPHOT.BACKMDL regardless of 'filename'
-    pmFPAfile *modelFile = pmFPAfileSelectSingle(config->files, "PSPHOT.BACKMDL", index); // File of interest
+    pmFPAfile *modelFile = pmFPAfileSelectSingle(config->files, psphotGetFilerule("PSPHOT.BACKMDL"), index); // File of interest
     assert (modelFile);
 
@@ -36,5 +36,5 @@
     // select background pixels, from output background file, or create
     // XXX for now, we will only allow a single background image to be generated
-    file = psMetadataLookupPtr (&status, config->files, "PSPHOT.BACKGND");
+    file = psMetadataLookupPtr (&status, config->files, psphotGetFilerule("PSPHOT.BACKGND"));
     if (file) {
         // we are using PSPHOT.BACKGND as an I/O file: select readout or create
@@ -50,5 +50,5 @@
         }
     } else {
-        background = pmFPAfileDefineInternal (config->files, "PSPHOT.BACKGND", image->numCols, image->numRows, PS_TYPE_F32);
+        background = pmFPAfileDefineInternal (config->files, psphotGetFilerule("PSPHOT.BACKGND"), image->numCols, image->numRows, PS_TYPE_F32);
     }
     psF32 **backData = background->image->data.F32;
