Index: /trunk/ppImage/src/ppImage.c
===================================================================
--- /trunk/ppImage/src/ppImage.c	(revision 7580)
+++ /trunk/ppImage/src/ppImage.c	(revision 7581)
@@ -24,7 +24,10 @@
 
     // Image Arithmetic Loop
-    ppImageLoop(config, options);
+    if (!ppImageLoop(config, options)) {
+	psErrorStackPrint(stderr, "");
+	exit(1);
+    }
 
-    psLogMsg ("ppImage", 3, "complete ppImage run: %f sec\n", psTimerMark ("complete"));
+    psLogMsg ("ppImage", 3, "complete ppImage run: %f sec\n", psTimerMark (TIMERNAME));
 
     // Cleaning up
Index: /trunk/ppImage/src/ppImageAstrom.c
===================================================================
--- /trunk/ppImage/src/ppImageAstrom.c	(revision 7580)
+++ /trunk/ppImage/src/ppImageAstrom.c	(revision 7581)
@@ -13,8 +13,8 @@
 	// mode is 'REFERENCE' to prevent double frees of the fpa
 	pmFPAfile *output = psMetadataLookupPtr (&status, config->files, "PSPHOT.OUTPUT");
-	input = pmFPAfileDefine (config->files, config->camera, output->fpa, "PSASTRO.INPUT");
+	input = pmFPAfileDefineInput (config->files, config->camera, output->fpa, "PSASTRO.INPUT");
 	input->mode = PM_FPA_MODE_REFERENCE;
 
-	pmFPAfileDefine (config->files, config->camera, input->fpa, "PSPHOT.OUTPUT");
+	pmFPAfileDefineOutput (config->files, config->camera, input->fpa, "PSPHOT.OUTPUT");
 
 	// supply the output name (from cmd-line) to all output (WRITE) files
Index: /trunk/ppImage/src/ppImageCleanup.c
===================================================================
--- /trunk/ppImage/src/ppImageCleanup.c	(revision 7580)
+++ /trunk/ppImage/src/ppImageCleanup.c	(revision 7581)
@@ -11,6 +11,7 @@
     pmConceptsDone();
     pmConfigDone();
-    fprintf (stderr, "found %d leaks at %s\n", psMemCheckLeaks (0, NULL, NULL, false), "ppImage");
-    // fprintf (stderr, "found %d leaks at %s\n", psMemCheckLeaks (0, NULL, stdout, false), "ppImage");
+    pmModelGroupCleanup();
+    // fprintf (stderr, "found %d leaks at %s\n", psMemCheckLeaks (0, NULL, NULL, false), "ppImage");
+    fprintf (stderr, "found %d leaks at %s\n", psMemCheckLeaks (0, NULL, stdout, false), "ppImage");
     return;
 }
Index: /trunk/ppImage/src/ppImageDetrendReadout.c
===================================================================
--- /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 7580)
+++ /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 7581)
@@ -39,5 +39,5 @@
 
     // Bias, dark and overscan subtraction are all merged.
