Index: /trunk/ppImage/configure.ac
===================================================================
--- /trunk/ppImage/configure.ac	(revision 7530)
+++ /trunk/ppImage/configure.ac	(revision 7531)
@@ -26,4 +26,5 @@
 PKG_CHECK_MODULES([PSMODULE], [psmodule >= 0.0.0]) 
 PKG_CHECK_MODULES([PSPHOT], [psphot >= 0.0.0]) 
+PKG_CHECK_MODULES([PSASTRO], [psastro >= 0.0.0]) 
 
 CFLAGS="${CFLAGS} -Wall -Werror -std=c99"
Index: /trunk/ppImage/src/Makefile.am
===================================================================
--- /trunk/ppImage/src/Makefile.am	(revision 7530)
+++ /trunk/ppImage/src/Makefile.am	(revision 7531)
@@ -6,6 +6,6 @@
 	ppMem.h
 
-ppImage_CPPFLAGS = $(PSLIB_CFLAGS) $(PSMODULE_CFLAGS) $(PSPHOT_CFLAGS) $(ppImage_CFLAGS)
-ppImage_LDFLAGS = $(PSLIB_LIBS) $(PSMODULE_LIBS) $(PSPHOT_LIBS)
+ppImage_CPPFLAGS = $(PSLIB_CFLAGS) $(PSMODULE_CFLAGS) $(PSPHOT_CFLAGS) $(PSASTRO_CFLAGS) $(ppImage_CFLAGS)
+ppImage_LDFLAGS = $(PSLIB_LIBS) $(PSMODULE_LIBS) $(PSPHOT_LIBS) $(PSASTRO_LIBS)
 ppImage_SOURCES = \
 	ppImage.c \
@@ -20,5 +20,5 @@
 	ppImageRebinReadout.c \
 	ppImagePhotom.c \
-	ppMem.c
+	ppImageAstrom.c
 
 #	ppImageParseCamera.c \
Index: /trunk/ppImage/src/ppImage.c
===================================================================
--- /trunk/ppImage/src/ppImage.c	(revision 7530)
+++ /trunk/ppImage/src/ppImage.c	(revision 7531)
@@ -26,5 +26,5 @@
     ppImageLoop(config, options);
 
-    psLogMsg ("psphot", 3, "complete psphot run: %f sec\n", psTimerMark ("complete"));
+    psLogMsg ("ppImage", 3, "complete ppImage run: %f sec\n", psTimerMark ("complete"));
 
     // Cleaning up
Index: /trunk/ppImage/src/ppImage.h
===================================================================
--- /trunk/ppImage/src/ppImage.h	(revision 7530)
+++ /trunk/ppImage/src/ppImage.h	(revision 7531)
@@ -6,4 +6,5 @@
 #include "psmodules.h"
 #include "psphot.h"
+#include "psastro.h"
 #include "ppImageOptions.h"
 
@@ -36,4 +37,5 @@
 
 bool ppImagePhotom (pmConfig *config, pmFPAview *view);
+bool ppImageAstrom (pmConfig *config);
 
 #endif
Index: /trunk/ppImage/src/ppImageArguments.c
===================================================================
--- /trunk/ppImage/src/ppImageArguments.c	(revision 7530)
+++ /trunk/ppImage/src/ppImageArguments.c	(revision 7531)
@@ -56,5 +56,5 @@
     if ((N = psArgumentGet (*argc, argv, "-chip"))) {
 	psArgumentRemove (N, argc, argv);
-	psMetadataAddStr (config->arguments, PS_LIST_TAIL, "CHIP_SELECTIONS", PS_DATA_STRING, "", psStringCopy(argv[N]));
+	psMetadataAddStr (config->arguments, PS_LIST_TAIL, "CHIP_SELECTIONS", PS_DATA_STRING, "", argv[N]);
 	psArgumentRemove (N, argc, argv);
     }
