Index: /trunk/ppMerge/src/ppMergeCheckInputs.c
===================================================================
--- /trunk/ppMerge/src/ppMergeCheckInputs.c	(revision 7072)
+++ /trunk/ppMerge/src/ppMergeCheckInputs.c	(revision 7073)
@@ -49,8 +49,8 @@
         // FPAview from the specified camera format configuration, and use pmFPAAddSourceFromView), but for
         // now it's less hassle just to limit the output format to be the input format.
-        if (!data->format) {
-            data->format = pmConfigCameraFormatFromHeader(config, header);
+        if (!options->format) {
+            options->format = pmConfigCameraFormatFromHeader(config, header);
             psFree(header);
-            if (!data->format) {
+            if (!options->format) {
                 psLogMsg(__func__, PS_LOG_WARN, "Unable to identify camera format for input file %s --- "
                              "ignored.\n", name);
@@ -60,5 +60,5 @@
                 continue;
             }
-        } else if (!pmConfigValidateCameraFormat(data->format, header)) {
+        } else if (!pmConfigValidateCameraFormat(options->format, header)) {
             psLogMsg(__func__, PS_LOG_WARN, "Input file %s doesn't match camera format --- ignored.\n", name);
             // Kick it out
@@ -69,5 +69,5 @@
 
         data->in->data[i] = pmFPAConstruct(config->camera);
-        pmFPAview *view = pmFPAAddSourceFromHeader(data->in->data[i], header, data->format);
+        pmFPAview *view = pmFPAAddSourceFromHeader(data->in->data[i], header, options->format);
         psFree(view);
 
@@ -75,5 +75,5 @@
         if (!data->out) {
             data->out = pmFPAConstruct(config->camera);
-            pmFPAview *view = pmFPAAddSourceFromHeader(data->out, header, data->format);
+            pmFPAview *view = pmFPAAddSourceFromHeader(data->out, header, options->format);
             psFree(view);
         }
Index: /trunk/ppMerge/src/ppMergeConfig.c
===================================================================
--- /trunk/ppMerge/src/ppMergeConfig.c	(revision 7072)
+++ /trunk/ppMerge/src/ppMergeConfig.c	(revision 7073)
@@ -7,14 +7,13 @@
 
 // Output usage information
-static void usage(const char *programName // Name of the program
+static void usage(const char *programName, // Name of the program
+                  pmConfig *config      // Configuration (contains the arguments list)
     )
 {
     printf("Merge multiple calibration frames into a master frame by stacking.\n\n"
            "Usage:\n"
-           "\t%s OUTPUT.fits [-files FILES] [-list FILE_LIST]\n\n"
-           "where:\n"
-           "FILES       is a glob to be interpreted by the program.\n"
-           "FILE_LIST   is a list of files (including a glob interpreted by the shell).\n"
+           "\t%s OUTPUT.fits INPUT1.fits INPUT2.fits ...\n"
            "\n", programName);
+    psArgumentHelp(config->arguments);
     exit(EXIT_FAILURE);
 }
@@ -22,16 +21,12 @@
 pmConfig *ppMergeConfig(int *argc, char **argv)
 {
-    if (*argc == 1) {
-        usage(argv[0]);
+    pmConfig *config = pmConfigRead(argc, argv);
+    // Load the site-wide configuration information
+    if (! config) {
+        psErrorStackPrint(stderr, "Can't find site configuration!\n");
+        exit(EXIT_FAILURE);
     }
 
-    // Load the site-wide configuration information
-    pmConfig *config = pmConfigRead(argc, argv);
-    if (! config) {
-        psErrorStackPrint(stderr, "Can't find site configuration!\n");
-        usage(argv[0]);
-    }
-
-    // Parse other command-line arguments, save for future use
+    // Command-line arguments
     config->arguments = psMetadataAlloc(); // The arguments, with default values
     psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-type", 0, "Type of calibration frame", "");
@@ -41,7 +36,11 @@
     psMetadataAddS32(config->arguments, PS_LIST_TAIL, "-onoff", 0, "Number of on/off pairs", 0);
 
+    if (*argc == 1) {
+        usage(argv[0], config);
+    }
+
     // Parse the arguments
-    if (! psArgumentParse(config->arguments, argc, argv) || *argc != 2) {
-        usage(argv[0]);
+    if (! psArgumentParse(config->arguments, argc, argv) || *argc < 3) {
+        usage(argv[0], config);
     }
 
@@ -56,6 +55,7 @@
     psArray *files = psArrayAlloc(*argc - 2);
     for (int i = 2; i < *argc; i++) {
-        files->data[i] = psStringCopy(argv[i]);
+        files->data[i - 2] = psStringCopy(argv[i]);
     }
+    files->n = *argc - 2;
     psMetadataAddPtr(config->arguments, PS_LIST_TAIL, "INPUT", PS_DATA_ARRAY,
                      "Array of inputs images", files);
Index: /trunk/ppMerge/src/ppMergeData.c
===================================================================
--- /trunk/ppMerge/src/ppMergeData.c	(revision 7072)
+++ /trunk/ppMerge/src/ppMergeData.c	(revision 7073)
@@ -9,5 +9,4 @@
     )
 {
-    psFree(data->format);
     psFree(data->in);
     psFree(data->out);
@@ -23,5 +22,4 @@
     psMemSetDeallocator(data, (psFreeFunc)mergeDataFree);
 
-    data->format = NULL;
     data->numCells = 0;
     data->in = NULL;
Index: /trunk/ppMerge/src/ppMergeData.h
===================================================================
--- /trunk/ppMerge/src/ppMergeData.h	(revision 7072)
+++ /trunk/ppMerge/src/ppMergeData.h	(revision 7073)
@@ -7,5 +7,4 @@
 // Container for the data
 typedef struct {
-    psMetadata *format;                 // The camera format for the input and output
     int numCells;                       // Number of (valid) cells in the FPA
     psArray *in;                        // Input FPA structures
Index: /trunk/ppMerge/src/ppMergeOptions.c
===================================================================
--- /trunk/ppMerge/src/ppMergeOptions.c	(revision 7072)
+++ /trunk/ppMerge/src/ppMergeOptions.c	(revision 7073)
@@ -14,4 +14,5 @@
     )
 {
+    psFree(options->format);
     psFree(options->combine);
 }
@@ -23,4 +24,5 @@
     psMemSetDeallocator(options, (psFreeFunc)mergeOptionsFree);
 
+    options->format = NULL;
     options->rows = 0;
     options->minElectrons = NAN;
@@ -91,4 +93,32 @@
     ppMergeOptions *options = ppMergeOptionsAlloc(); // The merge options
 
+    // We need to work out the camera before we can get the recipe.  Take the first input and inspect it.
+    if (!config->camera) {
+        psArray *filenames = psMetadataLookupPtr(NULL, config->arguments, "INPUT"); // The input file names
+        psFits *inFile = psFitsOpen(filenames->data[0], "r"); // The FITS file to read
+        if (!inFile) {
+            psError(PS_ERR_IO, false, "Unable to open input file %s to determine camera.\n",
+                    filenames->data[0]);
+            exit(EXIT_FAILURE);
+        }
+        psMetadata *header = psFitsReadHeader(NULL, inFile); // The FITS (primary) header
+        psFitsClose(inFile);
+
+        options->format = pmConfigCameraFormatFromHeader(config, header);
+        psFree(header);
+        if (!options->format) {
+            psLogMsg(__func__, PS_LOG_WARN, "Unable to identify camera format for input file %s\n",
+                     filenames->data[0]);
+            exit(EXIT_FAILURE);
+        }
+    }
+
+    // Get the recipes
+    if (!config->recipes && !pmConfigReadRecipes(config)) {
+        psError(PS_ERR_IO, false, "Unable to read recipes.\n");
+        exit(EXIT_FAILURE);
+    }
+
+    // Now we can read the recipe
     bool mdok = true;                   // Status of MD lookup
     psMetadata *recipe = psMetadataLookupMD(&mdok, config->recipes, RECIPENAME); // Recipe information
Index: /trunk/ppMerge/src/ppMergeOptions.h
===================================================================
--- /trunk/ppMerge/src/ppMergeOptions.h	(revision 7072)
+++ /trunk/ppMerge/src/ppMergeOptions.h	(revision 7073)
@@ -16,4 +16,5 @@
 // Options for ppMerge
 typedef struct {
+    psMetadata *format;                 // Camera format configuration
     unsigned int rows;                  // Number of rows to read at once
     float minElectrons;                 // Minimum number of electrons for useful signal
