Index: branches/eam_branches/20090715/ppStack/src/ppStackCamera.c
===================================================================
--- branches/eam_branches/20090715/ppStack/src/ppStackCamera.c	(revision 25406)
+++ branches/eam_branches/20090715/ppStack/src/ppStackCamera.c	(revision 25624)
@@ -85,16 +85,4 @@
         psFree(runVars);
 
-        psArray *runPSF = pmFPAfileDefineMultipleFromRun(&status, runImages, config,
-                                                         "PPSTACK.INPUT.PSF"); // Input PSFs
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "Unable to define input PSFs from RUN metadata.");
-            psFree(runImages);
-            return false;
-        }
-        if (runPSF) {
-            havePSFs = true;
-        }
-        psFree(runPSF);
-
         psArray *runSrc = pmFPAfileDefineMultipleFromRun(&status, runImages, config,
                                                          "PPSTACK.INPUT.SOURCES"); // Input sources
@@ -112,18 +100,34 @@
 
         if (convolve) {
-            psArray *runKernel = pmFPAfileDefineMultipleFromRun(&status, runImages, config,
-                                                                "PPSTACK.CONV.KERNEL"); // Convolution kernels
-            if (!status) {
-                psError(PS_ERR_UNKNOWN, false, "Unable to define convolution kernels from RUN metadata.");
-                psFree(runImages);
-                return false;
-            }
-            if (!runKernel) {
-                psError(PS_ERR_UNEXPECTED_NULL, true,
-                        "Unable to define convolution kernels from RUN metadata.");
-                psFree(runImages);
-                return false;
-            }
-            psFree(runKernel);
+            {
+                psArray *runPSF = pmFPAfileDefineMultipleFromRun(&status, runImages, config,
+                                                         "PPSTACK.INPUT.PSF"); // Input PSFs
+                if (!status) {
+                    psError(PS_ERR_UNKNOWN, false, "Unable to define input PSFs from RUN metadata.");
+                    psFree(runImages);
+                    return false;
+                }
+                if (runPSF) {
+                    havePSFs = true;
+                }
+                psFree(runPSF);
+            }
+            {
+
+                psArray *runKernel = pmFPAfileDefineMultipleFromRun(&status, runImages, config,
+                                                                    "PPSTACK.CONV.KERNEL"); // Conv'n kernels
+                if (!status) {
+                    psError(PS_ERR_UNKNOWN, false, "Unable to define convolution kernels from RUN metadata.");
+                    psFree(runImages);
+                    return false;
+                }
+                if (!runKernel) {
+                    psError(PS_ERR_UNEXPECTED_NULL, true,
+                            "Unable to define convolution kernels from RUN metadata.");
+                    psFree(runImages);
+                    return false;
+                }
+                psFree(runKernel);
+            }
         }
 
Index: branches/eam_branches/20090715/ppStack/src/ppStackMatch.c
===================================================================
--- branches/eam_branches/20090715/ppStack/src/ppStackMatch.c	(revision 25406)
+++ branches/eam_branches/20090715/ppStack/src/ppStackMatch.c	(revision 25624)
@@ -15,5 +15,5 @@
 #define SOURCE_MASK (PM_SOURCE_MODE_FAIL | PM_SOURCE_MODE_DEFECT | PM_SOURCE_MODE_SATURATED | \
                      PM_SOURCE_MODE_CR_LIMIT | PM_SOURCE_MODE_EXT_LIMIT) // Mask to apply to input sources
-#define FAINT_SOURCE_FRAC 1.0e-4         // Set minimum flux to this fraction of faintest source flux
+#define NOISE_FRACTION 0.01             // Set minimum flux to this fraction of noise
 #define COVAR_FRAC 0.01                 // Truncation fraction for covariance matrix
 
@@ -266,6 +266,8 @@
             psRegion *region = psMetadataLookupPtr(NULL, conv->analysis,
                                                    PM_SUBTRACTION_ANALYSIS_REGION); // Convolution region