Index: /trunk/ppImage/src/ppImageAstrom.c
===================================================================
--- /trunk/ppImage/src/ppImageAstrom.c	(revision 7531)
+++ /trunk/ppImage/src/ppImageAstrom.c	(revision 7531)
@@ -0,0 +1,64 @@
+# include "ppImage.h"
+
+bool ppImageAstrom (pmConfig *config) {
+
+    bool status;
+
+    // find or define a pmFPAfile PSPHOT.INPUT
+    pmFPAfile *input = psMetadataLookupPtr (&status, config->files, "PSASTRO.INPUT");
+    if (!status) {
+
+	// psphotReadout requires a pmFPAfile supplied with the name PSPHOT.INPUT
+	// create a pmFPAfile which points at PPIMAGE.OUTPUT
+	// 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->mode = PM_FPA_MODE_REFERENCE;
+
+	pmFPAfileDefine (config->files, config->camera, input->fpa, "PSPHOT.OUTPUT");
+
+	// supply the output name (from cmd-line) to all output (WRITE) files
+	// XXX does this cause trouble with existing files?
+	char *outname = psMetadataLookupPtr(&status, config->arguments, "OUTPUT");
+	pmFPAfileAddFileNames (config->files, "OUTPUT", outname, PM_FPA_MODE_WRITE);
+    }
+
+    // we only was to operate on PSPHOT pmFPAfiles here:
+    pmFPAfileActivate (config->files, false, NULL);
+    pmFPAfileActivate (config->files, true, "PSASTRO.INPUT");
+    pmFPAfileActivate (config->files, true, "PSASTRO.OUTPUT");
+
+    // interpret the available initial astrometric information
+    // apply the initial guess
+    psastroAstromGuess (config);
+
+    // load the reference stars overlapping the data stars
+    psArray *refs = psastroLoadReferences (config);
+
+    psastroMosaicGetRefstars (config, refs); 
+
+    char *mosastro = psMetadataLookupStr (NULL, config->arguments, "MOSASTRO");
+    if (mosastro == NULL) {
+	psastroChipAstrom (config, refs);
+    } else {
+	psastroMosaicAstrom (config, refs);
+    }
+
+    psastroDataSave (config);
+
+    // de-activate the PSPHOT image files, activate the PPIMAGE ones
+    pmFPAfileActivate (config->files, false, NULL);
+    pmFPAfileActivate (config->files, true, "PPIMAGE.INPUT");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.BIAS");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.DARK");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.MASK");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.FLAT");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.OUTPUT");
+
+    pmFPAfileActivate (config->files, true, "PPIMAGE.BIN1");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.JPEG1");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.BIN2");
+    pmFPAfileActivate (config->files, true, "PPIMAGE.JPEG2");
+
+    return true;
+}
Index: /trunk/ppImage/src/ppImageCleanup.c
===================================================================
--- /trunk/ppImage/src/ppImageCleanup.c	(revision 7530)
+++ /trunk/ppImage/src/ppImageCleanup.c	(revision 7531)
@@ -12,4 +12,5 @@
     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");
     return;
 }
Index: /trunk/ppImage/src/ppImageDetrendReadout.c
===================================================================
--- /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 7530)
+++ /trunk/ppImage/src/ppImageDetrendReadout.c	(revision 7531)
@@ -39,9 +39,11 @@
 
     // Bias, dark and overscan subtraction are all merged.
-    ppImageDetrendBias(input, bias, dark, options);
+    if (options->doBias || options->doDark) {
+	ppImageDetrendBias(input, bias, dark, options);
+    }
 
     // Flat-field correction (no options used?)
     if (options->doFlat) {
-        pmReadout *flat = pmFPAfileThisReadout (config->files, detview, "PPIMAGE.FLAT");
+	pmReadout *flat = pmFPAfileThisReadout (config->files, detview, "PPIMAGE.FLAT");
         pmFlatField(input, flat);
     }
@@ -50,7 +52,2 @@
     return true;
 }
-
-    // XXX in psphot, the recipe options are parsed at this depth
-    // XXX consider if we move ppImageOptions in here
-    // psMetadata *recipe  = psMetadataLookupPtr (&status, config->recipes, "PSPHOT");
-
Index: /trunk/ppImage/src/ppImageLoop.c
===================================================================
--- /trunk/ppImage/src/ppImageLoop.c	(revision 7530)
+++ /trunk/ppImage/src/ppImageLoop.c	(revision 7531)
@@ -20,10 +20,10 @@
 
     while ((chip = pmFPAviewNextChip (view, input->fpa, 1)) != NULL) {
-        psLogMsg ("psphot", 4, "Chip %d: %x %x\n", view->chip, chip->file_exists, chip->process);
+        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);
 
 	while ((cell = pmFPAviewNextCell (view, input->fpa, 1)) != NULL) {
-            psLogMsg ("psphot", 4, "Cell %d: %x %x\n", view->cell, cell->file_exists, cell->process);
+            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);
@@ -48,5 +48,5 @@
 
 	// we perform photometry on the readouts of this chip in the output
