Index: trunk/ppViz/src/ppVizPSF/ppVizPSF.h
===================================================================
--- trunk/ppViz/src/ppVizPSF/ppVizPSF.h	(revision 26377)
+++ trunk/ppViz/src/ppVizPSF/ppVizPSF.h	(revision 26405)
@@ -11,4 +11,6 @@
     psString psfName;                   // Filename with PSF
     psString sourcesName;               // Filename with sources
+    int fakeNum;		        // Number of fake sources
+    float fakeMag;                      // Magnitude of fake sources
     psString outRoot;                   // Output root name
     float minFlux;                      // Minimum flux for sources
Index: trunk/ppViz/src/ppVizPSF/ppVizPSFArguments.c
===================================================================
--- trunk/ppViz/src/ppVizPSF/ppVizPSFArguments.c	(revision 26377)
+++ trunk/ppViz/src/ppVizPSF/ppVizPSFArguments.c	(revision 26405)
@@ -49,5 +49,7 @@
     psMetadata *arguments = psMetadataAlloc(); // Command-line arguments
     psMetadataAddStr(arguments, PS_LIST_TAIL, "-psf", 0, "Filename of PSF", NULL);
-    psMetadataAddStr(arguments, PS_LIST_TAIL, "-sources", 0, "Filename of sources", NULL);
+    psMetadataAddStr(arguments, PS_LIST_TAIL, "-sources", 0, "Filename of CMF sources", NULL);
+    psMetadataAddS32(arguments, PS_LIST_TAIL, "-fake-num", 0, "Number of fake sources", 0);
+    psMetadataAddF32(arguments, PS_LIST_TAIL, "-fake-mag", 0, "Magnitude of fake sources", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-x", 0, "x position of fake source [0..1]", NAN);
     psMetadataAddF32(arguments, PS_LIST_TAIL, "-y", 0, "y position of fake source [0..1]", NAN);
@@ -59,4 +61,6 @@
     data->psfName = psMemIncrRefCounter(psMetadataLookupStr(NULL, arguments, "-psf"));
     data->sourcesName = psMemIncrRefCounter(psMetadataLookupStr(&mdok, arguments, "-sources"));
+    data->fakeNum = psMetadataLookupS32(NULL, arguments, "-fake-num");
+    data->fakeMag = psMetadataLookupF32(NULL, arguments, "-fake-mag");
     data->outRoot = psStringCopy(argv[1]);
     data->x = psMetadataLookupF32(NULL, arguments, "-x");
Index: trunk/ppViz/src/ppVizPSF/ppVizPSFData.c
===================================================================
--- trunk/ppViz/src/ppVizPSF/ppVizPSFData.c	(revision 26377)
+++ trunk/ppViz/src/ppVizPSF/ppVizPSFData.c	(revision 26405)
@@ -28,4 +28,6 @@
     data->psfName = NULL;
     data->sourcesName = NULL;
+    data->fakeNum = 0;
+    data->fakeMag = NAN;
     data->outRoot = NULL;
     data->config = NULL;
Index: trunk/ppViz/src/ppVizPSF/ppVizPSFLoop.c
===================================================================
--- trunk/ppViz/src/ppVizPSF/ppVizPSFLoop.c	(revision 26377)
+++ trunk/ppViz/src/ppVizPSF/ppVizPSFLoop.c	(revision 26405)
@@ -74,11 +74,45 @@
                 int numCols = 0, numRows = 0;              // Size of image
                 psVector *xOffset = NULL, *yOffset = NULL; // Offset from source to true position
+
+		if (sources || (data->fakeNum > 0 && isfinite(data->fakeMag))) {
+		  numCols = psf->fieldNx;
+		  numRows = psf->fieldNy;
+		  psLogMsg("ppVizPSF", PS_LOG_INFO, "Generating %dx%d image", numCols, numRows);
+		}
                 if (sources) {
                     psMemIncrRefCounter(sources);
-                    numCols = psf->fieldNx;
-                    numRows = psf->fieldNy;
-                    psLogMsg("ppVizPSF", PS_LOG_INFO, "Generating %dx%d image from %ld input sources",
-                             numCols, numRows, sources->n);
-                } else {
+                    psLogMsg("ppVizPSF", PS_LOG_INFO, "Using %ld input sources", sources->n);
+                }
+		if (data->fakeNum > 0 && isfinite(data->fakeMag)) {
+		  long numOld = 0; // Old number of sources
+		  long numNew = -1; // New number of sources
+		  psLogMsg("ppVizPSF", PS_LOG_INFO, "Adding %d fake sources", data->fakeNum);
+		  if (sources) {
+		    numOld = sources->n;
+		    numNew = numOld + data->fakeNum;
+		    sources = psArrayRealloc(sources, numNew);
+		    sources->n = numNew;
+		  } else {
+		    numNew = data->fakeNum;
+		    sources = psArrayAlloc(numNew);
+		  }
+
+		  psRandom *rng = psRandomAlloc(PS_RANDOM_TAUS); // Random number generator
+
+		  for (int i = numOld; i < numNew; i++) {
+		    pmSource *source = pmSourceAlloc(); // Fake source
+                    sources->data[i] = source;
+		    float xSrc = psRandomUniform(rng) * numCols, ySrc = psRandomUniform(rng) * numRows; // Position of source
+
+                    pmModel *model = pmModelFromPSFforXY(psf, xSrc, ySrc, 1.0); // Model for normalisation
+                    float fluxNorm = model->modelFlux(model->params);               // Flux for peak=1
+		    float fluxPeak = powf(10.0, -0.4 * data->fakeMag) / fluxNorm; // Peak flux
+                    source->peak = pmPeakAlloc(xSrc, ySrc, fluxPeak, PM_PEAK_LONE);
+                    source->psfMag = data->fakeMag;
+                    psFree(model);
+		  }
+		}		  
+		if (!sources) {
+		  // Generate fake image with only a single realisation of the PSF
                     sources = psArrayAlloc(1);
                     pmSource *source = pmSourceAlloc(); // Fake source