-    if (options->doBias || options->doDark) {
+    if (options->doBias || options->doDark || options->doOverscan) {
 	ppImageDetrendBias(input, bias, dark, options);
     }
Index: /trunk/ppImage/src/ppImageLoop.c
===================================================================
--- /trunk/ppImage/src/ppImageLoop.c	(revision 7580)
+++ /trunk/ppImage/src/ppImageLoop.c	(revision 7581)
@@ -17,20 +17,20 @@
 
     // files associated with the science image
-    pmFPAfileIOChecks (config->files, view, PM_FPA_BEFORE);
+    if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
 
     while ((chip = pmFPAviewNextChip (view, input->fpa, 1)) != NULL) {
         psLogMsg ("ppImageLoop", 4, "Chip %d: %x %x\n", view->chip, chip->file_exists, chip->process);
         if (!chip->process || !chip->file_exists) { continue; }
-	pmFPAfileIOChecks (config->files, view, PM_FPA_BEFORE);
+	if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
 
 	while ((cell = pmFPAviewNextCell (view, input->fpa, 1)) != NULL) {
             psLogMsg ("ppImageLoop", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process);
             if (!cell->process || !cell->file_exists) { continue; }
-	    pmFPAfileIOChecks (config->files, view, PM_FPA_BEFORE);
+	    if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
 
 	    // process each of the readouts
 	    while ((readout = pmFPAviewNextReadout (view, input->fpa, 1)) != NULL) {
-		pmFPAfileIOChecks (config->files, view, PM_FPA_BEFORE);
-		if (! readout->data_exists) { continue; }
+		if (!pmFPAfileIOChecks (config, view, PM_FPA_BEFORE)) return false;
+		if (!readout->data_exists) { continue; }
 
 		// perform the detrend analysis
@@ -40,7 +40,7 @@
 		if (options->doBin2) ppImageRebinReadout (config, view, "PPIMAGE.BIN2");
 
-		pmFPAfileIOChecks (config->files, view, PM_FPA_AFTER);
+		if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
 	    }
-	    pmFPAfileIOChecks (config->files, view, PM_FPA_AFTER);
+	    if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
 	}
 
@@ -50,5 +50,5 @@
 	if (options->doPhotom) ppImagePhotom (config, view);
 
-	pmFPAfileIOChecks (config->files, view, PM_FPA_AFTER);
+	if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
 
 	// XXX paul added these frees: make sure the same is happening in the pmFileIOChecks
@@ -68,5 +68,5 @@
     // ppImageJpegFPA (config, view);
 
-    pmFPAfileIOChecks (config->files, view, PM_FPA_AFTER);
+    if (!pmFPAfileIOChecks (config, view, PM_FPA_AFTER)) return false;
 
     psFree (view);
Index: /trunk/ppImage/src/ppImageParseCamera.c
===================================================================
--- /trunk/ppImage/src/ppImageParseCamera.c	(revision 7580)
+++ /trunk/ppImage/src/ppImageParseCamera.c	(revision 7581)
@@ -7,5 +7,5 @@
 
     // the input image defines the camera
-    pmFPAfile *input = pmFPAfileFromArgs (&status, config, "PPIMAGE.INPUT", "INPUT");
+    pmFPAfile *input = pmFPAfileDefineFromArgs (&status, config, "PPIMAGE.INPUT", "INPUT");
     if (!status) {
 	psError(PS_ERR_IO, false, "Failed to build FPA from PPIMAGE.INPUT");
@@ -22,5 +22,5 @@
 
     // the following files are output targets
-    pmFPAfileDefine (config->files, config->camera, input->fpa, "PPIMAGE.OUTPUT");
+    pmFPAfileDefineOutput (config->files, config->camera, input->fpa, "PPIMAGE.OUTPUT");
 
     // the following are defined from the argument list, if given, 
@@ -29,36 +29,40 @@
     if (options->doBias) {
 	bool status = false;
-	pmFPAfileFromArgs (&status, config, "PPIMAGE.BIAS", "BIAS");
-	pmFPAfileFromConf (&status, config, "PPIMAGE.BIAS", input->fpa);
+	pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.BIAS", "BIAS");
+	pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.BIAS");
+	pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.BIAS", input->fpa, PM_DETREND_TYPE_BIAS);
 	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);
+	pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.DARK", "DARK");
+	pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.DARK");
+	pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.DARK", input->fpa, PM_DETREND_TYPE_DARK);
 	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);
+	pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.MASK", "MASK");
+	pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.MASK");
+	pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.MASK", input->fpa, PM_DETREND_TYPE_MASK);
 	if (!status) psAbort ("ppImageParseDetrend", "can't find a mask image source");
     }
     if (options->doFlat) {
 	bool status = false;
-	pmFPAfileFromArgs (&status, config, "PPIMAGE.FLAT", "FLAT");
-	pmFPAfileFromConf (&status, config, "PPIMAGE.FLAT", input->fpa);
+	pmFPAfileDefineFromArgs  (&status, config, "PPIMAGE.FLAT", "FLAT");
+	pmFPAfileDefineFromConf  (&status, config, "PPIMAGE.FLAT");
+	pmFPAfileDefineFromDetDB (&status, config, "PPIMAGE.FLAT", input->fpa, PM_DETREND_TYPE_FLAT);
 	if (!status) psAbort ("ppImageParseDetrend", "can't find a flat image source");
     }
     if (options->doBin1) {
-	pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin1, options->yBin1, "PPIMAGE.BIN1");
+	pmFPAfile *file = pmFPAfileDefineFromFPA (config, input->fpa, options->xBin1, options->yBin1, "PPIMAGE.BIN1");
 	if (options->doBin1JPG) {
-	    pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG1");
+	    pmFPAfileDefineOutput (config->files, config->camera, file->fpa, "PPIMAGE.JPEG1");
 	}
     }
     if (options->doBin2) {
-	pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin2, options->yBin2, "PPIMAGE.BIN2");
+	pmFPAfile *file = pmFPAfileDefineFromFPA (config, input->fpa, options->xBin2, options->yBin2, "PPIMAGE.BIN2");
 	if (options->doBin2JPG) {
-	    pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG2");
+	    pmFPAfileDefineOutput (config->files, config->camera, file->fpa, "PPIMAGE.JPEG2");
 	}
     }
Index: /trunk/ppImage/src/ppImagePhotom.c
===================================================================
--- /trunk/ppImage/src/ppImagePhotom.c	(revision 7580)
+++ /trunk/ppImage/src/ppImagePhotom.c	(revision 7581)
@@ -29,8 +29,8 @@
 	// mode is 'REFERENCE' to prevent double frees of the fpa
 	pmFPAfile *output = psMetadataLookupPtr (&status, config->files, "PPIMAGE.OUTPUT");
-	input = pmFPAfileDefine (config->files, config->camera, output->fpa, "PSPHOT.INPUT");
+	input = pmFPAfileDefineInput (config->files, config->camera, output->fpa, "PSPHOT.INPUT");
 	input->mode = PM_FPA_MODE_REFERENCE;
 
-	pmFPAfileDefine (config->files, config->camera, input->fpa, "PSPHOT.OUTPUT");
+	pmFPAfileDefineOutput (config->files, config->camera, input->fpa, "PSPHOT.OUTPUT");
 
 	// supply the output name (from cmd-line) to all output (WRITE) files
@@ -62,9 +62,9 @@
 	psLogMsg ("ppImagePhot", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process);
 	if (! cell->process || ! cell->file_exists) { continue; }
-	pmFPAfileIOChecks (config->files, view, PM_FPA_BEFORE);
+	pmFPAfileIOChecks (config, view, PM_FPA_BEFORE);
 
 	// process each of the readouts
 	while ((readout = pmFPAviewNextReadout (view, input->fpa, 1)) != NULL) {
-	    pmFPAfileIOChecks (config->files, view, PM_FPA_BEFORE);
+	    pmFPAfileIOChecks (config, view, PM_FPA_BEFORE);
 	    if (! readout->data_exists) { continue; }
 
@@ -72,7 +72,7 @@
 	    psphotReadout (config, view);
 
-	    pmFPAfileIOChecks (config->files, view, PM_FPA_AFTER);
+	    pmFPAfileIOChecks (config, view, PM_FPA_AFTER);
 	}
-	pmFPAfileIOChecks (config->files, view, PM_FPA_AFTER);
+	pmFPAfileIOChecks (config, view, PM_FPA_AFTER);
     }
 