-	ppImagePhotom (config, view);
+	if (options->doPhotom) ppImagePhotom (config, view);
 
 	pmFPAfileIOChecks (config->files, view, PM_FPA_AFTER);
@@ -62,5 +62,6 @@
     }
 
-    // ppImageAstrom (config);
+    // we perform astrometry on all chips after sources have been detected
+    if (options->doAstrom) ppImageAstrom (config);
     
     // ppImageFPAMosaic (config, view);
Index: /trunk/ppImage/src/ppImageOptions.c
===================================================================
--- /trunk/ppImage/src/ppImageOptions.c	(revision 7530)
+++ /trunk/ppImage/src/ppImageOptions.c	(revision 7531)
@@ -18,12 +18,4 @@
     options->nonLinearSource = NULL;
 
-    return options;
-}
-
-ppImageOptions *ppImageOptionsParse(pmConfig *config)
-{
-    bool status;
-    ppImageOptions *options = ppImageOptionsAlloc ();
-
     // default flags for various activities
     options->doMask   	= false;	// Mask bad pixels
@@ -36,13 +28,14 @@
     options->doFlat   	= false;	// Flat-field normalisation
     options->doFringe 	= false;	// Fringe subtraction
-    options->doSource 	= false;	// Source identification and photometry
+    options->doPhotom 	= false;	// Source identification and photometry
     options->doAstrom 	= false;	// Astrometry
+
+    options->doBin1 	= false;	// create binned image (scale 1)
+    options->doBin2 	= false;	// create binned image (scale 2)
+    options->doBin1JPG 	= false;	// create jpg of binned image (scale 1)
+    options->doBin2JPG 	= false;	// create jpg of binned image (scale 2)
 
     // Overscan defaults
     options->overscan      = NULL;	// Overscan options
-    bool overscanSingle    = false;	// A single value for entire overscan?
-    pmFit overscanFit      = PM_FIT_NONE; // Fit type for overscan
-    int overscanOrder      = 0;		// Order for overscan fit
-    psStats *overscanStats = NULL;      // Statistics for overscan
 
     // Non-linearity default options
@@ -50,4 +43,12 @@
     options->nonLinearData   = NULL;	// The non-linearity data
     options->nonLinearSource = NULL;    // If the non-linearity data is a menu, this provides the key
+
+    return options;
+}
+
+ppImageOptions *ppImageOptionsParse(pmConfig *config)
+{
+    bool status;
+    ppImageOptions *options = ppImageOptionsAlloc ();
 
     // select the recipe for this analysis
@@ -105,7 +106,9 @@
 
         // Do the overscan as a single value?
-        overscanSingle = psMetadataLookupBool(NULL, recipe, "OVERSCAN.SINGLE");
+        bool overscanSingle = psMetadataLookupBool(NULL, recipe, "OVERSCAN.SINGLE");
 
         // How do we fit it?
+	pmFit overscanFit = PM_FIT_NONE; // Fit type for overscan
+	int overscanOrder = 0;		// Order for overscan fit
         psString fit = psMetadataLookupStr(NULL, recipe, "OVERSCAN.FIT");
         if (! strcasecmp(fit, "POLYNOMIAL")) {
@@ -118,8 +121,10 @@
             overscanFit = PM_FIT_SPLINE;
         } else if (strcasecmp(fit, "NONE")) {
-            psLogMsg(__func__, PS_LOG_WARN, "OVERSCAN.FIT (%s) in recipe %s is not one of NONE, "
-                     "POLYNOMIAL, or SPLINE: assuming NONE.\n", fit, RECIPE_NAME);
+            psLogMsg(__func__, PS_LOG_WARN, "OVERSCAN.FIT (%s) in recipe %s is not one of NONE, POLYNOMIAL, or SPLINE", fit, RECIPE_NAME);
+	    exit(EXIT_FAILURE);
         }
 
+	// What method do we use to measure the overscan statistics?
+	psStats *overscanStats = NULL;	// Statistics for overscan
         psString stat = psMetadataLookupStr(NULL, recipe, "OVERSCAN.STAT");
         if (! strcasecmp(stat, "MEAN")) {
@@ -128,7 +133,6 @@
             overscanStats = psStatsAlloc(PS_STAT_SAMPLE_MEDIAN);
         } else {
-            psErrorStackPrint(stderr, "OVERSCAN.STAT (%s) in recipe %s is not one of MEAN, MEDIAN: "
-                              "assuming MEAN\n", stat, RECIPE_NAME);
-            overscanStats = psStatsAlloc(PS_STAT_SAMPLE_MEAN);
+            psErrorStackPrint(stderr, "OVERSCAN.STAT (%s) in recipe %s is not one of MEAN or MEDIAN", stat, RECIPE_NAME);
+	    exit(EXIT_FAILURE);
         }
 
@@ -161,9 +165,24 @@
 
     options->doBin1 = psMetadataLookupBool(NULL, recipe, "BIN1.FITS");
+    options->doBin1JPG = psMetadataLookupBool(NULL, recipe, "BIN1.JPEG");
+    if (options->doBin1JPG && !options->doBin1) {
+	psLogMsg(__func__, PS_LOG_ERROR, "Invalid Phase2 Options: cannot make JPG of Bin1 image without Bin1 image");
+	exit(EXIT_FAILURE);
+    }
+
     options->doBin2 = psMetadataLookupBool(NULL, recipe, "BIN2.FITS");
+    options->doBin2JPG = psMetadataLookupBool(NULL, recipe, "BIN2.JPEG");
+    if (options->doBin2JPG && !options->doBin2) {
+	psLogMsg(__func__, PS_LOG_ERROR, "Invalid Phase2 Options: cannot make JPG of Bin2 image without Bin2 image");
+	exit(EXIT_FAILURE);
+    }
+    
+    options->doPhotom = psMetadataLookupBool(NULL, recipe, "PHOTOM");
+    options->doAstrom = psMetadataLookupBool(NULL, recipe, "ASTROM");
+    if (options->doAstrom && !options->doPhotom) {
+	psLogMsg(__func__, PS_LOG_ERROR, "Invalid Phase2 Options: cannot do ASTROMetry without PHOTOMetry");
+	exit(EXIT_FAILURE);
+    }
 
-    // options->doBin1JPEG = psMetadataLookupBool(NULL, recipe, "BIN1.JPEG");
-    // options->doBin2JPEG = psMetadataLookupBool(NULL, recipe, "BIN2.JPEG");
-    
     return options;
 }