-
-            pmSubtractionAnalysis(readout->analysis, kernels, region,
+            pmSubtractionKernels *kernels = psMetadataLookupPtr(NULL, conv->analysis,
+                                                                PM_SUBTRACTION_ANALYSIS_KERNEL);
+
+            pmSubtractionAnalysis(readout->analysis, NULL, kernels, region,
                                   readout->image->numCols, readout->image->numRows);
 
@@ -317,4 +319,19 @@
             pmReadout *fake = pmReadoutAlloc(NULL); // Fake readout with target PSF
 
+            psStats *bg = psStatsAlloc(PS_STAT_ROBUST_STDEV); // Statistics for background
+            psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
+            if (!psImageBackground(bg, NULL, readout->image, readout->mask, maskVal | maskBad, rng)) {
+                psError(PS_ERR_UNKNOWN, false, "Can't measure background for image.");
+                psFree(fake);
+                psFree(optWidths);
+                psFree(conv);
+                psFree(bg);
+                psFree(rng);
+                return false;
+            }
+            float minFlux = NOISE_FRACTION * bg->robustStdev; // Minimum flux level for fake image
+            psFree(rng);
+            psFree(bg);
+
             // For the sake of stamps, remove nearby sources
             psArray *stampSources = stackSourcesFilter(options->sourceLists->data[index],
@@ -323,5 +340,5 @@
             if (!pmReadoutFakeFromSources(fake, readout->image->numCols, readout->image->numRows,
                                           stampSources, SOURCE_MASK, NULL, NULL, options->psf,
-                                          NAN, footprint + size, false, true)) {
+                                          minFlux, footprint + size, false, true)) {
                 psError(PS_ERR_UNKNOWN, false, "Unable to generate fake image with target PSF.");
                 psFree(fake);
@@ -369,5 +386,5 @@
                                                                PM_SUBTRACTION_ANALYSIS_KERNEL); // Conv kernel
             if (kernel) {
-                if (!pmSubtractionMatchPrecalc(conv, NULL, readout, fake, readout->analysis,
+                if (!pmSubtractionMatchPrecalc(NULL, conv, fake, readout, readout->analysis,
                                                stride, sysError, maskVal, maskBad, maskPoor,
                                                poorFrac, badFrac)) {
@@ -383,10 +400,10 @@
                 }
             } else {
-                if (!pmSubtractionMatch(conv, NULL, readout, fake, footprint, stride, regionSize, spacing,
+                if (!pmSubtractionMatch(NULL, conv, fake, readout, footprint, stride, regionSize, spacing,
                                         threshold, stampSources, stampsName, type, size, order, widths,
                                         orders, inner, ringsOrder, binning, penalty,
                                         optimum, optWidths, optOrder, optThresh, iter, rej, sysError,
                                         maskVal, maskBad, maskPoor, poorFrac, badFrac,
-                                        PM_SUBTRACTION_MODE_1)) {
+                                        PM_SUBTRACTION_MODE_2)) {
                     psError(PS_ERR_UNKNOWN, false, "Unable to match images.");
                     psFree(fake);
Index: branches/eam_branches/20090715/ppStack/src/ppStackPSF.c
===================================================================
--- branches/eam_branches/20090715/ppStack/src/ppStackPSF.c	(revision 25406)
+++ branches/eam_branches/20090715/ppStack/src/ppStackPSF.c	(revision 25624)
@@ -9,7 +9,10 @@
 #include "ppStack.h"
 
+//#define TESTING
+
 pmPSF *ppStackPSF(const pmConfig *config, int numCols, int numRows,
                   const psArray *psfs, const psVector *inputMask)
 {
+#ifndef TESTING
     // Get the recipe values
     psMetadata *recipe = psMetadataLookupMetadata(NULL, config->recipes, PPSTACK_RECIPE); // ppStack recipe
@@ -35,4 +38,12 @@
         return NULL;
     }
+#else
+    // Dummy PSF
+    pmPSF *psf = pmPSFBuildSimple("PS_MODEL_PS1_V1", 4.0, 4.0, 0.0, 1.0);
+    if (!psf) {
+        psError(PS_ERR_UNKNOWN, false, "Unable to build dummy PSF.");
+        return NULL;
+    }
+#endif
 
     return psf;
Index: branches/eam_branches/20090715/ppStack/src/ppStackReject.c
===================================================================
--- branches/eam_branches/20090715/ppStack/src/ppStackReject.c	(revision 25406)
+++ branches/eam_branches/20090715/ppStack/src/ppStackReject.c	(revision 25624)
@@ -9,4 +9,6 @@
 #include "ppStack.h"
 #include "ppStackLoop.h"
+
+//#define TESTING
 
 bool ppStackReject(ppStackOptions *options, pmConfig *config)
