Index: /trunk/psphot/src/psphot.h
===================================================================
--- /trunk/psphot/src/psphot.h	(revision 17827)
+++ /trunk/psphot/src/psphot.h	(revision 17828)
@@ -40,6 +40,7 @@
 bool            psphotGuessModels (pmReadout *readout, psArray *sources, psMetadata *recipe, pmPSF *psf);
 bool            psphotBlendFit (pmReadout *readout, psArray *sources, psMetadata *recipe, pmPSF *psf);
-bool            psphotReplaceUnfit (psArray *sources, psMaskType maskVal);
-bool            psphotReplaceAll (psArray *sources, psMetadata *recipe);
+bool            psphotReplaceUnfitSources (psArray *sources, psMaskType maskVal);
+bool            psphotReplaceAllSources (psArray *sources, psMetadata *recipe);
+bool            psphotRemoveAllSources (psArray *sources, psMetadata *recipe);
 bool            psphotApResid (pmReadout *readout, psArray *sources, psMetadata *recipe, pmPSF *psf);
 bool            psphotMagnitudes (psArray *sources, psMetadata *recipe, pmPSF *psf, pmReadout *background);
Index: /trunk/psphot/src/psphotReadout.c
===================================================================
--- /trunk/psphot/src/psphotReadout.c	(revision 17827)
+++ /trunk/psphot/src/psphotReadout.c	(revision 17828)
@@ -127,5 +127,5 @@
 
     // replace all sources
-    psphotReplaceAll (sources, recipe);
+    psphotReplaceAllSources (sources, recipe);
 
     // linear fit to include all sources
@@ -165,5 +165,5 @@
 
     // replace all sources so fit below applies to all at once
-    psphotReplaceAll (sources, recipe);
+    psphotReplaceAllSources (sources, recipe);
 
     // merge the newly selected sources into the existing list
@@ -199,5 +199,5 @@
 
     // replace failed sources?
-    // psphotReplaceUnfit (sources);
+    // psphotReplaceUnfitSources (sources);
 
     // replace background in residual image
Index: /trunk/psphot/src/psphotReplaceUnfit.c
===================================================================
--- /trunk/psphot/src/psphotReplaceUnfit.c	(revision 17827)
+++ /trunk/psphot/src/psphotReplaceUnfit.c	(revision 17828)
@@ -2,5 +2,5 @@
 
 // replace the flux for sources which failed
-bool psphotReplaceUnfit (psArray *sources, psMaskType maskVal) {
+bool psphotReplaceUnfitSources (psArray *sources, psMaskType maskVal) {
 
     pmSource *source;
@@ -23,5 +23,5 @@
 }
 
-bool psphotReplaceAll (psArray *sources, psMetadata *recipe) {
+bool psphotReplaceAllSources (psArray *sources, psMetadata *recipe) {
 
     bool status;
@@ -42,4 +42,28 @@
       pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);
       source->mode &= ~PM_SOURCE_MODE_SUBTRACTED;
+    }
+    psLogMsg ("psphot.replace", PS_LOG_INFO, "replaced models for %ld objects: %f sec\n", sources->n, psTimerMark ("psphot"));
+    return true;
+}
+
+bool psphotRemoveAllSources (psArray *sources, psMetadata *recipe) {
+
+    bool status;
+    pmSource *source;
+
+    psTimerStart ("psphot");
+
+    // user-defined masks to test for good/bad pixels (build from recipe list if not yet set)
+    psMaskType maskVal = psMetadataLookupU8(&status, recipe, "MASK.PSPHOT"); // Mask value for bad pixels
+    assert (maskVal);
+
+    for (int i = 0; i < sources->n; i++) {
+      source = sources->data[i];
+
+      // replace other sources?
+      if (source->mode & PM_SOURCE_MODE_SUBTRACTED) continue;
+
+      pmSourceAdd (source, PM_MODEL_OP_FULL, maskVal);
+      source->mode |= PM_SOURCE_MODE_SUBTRACTED;
     }
     psLogMsg ("psphot.replace", PS_LOG_INFO, "replaced models for %ld objects: %f sec\n", sources->n, psTimerMark ("psphot"));