Index: /trunk/ppImage/src/ppImageOptions.h
===================================================================
--- /trunk/ppImage/src/ppImageOptions.h	(revision 7530)
+++ /trunk/ppImage/src/ppImageOptions.h	(revision 7531)
@@ -11,5 +11,5 @@
     bool doFlat;                        // Flat-field normalisation
     bool doFringe;                      // Fringe subtraction
-    bool doSource;                      // Source identification and photometry
+    bool doPhotom;                      // Source identification and photometry
     bool doAstrom;                      // Astrometry
 
@@ -23,7 +23,9 @@
 
     bool doBin1;
+    bool doBin1JPG;
     int xBin1, yBin1;
 
     bool doBin2;
+    bool doBin2JPG;
     int xBin2, yBin2;
 
Index: /trunk/ppImage/src/ppImageParseCamera.c
===================================================================
--- /trunk/ppImage/src/ppImageParseCamera.c	(revision 7530)
+++ /trunk/ppImage/src/ppImageParseCamera.c	(revision 7531)
@@ -53,9 +53,13 @@
     if (options->doBin1) {
 	pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin1, options->yBin1, "PPIMAGE.BIN1");
-	pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG1");
+	if (options->doBin1JPG) {
+	    pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG1");
+	}
     }
     if (options->doBin2) {
 	pmFPAfile *file = pmFPAfileFromFPA (config, input->fpa, options->xBin2, options->yBin2, "PPIMAGE.BIN2");
-	pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG2");
+	if (options->doBin2JPG) {
+	    pmFPAfileDefine (config->files, config->camera, file->fpa, "PPIMAGE.JPEG2");
+	}
     }
 
