Index: trunk/ippTools/src/caltool.c
===================================================================
--- trunk/ippTools/src/caltool.c	(revision 18531)
+++ trunk/ippTools/src/caltool.c	(revision 18561)
@@ -110,10 +110,4 @@
 
     psString query = psStringCopy("SELECT * FROM calDB");
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
-        psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
 
     // treat limit == 0 as "no limit"
@@ -195,19 +189,32 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where,  "-cal_id",     "cal_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-simple", false);
 
     psString query = psStringCopy("SELECT * FROM calRun");
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
+    if (faulted) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "WHERE fault != 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "WHERE fault = 0");
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
         psStringAppend(&query, " %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
     if (limit) {
         psString limitString = psDBGenerateLimitSQL(limit);
-        psStringAppend(&query, " %s", limitString);
+        psStringAppend(&query, " AND %s", limitString);
         psFree(limitString);
     }
Index: trunk/ippTools/src/caltoolConfig.c
===================================================================
--- trunk/ippTools/src/caltoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/caltoolConfig.c	(revision 18561)
@@ -49,35 +49,24 @@
     // -adddb
     psMetadata *adddbArgs = psMetadataAlloc();
-    psMetadataAddStr(adddbArgs, PS_LIST_TAIL, "-dvodb",  0,
-            "define DVO db (required)", NULL);
+    psMetadataAddStr(adddbArgs, PS_LIST_TAIL, "-dvodb",  0,            "define DVO db (required)", NULL);
 
     // -dbs
     psMetadata *dbsArgs = psMetadataAlloc();
-    psMetadataAddU64(dbsArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(dbsArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddU64(dbsArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(dbsArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -addrun
     psMetadata *addrunArgs = psMetadataAlloc();
-    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-cal_id",  0,
-            "define calibration DB ID (required)", NULL);
-    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-region",  0,
-            "define region (required)", NULL);
-    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-last_step",  0,
-            "define last step (required)", NULL);
-    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-state",  0,
-            "define state (required)", NULL);
+    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-cal_id",  0,            "define calibration DB ID (required)", NULL);
+    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-region",  0,            "define region (required)", NULL);
+    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-last_step",  0,            "define last step (required)", NULL);
+    psMetadataAddStr(addrunArgs, PS_LIST_TAIL, "-state",  0,            "define state (required)", NULL);
 
     // -runs
     psMetadata *runsArgs = psMetadataAlloc();
-    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-cal_id",  0,
-            "search for calibration ID", NULL);
-    psMetadataAddU64(runsArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-cal_id",  0,            "search for calibration ID", NULL);
+    psMetadataAddU64(runsArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     psFree(now);
@@ -86,12 +75,8 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXOPT_ADD_MODE("-adddb",   "add a DVO calibration DB",
-        CALTOOL_MODE_ADDDB,     adddbArgs);
-    PXOPT_ADD_MODE("-dbs",     "list DVO calibration DBs",
-        CALTOOL_MODE_DBS,       dbsArgs);
-    PXOPT_ADD_MODE("-addrun",  "add the results of a calibration run",
-        CALTOOL_MODE_ADDRUN,    addrunArgs);
-    PXOPT_ADD_MODE("-runs",    "list the results of calibration runs",
-        CALTOOL_MODE_RUNS,      runsArgs);
+    PXOPT_ADD_MODE("-adddb",   "add a DVO calibration DB",        CALTOOL_MODE_ADDDB,     adddbArgs);
+    PXOPT_ADD_MODE("-dbs",     "list DVO calibration DBs",        CALTOOL_MODE_DBS,       dbsArgs);
+    PXOPT_ADD_MODE("-addrun",  "add the results of a calibration run",        CALTOOL_MODE_ADDRUN,    addrunArgs);
+    PXOPT_ADD_MODE("-runs",    "list the results of calibration runs",        CALTOOL_MODE_RUNS,      runsArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
@@ -105,54 +90,4 @@
     psFree(argSets);
     psFree(modes);
-
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-    addWhereStr(det_id);
-    {
-        // XXX this is broke because you can't specify -iteration 0
-        psMetadataItem *item = psMetadataLookup(config->args, "-iteration");
-        if (item && psStrcasestr(item->comment, "found")) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "iteration", 0, "==", item->data.S32)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    addWhereStr(det_id);
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
 
     // define Database handle, if used
Index: trunk/ippTools/src/camtool.c
===================================================================
--- trunk/ippTools/src/camtool.c	(revision 18531)
+++ trunk/ippTools/src/camtool.c	(revision 18561)
@@ -110,5 +110,4 @@
     PXOPT_COPY_STR(config->args, where, "-reduction", "reduction", "==");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
-
     PXOPT_COPY_F64(config->args, where, "-airmass_min", "airmass", ">=");
     PXOPT_COPY_F64(config->args, where, "-airmass_max", "airmass", "<");
@@ -162,4 +161,5 @@
     }
 
+    // use psDBGenerateWhereSQL because the SQL yields an intermediate table
     if (where && psListLength(where->list)) {
         psString whereClause = psDBGenerateWhereSQL(where, NULL);
@@ -263,5 +263,4 @@
     PXOPT_COPY_STR(config->args, where, "-reduction", "reduction", "==");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
-
     PXOPT_COPY_F64(config->args, where, "-airmass_min", "airmass", ">=");
     PXOPT_COPY_F64(config->args, where, "-airmass_max", "airmass", "<");
@@ -334,4 +333,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-cam_id", "cam_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -343,9 +346,11 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
-        psStringAppend(&query, " %s", whereClause);
+    // use psDBGenerateWhereSQL because the SQL yields an intermediate table
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
+        psStringAppend(&query, "%s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -390,4 +395,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-cam_id",   "cam_id",   "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id",  "chip_id",  "==");
+    PXOPT_COPY_STR(config->args, where, "-class",    "class",    "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
@@ -398,9 +409,11 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
-        psStringAppend(&query, " %s", whereClause);
+    // use psDBGenerateWhereSQL because the SQL yields an intermediate table
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
+        psStringAppend(&query, "%s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -463,25 +476,14 @@
     PXOPT_LOOKUP_F32(dtime_astrom, config->args, "-dtime_astrom", false, false);
     PXOPT_LOOKUP_STR(hostname, config->args,       "-hostname", false, false);
-    PXOPT_LOOKUP_F32(n_stars, config->args, "-n_stars", false, false);
-    PXOPT_LOOKUP_F32(n_extended, config->args, "-n_extended", false, false);
-    if (n_extended < 0) {
-        psError(PS_ERR_UNKNOWN, true, "-n_extended is required");
-        return false;
-    }
-    PXOPT_LOOKUP_F32(n_cr, config->args, "-n_cr", false, false);
-    if (n_cr < 0) {
-        psError(PS_ERR_UNKNOWN, true, "-n_cr is required");
-        return false;
-    }
-    PXOPT_LOOKUP_F32(n_astrom, config->args, "-n_astrom", false, false);
-    if (n_astrom < 0) {
-        psError(PS_ERR_UNKNOWN, true, "-n_astrom is required");
-        return false;
-    }
-
+    PXOPT_LOOKUP_S32(n_stars, config->args,        "-n_stars", false, false);
+    PXOPT_LOOKUP_S32(n_extended, config->args,     "-n_extended", false, false);
+    PXOPT_LOOKUP_S32(n_cr, config->args,           "-n_cr", false, false);
+    PXOPT_LOOKUP_S32(n_astrom, config->args,       "-n_astrom", false, false);
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
-
-    // default
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    // generate restrictions
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-cam_id",   "cam_id",   "==");
 
     psString query = pxDataGet("camtool_find_pendingexp.sql");
@@ -491,24 +493,11 @@
     }
 
-    {
-        // build a query to search by cam_id
-        psMetadata *where = psMetadataAlloc();
-        if (cam_id) {
-            if (!psMetadataAddS64(where, PS_LIST_TAIL, "cam_id", 0, "==", cam_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-
+    // use psDBGenerateWhereSQL because the SQL yields an intermediate table
+    if (psListLength(where->list)) {
         psString whereClaus = psDBGenerateWhereSQL(where, NULL);
-        psFree(where);
-        if (whereClaus) {
-            psStringAppend(&query, " %s", whereClaus);
-            psFree(whereClaus);
-        }
-
-    }
+	psStringAppend(&query, "%s", whereClaus);
+	psFree(whereClaus);
+    }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -640,4 +629,9 @@
     PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
+    // generate restrictions
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-cam_id",   "cam_id",   "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id",  "chip_id",   "==");
+
     psString query = pxDataGet("camtool_find_processedexp.sql");
     if (!query) {
@@ -646,9 +640,11 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
+    // use psDBGenerateWhereConditionalSQL with AND ... because the SQL ends in a WHERE
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -716,7 +712,6 @@
     PXOPT_COPY_STR(config->args, where, "-reduction", "reduction", "==");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
-
-    PXOPT_COPY_F64(config->args, where, "-airmass_min", "airmass", ">=");
-    PXOPT_COPY_F64(config->args, where, "-airmass_max", "airmass", "<");
+    PXOPT_COPY_F32(config->args, where, "-airmass_min", "airmass", ">=");
+    PXOPT_COPY_F32(config->args, where, "-airmass_max", "airmass", "<");
     PXOPT_COPY_F64(config->args, where, "-ra_min", "ra", ">=");
     PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
@@ -745,6 +740,5 @@
     PXOPT_COPY_F32(config->args, where, "-solang_max", "solang", "<");
 
-    if (!psListLength(where->list)
-        && !psMetadataLookupBool(NULL, config->args, "-all")) {
+    if (!psListLength(where->list) && !psMetadataLookupBool(NULL, config->args, "-all")) {
         psFree(where);
         psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
@@ -758,61 +752,63 @@
     }
 
-{
-    psString query = pxDataGet("camtool_reset_faulted_runs.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        psFree(where);
-        return false;
-    }
-
-    if (where && psListLength(where->list)) {
-        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        psFree(where);
-        return false;
-    }
-    psFree(query);
-}
-
-{
-    psString query = pxDataGet("camtool_revertprocessedexp.sql");
-    if (!query) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        psFree(where);
-        return false;
-    }
-
-    if (where && psListLength(where->list)) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        psFree(where);
-        return false;
-    }
-    psFree(query);
-}
+    {
+	psString query = pxDataGet("camtool_reset_faulted_runs.sql");
+	if (!query) {
+	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	    psFree(where);
+	    return false;
+	}
+
+	// use psDBGenerateWhereConditionalSQL with AND ... because the SQL ends in a WHERE
+	if (where && psListLength(where->list)) {
+	    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+	    psStringAppend(&query, " AND %s", whereClause);
+	    psFree(whereClause);
+	}
+
+	if (!p_psDBRunQuery(config->dbh, query)) {
+	    // rollback
+	    if (!psDBRollback(config->dbh)) {
+		psError(PS_ERR_UNKNOWN, false, "database error");
+	    }
+	    psError(PS_ERR_UNKNOWN, false, "database error");
+	    psFree(query);
+	    psFree(where);
+	    return false;
+	}
+	psFree(query);
+    }
+
+    {
+	psString query = pxDataGet("camtool_revertprocessedexp.sql");
+	if (!query) {
+	    // rollback
+	    if (!psDBRollback(config->dbh)) {
+		psError(PS_ERR_UNKNOWN, false, "database error");
+	    }
+	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	    psFree(where);
+	    return false;
+	}
+
+	// use psDBGenerateWhereConditionalSQL with AND ... because the SQL ends in a WHERE
+	if (where && psListLength(where->list)) {
+	    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+	    psStringAppend(&query, " AND %s", whereClause);
+	    psFree(whereClause);
+	}
+
+	if (!p_psDBRunQuery(config->dbh, query)) {
+	    // rollback
+	    if (!psDBRollback(config->dbh)) {
+		psError(PS_ERR_UNKNOWN, false, "database error");
+	    }
+	    psError(PS_ERR_UNKNOWN, false, "database error");
+	    psFree(query);
+	    psFree(where);
+	    return false;
+	}
+	psFree(query);
+    }
     psFree(where);
 
@@ -832,8 +828,16 @@
     PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
-    if (!pxSetFaultCode(config->dbh, "camProcessedExp", config->where, code)) {
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-cam_id",   "cam_id",   "==");
+    PXOPT_COPY_S64(config->args, where, "-chip_id",  "chip_id",  "==");
+    PXOPT_COPY_STR(config->args, where, "-class",    "class",    "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+
+    if (!pxSetFaultCode(config->dbh, "camProcessedExp", where, code)) {
         psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
-        return false;
-    }
+	psFree (where);
+        return false;
+    }
+    psFree (where);
 
     return true;
Index: trunk/ippTools/src/camtoolConfig.c
===================================================================
--- trunk/ippTools/src/camtoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/camtoolConfig.c	(revision 18561)
@@ -47,415 +47,230 @@
 
     // -definebyquery
+    // XXX need to allow multiple chip_ids
+    // XXX need to allow multiple exp_ids
     psMetadata *definebydefinebyqueryArgs = psMetadataAlloc();
+    psMetadataAddS64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-chip_id",            0, "search by chip_id", 0);
+    psMetadataAddS64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_id",  	     0, "search by exp_id", 0);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_name",  	     0, "search by exp_name", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-inst",  	     0, "search for camera", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-telescope",  	     0, "search for telescope", NULL);
+    psMetadataAddTime(definebydefinebyqueryArgs, PS_LIST_TAIL, "-dateobs_begin",     0, "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(definebydefinebyqueryArgs, PS_LIST_TAIL, "-dateobs_end",       0, "search for exposures by time (<)", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_tag",            0, "search by exp_tag", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_type",  	     0, "search by exp_type", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-filelevel",  	     0, "search by filelevel", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-reduction",  	     0, "search by reduction class", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-filter",  	     0, "search for filter", NULL);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-airmass_min",  	     0, "define min airmass", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-airmass_max",  	     0, "define max airmass", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ra_min",  	     0, "define min", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ra_max",  	     0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-decl_min",  	     0, "define min", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-decl_max",  	     0, "define max", NAN);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_time_min",       0, "define min", NAN);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_time_max",       0, "define max", NAN);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-sat_pixel_frac_min", 0, "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-sat_pixel_frac_max", 0, "define min fraction of saturated pixels", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_min",  	     0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_max",  	     0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_stdev_min",       0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_stdev_max",       0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-alt_min",            0, "define min", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-alt_max",  	     0, "define max", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-az_min",  	     0, "define min", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-az_max",  	     0, "define max", NAN);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_min",       0, "define min ccd tempature", NAN);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_max",       0, "define max ccd tempature", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-posang_min",  	     0, "define min rotator position angle", NAN);
+    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-posang_max",  	     0, "define max rotator position angle", NAN);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-object",  	     0, "search by exposure object", NULL);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-solang_min",  	     0, "define min solar angle", NAN);
+    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-solang_max",  	     0, "define max solar angle", NAN);
+
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_workdir",  	     0, "define workdir", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_label",  	     0, "define label", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_reduction",      0, "define reduction class", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_expgroup",       0, "define exposure group", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_dvodb",  	     0, "define DVO db", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_tess_id",  	     0, "define tess ID", NULL);
+    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_end_stage",      0, "define end stage", NULL);
+    psMetadataAddBool(definebydefinebyqueryArgs, PS_LIST_TAIL, "-all",  	     0, "allow everything to be queued without search terms", false);
+
+    // -updaterun
+    // XXX need to allow multiple cam_ids
     // XXX need to allow multiple chip_ids
-    psMetadataAddS64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", 0);
     // XXX need to allow multiple exp_ids
-    psMetadataAddS64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", 0);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_name",  0,
-            "search by exp_name", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-inst",  0,
-            "search for camera", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddTime(definebydefinebyqueryArgs, PS_LIST_TAIL, "-dateobs_begin", 0,
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(definebydefinebyqueryArgs, PS_LIST_TAIL, "-dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_tag",  0,
-            "search by exp_tag", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "search by exp_type", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "search by filelevel", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-reduction",  0,
-            "search by reduction class", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-filter",  0,
-            "search for filter", NULL);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ra_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ra_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-decl_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-decl_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min", NAN);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,
-            "define min fraction of saturated pixels", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-alt_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-alt_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-az_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-az_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(definebydefinebyqueryArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-object",  0,
-            "search by exposure object", NULL);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF32(definebydefinebyqueryArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_workdir",  0,
-            "define workdir", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_label",  0,
-            "define label", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_reduction",  0,
-            "define reduction class", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_expgroup",  0,
-            "define exposure group", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_dvodb",  0,
-            "define DVO db", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_tess_id",  0,
-            "define tess ID", NULL);
-    psMetadataAddStr(definebydefinebyqueryArgs, PS_LIST_TAIL, "-set_end_stage",  0,
-            "define end stage", NULL);
-    psMetadataAddBool(definebydefinebyqueryArgs, PS_LIST_TAIL, "-all",  0,
-            "allow everything to be queued without search terms", false);
-
-    // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    // XXX need to allow multiple cam_ids
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-cam_id",  0,
-            "search by cam_id", 0);
-    // XXX need to allow multiple chip_ids
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", 0);
-    // XXX need to allow multiple exp_ids
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", 0);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",  0,
-            "search by exp_name", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-inst",  0,
-            "search for camera", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_begin", 0,
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_tag",  0,
-            "search by exp_tag", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "search by exp_type", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "search by filelevel", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-reduction",  0,
-            "search by reduction class", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filter",  0,
-            "search for filter", NULL);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,
-            "define min fraction of saturated pixels", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-object",  0,
-            "search by exposure object", NULL);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-
-    psMetadataAddBool(updaterunArgs, PS_LIST_TAIL, "-all",  0,
-            "allow everything to be queued without search terms", false);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
-            "set state", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label", 0,
-            "set label", NULL);
-
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-cam_id",             0, "search by cam_id", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",  		 0, "search by chip_id", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",  		 0, "search by exp_id", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",  	 0, "search by exp_name", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-inst",  		 0, "search for camera", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-telescope",  	 0, "search for telescope", NULL);
+    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_begin", 	 0, "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_end", 	 0, "search for exposures by time (<)", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_tag",  		 0, "search by exp_tag", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_type",  	 0, "search by exp_type", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filelevel",  	 0, "search by filelevel", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-reduction",  	 0, "search by reduction class", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filter",  		 0, "search for filter", NULL);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-airmass_min",  	 0, "define min airmass", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-airmass_max",  	 0, "define max airmass", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_min",  		 0, "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_max",  		 0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_min",  	 0, "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_max",  	 0, "define max", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_min",  	 0, "define min", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_max",  	 0, "define max", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_min", 0, "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_max", 0, "define min fraction of saturated pixels", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_min",  		 0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_max",  		 0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_min",  	 0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_max",  	 0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_min",  		 0, "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_max",  		 0, "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_min",  		 0, "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_max",  		 0, "define max", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_min",  	 0, "define min ccd tempature", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_max",  	 0, "define max ccd tempature", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_min",  	 0, "define min rotator position angle", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_max",  	 0, "define max rotator position angle", NAN);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-object",  		 0, "search by exposure object", NULL);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_min",  	 0, "define min solar angle", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_max",  	 0, "define max solar angle", NAN);
+
+    psMetadataAddBool(updaterunArgs, PS_LIST_TAIL, "-all",               0, "allow everything to be queued without search terms", false);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state",              0, "set state", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label",              0, "set label", NULL);
 
     // -pendingexp
     psMetadata *pendingexpArgs = psMetadataAlloc();
-    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", 0);
-    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "search by chiptool ID", 0);
-    psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
-
+    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-cam_id",            0, "search by camtool ID", 0);
+    psMetadataAddS64(pendingexpArgs, PS_LIST_TAIL, "-chip_id",           0, "search by chiptool ID", 0);
+    psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",             0, "limit result set to N items", 0);
+    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-simple",           0, "use the simple output format", false);
 
     // -pendingimfile
     psMetadata *pendingimfileArgs = psMetadataAlloc();
-    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", 0);
-    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "search by chiptool ID", 0);
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-class", 0,
-            "search by class", NULL);
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-class_id", 0,
-            "search by class ID", NULL);
-    psMetadataAddBool(pendingimfileArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
-
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-cam_id", 0,            "search by camtool ID", 0);
+    psMetadataAddS64(pendingimfileArgs, PS_LIST_TAIL, "-chip_id", 0,            "search by chiptool ID", 0);
+    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-class", 0,            "search by class", NULL);
+    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-class_id", 0,            "search by class ID", NULL);
+    psMetadataAddBool(pendingimfileArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -addprocessedexp
     psMetadata *addprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddS64(addprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "define camtool ID (required)", 0);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-uri", 0,
-            "define URI (required)", NULL);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg", 0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev", 0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev", 0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-bias",  0,
-            "define bias", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-bias_stdev",  0,
-            "define bias stdev", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_0",  0,
-            "define fringe term 0", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_1",  0,
-            "define fringe term 1", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_2",  0,
-            "define fringe term 2", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-sigma_ra", 0,
-            "define exposure E ra", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-sigma_dec", 0,
-            "define exposure E dec", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-ap_resid",  0,
-            "define aperture residual", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-ap_resid_stdev",  0,
-            "define aperture residual stdev", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zp_mean", 0,
-            "define zero point mean", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zp_stdev", 0,
-            "define zero point stdev", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_major", 0,
-            "define FWHM (major axis; arcsec)", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_minor", 0,
-            "define FWHM (minor axis; arcsec)", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-dtime_detrend", 0,
-            "define elapsed detrend processing time (seconds)", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-dtime_photom", 0,
-            "define elapsed photometry processing time (seconds)", NAN);
-    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-dtime_astrom", 0,
-            "define elapsed astrometry processing time (seconds)", NAN);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-hostname", 0,
-            "define hostname", NULL);
-    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_stars", 0,
-            "define number of stars", 0);
-    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_extended", 0,
-            "define number of extended objects", 0);
-    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_cr", 0,
-            "define number of cosmic rays", 0);
-    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_astrom", 0,
-            "define number of astrometry reference objects", 0);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-path_base", 0,
-            "define base output location", NULL);
-    psMetadataAddS16(addprocessedexpArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
-    psMetadataAddBool(addprocessedexpArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
+    psMetadataAddS64(addprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,            "define camtool ID (required)", 0);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-uri", 0,            "define URI (required)", NULL);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg", 0,            "define exposure background", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev", 0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev", 0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-bias",  0,            "define bias", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-bias_stdev",  0,            "define bias stdev", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_0",  0,            "define fringe term 0", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_1",  0,            "define fringe term 1", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_2",  0,            "define fringe term 2", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-sigma_ra", 0,            "define exposure E ra", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-sigma_dec", 0,            "define exposure E dec", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-ap_resid",  0,            "define aperture residual", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-ap_resid_stdev",  0,            "define aperture residual stdev", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zp_mean", 0,            "define zero point mean", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-zp_stdev", 0,            "define zero point stdev", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_major", 0,            "define FWHM (major axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-fwhm_minor", 0,            "define FWHM (minor axis; arcsec)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-dtime_detrend", 0,            "define elapsed detrend processing time (seconds)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-dtime_photom", 0,            "define elapsed photometry processing time (seconds)", NAN);
+    psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-dtime_astrom", 0,            "define elapsed astrometry processing time (seconds)", NAN);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-hostname", 0,            "define hostname", NULL);
+    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_stars", 0,            "define number of stars", 0);
+    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_extended", 0,            "define number of extended objects", 0);
+    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_cr", 0,            "define number of cosmic rays", 0);
+    psMetadataAddS32(addprocessedexpArgs, PS_LIST_TAIL, "-n_astrom", 0,            "define number of astrometry reference objects", 0);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", NULL);
+    psMetadataAddS16(addprocessedexpArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddBool(addprocessedexpArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
 
     // -processedexp
     psMetadata *processedexpArgs = psMetadataAlloc();
-    psMetadataAddS64(processedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", 0);
-    psMetadataAddS64(processedexpArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "search by chiptool ID", 0);
-    psMetadataAddU64(processedexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
-    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
+    psMetadataAddS64(processedexpArgs, PS_LIST_TAIL, "-cam_id", 0,            "search by camtool ID", 0);
+    psMetadataAddS64(processedexpArgs, PS_LIST_TAIL, "-chip_id", 0,            "search by chiptool ID", 0);
+    psMetadataAddU64(processedexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
+    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
 
     // -revertprocessedexp
+    // XXX need to allow multiple cam_ids
+    // XXX need to allow multiple chip_ids
+    // XXX need to allow multiple exp_ids
     psMetadata *revertprocessedexpArgs = psMetadataAlloc();
-    // XXX need to allow multiple cam_ids
-    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-cam_id",  0,
-            "search by cam_id", 0);
-    // XXX need to allow multiple chip_ids
-    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", 0);
-    // XXX need to allow multiple exp_ids
-    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", 0);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_name",  0,
-            "search by exp_name", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-inst",  0,
-            "search for camera", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddTime(revertprocessedexpArgs, PS_LIST_TAIL, "-dateobs_begin", 0,
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(revertprocessedexpArgs, PS_LIST_TAIL, "-dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_tag",  0,
-            "search by exp_tag", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "search by exp_type", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "search by filelevel", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-reduction",  0,
-            "search by reduction class", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-filter",  0,
-            "search for filter", NULL);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-ra_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-ra_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-decl_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-decl_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min", NAN);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,
-            "define min fraction of saturated pixels", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-alt_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-alt_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-az_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-az_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-object",  0,
-            "search by exposure object", NULL);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-
-    psMetadataAddBool(revertprocessedexpArgs, PS_LIST_TAIL, "-all",  0,
-            "allow everything to be queued without search terms", false);
-    psMetadataAddS16(revertprocessedexpArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-cam_id",  0,            "search by cam_id", 0);
+    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chip_id", 0);
+    psMetadataAddS64(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", 0);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_name",  0,            "search by exp_name", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-inst",  0,            "search for camera", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-telescope",  0,            "search for telescope", NULL);
+    psMetadataAddTime(revertprocessedexpArgs, PS_LIST_TAIL, "-dateobs_begin", 0,            "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(revertprocessedexpArgs, PS_LIST_TAIL, "-dateobs_end", 0,            "search for exposures by time (<)", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_tag",  0,            "search by exp_tag", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_type",  0,            "search by exp_type", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-filelevel",  0,            "search by filelevel", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-reduction",  0,            "search by reduction class", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-filter",  0,            "search for filter", NULL);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-ra_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-ra_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-decl_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-decl_max",  0,            "define max", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_time_min",  0,            "define min", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_time_max",  0,            "define max", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,            "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,            "define min fraction of saturated pixels", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_min",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-alt_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-alt_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-az_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-az_max",  0,            "define max", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(revertprocessedexpArgs, PS_LIST_TAIL, "-posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-object",  0,            "search by exposure object", NULL);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF32(revertprocessedexpArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
+
+    psMetadataAddBool(revertprocessedexpArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
+    psMetadataAddS16(revertprocessedexpArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
 
     // -updateprocessedexp
     psMetadata *updateprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddS64(updateprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,
-            "search by camtool ID", 0);
-    psMetadataAddS64(updateprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chiptool ID", 0);
-    psMetadataAddStr(updateprocessedexpArgs, PS_LIST_TAIL, "-class",  0,
-            "search by class", NULL);
-    psMetadataAddStr(updateprocessedexpArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search by class ID", NULL);
-    psMetadataAddS16(updateprocessedexpArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code (required)", INT16_MAX);
+    psMetadataAddS64(updateprocessedexpArgs, PS_LIST_TAIL, "-cam_id", 0,            "search by camtool ID", 0);
+    psMetadataAddS64(updateprocessedexpArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chiptool ID", 0);
+    psMetadataAddStr(updateprocessedexpArgs, PS_LIST_TAIL, "-class",  0,            "search by class", NULL);
+    psMetadataAddStr(updateprocessedexpArgs, PS_LIST_TAIL, "-class_id",  0,            "search by class ID", NULL);
+    psMetadataAddS16(updateprocessedexpArgs, PS_LIST_TAIL, "-code",  0,            "set fault code (required)", INT16_MAX);
 
     // -block
     psMetadata *blockArgs = psMetadataAlloc();
-    psMetadataAddStr(blockArgs, PS_LIST_TAIL, "-label",  0,
-            "name of a label to mask out (required)", NULL);
+    psMetadataAddStr(blockArgs, PS_LIST_TAIL, "-label",  0,            "name of a label to mask out (required)", NULL);
 
     // -masked
     psMetadata *maskedArgs = psMetadataAlloc();
-    psMetadataAddBool(maskedArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddBool(maskedArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -unblock
     psMetadata *unblockArgs = psMetadataAlloc();
-    psMetadataAddStr(unblockArgs, PS_LIST_TAIL, "-label",  0,
-            "name of a label to unmask (required)", NULL);
+    psMetadataAddStr(unblockArgs, PS_LIST_TAIL, "-label",  0,            "name of a label to unmask (required)", NULL);
 
     psMetadata *argSets = psMetadataAlloc();
@@ -485,92 +300,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-{
-    psS64 cam_id = -1;
-    bool status = false;
-    if ((cam_id = psMetadataLookupS64(&status, config->args, "-cam_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "cam_id", 0, "==", cam_id)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item cam_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-
-{
-    psString str = NULL;
-    bool status = false;
-    if ((str = psMetadataLookupStr(&status, config->args, "-chip_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(str))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-
-    // convert '-inst' to 'camera'
-    {
-        psString str = NULL;
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
-            if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(telescope);
-    addWhereStr(exp_type);
-    {
-        int imfiles = 0;
-        bool status = false;
-        if ((imfiles = psMetadataLookupS32(&status, config->args, "-imfiles"))) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "imfiles", 0, "==", imfiles)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(class_id);
-    addWhereStr(filter);
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (psListLength(config->where->list) < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
-
     // define Database handle, if used
     config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
Index: trunk/ippTools/src/chiptool.c
===================================================================
--- trunk/ippTools/src/chiptool.c	(revision 18531)
+++ trunk/ippTools/src/chiptool.c	(revision 18561)
@@ -665,10 +665,16 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id",  "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+
     PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
-    if (!pxSetFaultCode(config->dbh, "chipProcessedImfile", config->where, code)) {
+    if (!pxSetFaultCode(config->dbh, "chipProcessedImfile", where, code)) {
         psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
         return false;
     }
+    psFree(where);
 
     return true;
Index: trunk/ippTools/src/chiptoolConfig.c
===================================================================
--- trunk/ippTools/src/chiptoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/chiptoolConfig.c	(revision 18561)
@@ -304,34 +304,19 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXOPT_ADD_MODE("-definebyquery",        "create runs from raw exposures",
-        CHIPTOOL_MODE_DEFINEBYQUERY,        definebyqueryArgs);
-    PXOPT_ADD_MODE("-updaterun",            "change chip run properties",
-        CHIPTOOL_MODE_UPDATERUN,            updaterunArgs);
-    PXOPT_ADD_MODE("-pendingimfile",        "show pending imfiles",
-        CHIPTOOL_MODE_PENDINGIMFILE,        pendingimfileArgs);
-    PXOPT_ADD_MODE("-addprocessedimfile",   "add a processed imfile",
-        CHIPTOOL_MODE_ADDPROCESSEDIMFILE,   addprocessedimfileArgs);
-    PXOPT_ADD_MODE("-processedimfile",      "show processed imfiles",
-        CHIPTOOL_MODE_PROCESSEDIMFILE,      processedimfileArgs);
-    PXOPT_ADD_MODE("-updateprocessedimfile","change procesed imfile properties",
-        CHIPTOOL_MODE_UPDATEPROCESSEDIMFILE,updateprocessedimfileArgs);
-    PXOPT_ADD_MODE("-revertprocessedimfile","undo a processed imfile",
-        CHIPTOOL_MODE_REVERTPROCESSEDIMFILE,revertprocessedimfileArgs);
-    PXOPT_ADD_MODE("-block",                "set a label block",
-        CHIPTOOL_MODE_BLOCK,                blockArgs);
-    PXOPT_ADD_MODE("-masked",               "show blocked labels",
-        CHIPTOOL_MODE_MASKED,               maskedArgs);
-    PXOPT_ADD_MODE("-unmasked",             "",
-        CHIPTOOL_MODE_UNMASKED,             unmaskedArgs);
-    PXOPT_ADD_MODE("-unblock",              "remove a label block",
-        CHIPTOOL_MODE_UNBLOCK,              unblockArgs);
-    PXOPT_ADD_MODE("-pendingcleanuprun",    "show runs that need to be cleaned up",
-        CHIPTOOL_MODE_PENDINGCLEANUPRUN,    pendingcleanuprunArgs);
-    PXOPT_ADD_MODE("-pendingcleanupimfile", "show runs that need to be cleaned up",
-        CHIPTOOL_MODE_PENDINGCLEANUPIMFILE, pendingcleanupimfileArgs);
-    PXOPT_ADD_MODE("-donecleanup",          "show runs that have been cleaned",
-        CHIPTOOL_MODE_DONECLEANUP,          donecleanupArgs);
-    PXOPT_ADD_MODE("-run",                  "show runs",
-        CHIPTOOL_MODE_RUN,                  runArgs);
+    PXOPT_ADD_MODE("-definebyquery",        "create runs from raw exposures",       CHIPTOOL_MODE_DEFINEBYQUERY,        definebyqueryArgs);
+    PXOPT_ADD_MODE("-updaterun",            "change chip run properties",           CHIPTOOL_MODE_UPDATERUN,            updaterunArgs);
+    PXOPT_ADD_MODE("-pendingimfile",        "show pending imfiles",        	    CHIPTOOL_MODE_PENDINGIMFILE,        pendingimfileArgs);
+    PXOPT_ADD_MODE("-addprocessedimfile",   "add a processed imfile",      	    CHIPTOOL_MODE_ADDPROCESSEDIMFILE,   addprocessedimfileArgs);
+    PXOPT_ADD_MODE("-processedimfile",      "show processed imfiles",      	    CHIPTOOL_MODE_PROCESSEDIMFILE,      processedimfileArgs);
+    PXOPT_ADD_MODE("-updateprocessedimfile","change procesed imfile properties",    CHIPTOOL_MODE_UPDATEPROCESSEDIMFILE,updateprocessedimfileArgs);
+    PXOPT_ADD_MODE("-revertprocessedimfile","undo a processed imfile",     	    CHIPTOOL_MODE_REVERTPROCESSEDIMFILE,revertprocessedimfileArgs);
+    PXOPT_ADD_MODE("-block",                "set a label block",           	    CHIPTOOL_MODE_BLOCK,                blockArgs);
+    PXOPT_ADD_MODE("-masked",               "show blocked labels",         	    CHIPTOOL_MODE_MASKED,               maskedArgs);
+    PXOPT_ADD_MODE("-unmasked",             "",                            	    CHIPTOOL_MODE_UNMASKED,             unmaskedArgs);
+    PXOPT_ADD_MODE("-unblock",              "remove a label block",        	    CHIPTOOL_MODE_UNBLOCK,              unblockArgs);
+    PXOPT_ADD_MODE("-pendingcleanuprun",    "show runs that need to be cleaned up", CHIPTOOL_MODE_PENDINGCLEANUPRUN,    pendingcleanuprunArgs);
+    PXOPT_ADD_MODE("-pendingcleanupimfile", "show runs that need to be cleaned up", CHIPTOOL_MODE_PENDINGCLEANUPIMFILE, pendingcleanupimfileArgs);
+    PXOPT_ADD_MODE("-donecleanup",          "show runs that have been cleaned",     CHIPTOOL_MODE_DONECLEANUP,          donecleanupArgs);
+    PXOPT_ADD_MODE("-run",                  "show runs",                            CHIPTOOL_MODE_RUN,                  runArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: trunk/ippTools/src/detselect.c
===================================================================
--- trunk/ippTools/src/detselect.c	(revision 18531)
+++ trunk/ippTools/src/detselect.c	(revision 18561)
@@ -81,4 +81,10 @@
 
     psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_STR(config->args, where, "-inst",      "camera", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", "telescope", "==");
+    PXOPT_COPY_STR(config->args, where, "-det_type",  "det_type", "==");
+    PXOPT_COPY_STR(config->args, where, "-type",      "det_type", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter",    "filter", "==");
 
     // airmass_min  < airmass  < airmass_max
@@ -111,18 +117,11 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    {
+    // use psDBGenerateWhereConditionalSQL with AND ... because the SQL ends in a WHERE
+    if (where && psListLength(where->list)) {
         psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-        psFree(where);
-        if (whereClause) {
-            psStringAppend(&query, " AND %s", whereClause);
-            psFree(whereClause);
-        }
-    }
+	psStringAppend(&query, " AND %s", whereClause);
+	psFree(whereClause);
+    }
+    psFree(where);
 
     // we choose the single detrend image which matches all criteria and has
@@ -171,4 +170,9 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+
     psString query = pxDataGet("detselect_select.sql");
     if (!query) {
@@ -177,10 +181,11 @@
     }
 
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
+    // use psDBGenerateWhereConditionalSQL with AND ... because the SQL ends in a WHERE
+    if (where && psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
Index: trunk/ippTools/src/detselect.h
===================================================================
--- trunk/ippTools/src/detselect.h	(revision 18531)
+++ trunk/ippTools/src/detselect.h	(revision 18561)
@@ -31,98 +31,3 @@
 pxConfig *detselectConfig(pxConfig *config, int argc, char **argv);
 
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereStrAlias(name,realname) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #realname, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereS32(name) \
-{ \
-    psS32 s32 = 0; \
-    bool status = false; \
-    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereF32(name) \
-{ \
-    psF32 var = 0; \
-    bool status = false; \
-    if ((var = psMetadataLookupF32(&status, config->args, "-" #name))) { \
-        if (!isnan(var)) { \
-            if (!psMetadataAddF32(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
-                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-                psFree(config); \
-                return NULL; \
-            } \
-        } \
-    } \
-}
-
-#define addWhereF64(name) \
-{ \
-    psF64 var = 0; \
-    bool status = false; \
-    if ((var = psMetadataLookupF64(&status, config->args, "-" #name))) { \
-        if (!isnan(var))  { \
-            if (!psMetadataAddF64(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
-                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-                psFree(config); \
-                return NULL; \
-            } \
-        } \
-    } \
-}
-
-#define addWhereTimeStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        psTime *time = psTimeFromISO(str, PS_TIME_UTC); \
-        if (!time) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to convert " #name " into a psTime object"); \
-            psFree(config); \
-            return NULL; \
-        } \
-        psMetadataItem *item = psMetadataLookup(config->args, "-" #name); \
-        if (item) { \
-            str = item->comment; \
-        } else { \
-            str = NULL; \
-        } \
-        if (!psMetadataAddTime(config->where, PS_LIST_TAIL, #name, 0, str, time)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-        psFree(time); \
-    } \
-}
-
 #endif // DETSELECT_H
Index: trunk/ippTools/src/detselectConfig.c
===================================================================
--- trunk/ippTools/src/detselectConfig.c	(revision 18531)
+++ trunk/ippTools/src/detselectConfig.c	(revision 18561)
@@ -46,39 +46,23 @@
     // -search
     psMetadata *searchArgs = psMetadataAlloc();
-    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-inst", 0,
-                     "search by camera", NULL);
-    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-telescope", 0,
-                     "search by telescope", NULL);
-    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-det_type", 0,
-                     "search by detrend type", NULL);
-    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-type", 0,
-                     "search by detrend type (alias for -det_type)", NULL);
-    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-filter", 0,
-                     "search by filter", NULL);
-    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-airmass", 0,
-                     "define airmass", NAN);
-    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-exp_time", 0,
-                     "search by exposure time", NAN);
-    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-ccd_temp", 0,
-                     "search by ccd tempature", NAN);
-    psMetadataAddF64(searchArgs, PS_LIST_TAIL, "-posang", 0,
-                     "search by rotator position angle", NAN);
-    psMetadataAddTime(searchArgs, PS_LIST_TAIL, "-time", 0,
-                      "define time for desired detrend data", NULL);
-    psMetadataAddBool(searchArgs, PS_LIST_TAIL, "-simple",  0,
-                      "use the simple output format", false);
-    psMetadataAddBool(searchArgs, PS_LIST_TAIL, "-unlimit",  0,
-                      "list all possible detruns, not just the best match", false);
+    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-inst", 0,                     "search by camera", NULL);
+    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-telescope", 0,                     "search by telescope", NULL);
+    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-det_type", 0,                     "search by detrend type", NULL);
+    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-type", 0,                     "search by detrend type (alias for -det_type)", NULL);
+    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-filter", 0,                     "search by filter", NULL);
+    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-airmass", 0,                     "define airmass", NAN);
+    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-exp_time", 0,                     "search by exposure time", NAN);
+    psMetadataAddF32(searchArgs, PS_LIST_TAIL, "-ccd_temp", 0,                     "search by ccd tempature", NAN);
+    psMetadataAddF64(searchArgs, PS_LIST_TAIL, "-posang", 0,                     "search by rotator position angle", NAN);
+    psMetadataAddTime(searchArgs, PS_LIST_TAIL, "-time", 0,                      "define time for desired detrend data", NULL);
+    psMetadataAddBool(searchArgs, PS_LIST_TAIL, "-simple",  0,                      "use the simple output format", false);
+    psMetadataAddBool(searchArgs, PS_LIST_TAIL, "-unlimit",  0,                      "list all possible detruns, not just the best match", false);
  
     // -select
     psMetadata *selectArgs = psMetadataAlloc();
-    psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-det_id", 0,
-                     "search by detrend ID", NULL);
-    psMetadataAddS32(selectArgs, PS_LIST_TAIL, "-iteration", 0,
-                     "search by iteration number", 0);
-    psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-class_id", 0,
-                     "search by class ID", NULL);
-    psMetadataAddBool(selectArgs, PS_LIST_TAIL, "-simple",  0,
-                      "use the simple output format", false);
+    psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-det_id", 0,                     "search by detrend ID", NULL);
+    psMetadataAddS32(selectArgs, PS_LIST_TAIL, "-iteration", 0,                     "search by iteration number", 0);
+    psMetadataAddStr(selectArgs, PS_LIST_TAIL, "-class_id", 0,                     "search by class ID", NULL);
+    psMetadataAddBool(selectArgs, PS_LIST_TAIL, "-simple",  0,                      "use the simple output format", false);
     
     psMetadata *argSets = psMetadataAlloc();
@@ -99,35 +83,4 @@
     psFree(modes);
 
-    // setup search criterion
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-    addWhereStr(det_id);
-    addWhereS32(iteration);
-    addWhereStr(exp_id);
-    addWhereStrAlias(inst,camera);
-
-    addWhereStr(telescope);
-    addWhereStr(det_type);
-    addWhereStrAlias(type,det_type);
-
-    addWhereStr(exp_type);
-    addWhereS32(imfiles);
-    addWhereStr(class);
-    addWhereStr(class_id);
-    addWhereStr(filter);
-
-    //    addWhereF32(exp_time);
-    //    addWhereF64(ccd_temp);
-    //    addWhereF32(airmass);
-    //    addWhereTimeStr(use_begin);
-    //    addWhereTimeStr(use_end);
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
-
     // define Database handle, if used
     config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
Index: trunk/ippTools/src/dettool.c
===================================================================
--- trunk/ippTools/src/dettool.c	(revision 18531)
+++ trunk/ippTools/src/dettool.c	(revision 18561)
@@ -18,17 +18,4 @@
  */
 
-#ifdef HAVB_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-#include <ippdb.h>
-
-#include "pxtools.h"
 #include "dettool.h"
 
@@ -98,5 +85,5 @@
 //static psArray *searchInputImfiles(pxConfig *config, const char *det_id);
 static detInputExpRow *rawDetrenTodetInputExpRow(rawExpRow *rawExp, psS64 det_id, psS32 iteration);
-static psArray *searchRawImfiles(pxConfig *config, psMetadata *where);
+static psArray *searchRawImfiles(pxConfig *config);
 static bool startNewIteration(pxConfig *config, psS64 det_id);
 static psS32 incrementIteration(pxConfig *config, psS64 det_id);
@@ -214,20 +201,23 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    psString query = psStringCopy(
-        "SELECT"
-        "   rawExp.*"
-        " FROM rawExp"
-        " LEFT JOIN detInputExp"
-        "   ON rawExp.exp_id = detInputExp.exp_id"
-        " WHERE"
-        "    detInputExp.exp_id IS NULL"
-        "    AND rawExp.object != 'object'"
-    );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
+    psString query = pxDataGet("dettool_pending.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+    
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_type", "exp_type", "==");
+    PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", "telescope", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "rawExp");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -315,4 +305,5 @@
     // make sure that -exp_id was parsed correctly
     // XXX this can be removed someday
+    // XXX Special case for a multi : move into a macro?
     if (item->type == PS_DATA_METADATA_MULTI) {
         psListIterator *iter = psListIteratorAlloc(item->data.list, 0, false);
@@ -472,5 +463,5 @@
 #if 0
 // This function is used to convert the det_id from an int, as it is used
-// internally, to be a string for external use.  The rational being that we may
+// internally, to be a string for external use.  The rationale being that we may
 // want to change how det_id is generated in the future and don't want to
 // external programs to become depending on this value being an int.
@@ -543,5 +534,4 @@
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_STR(config->args, where, "-select_exp_type", "exp_type", "==");
-    // map -inst -> camera
     PXOPT_COPY_STR(config->args, where, "-select_inst", "camera", "==");
     PXOPT_COPY_STR(config->args, where, "-select_telescope", "telescope", "==");
@@ -555,12 +545,12 @@
     PXOPT_COPY_F32(config->args, where, "-select_exp_time_min", "exp_time", ">=");
     PXOPT_COPY_F32(config->args, where, "-select_exp_time_max", "exp_time", "<=");
-    PXOPT_COPY_F32(config->args, where, "-select_ccd_temp_min", "ccd_temp", ">=");
-    PXOPT_COPY_F32(config->args, where, "-select_ccd_temp_max", "ccd_temp", "<=");
-    PXOPT_COPY_F32(config->args, where, "-select_pon_time_min", "pon_time", ">=");
-    PXOPT_COPY_F32(config->args, where, "-select_pon_time_max", "pon_time", "<=");
-    PXOPT_COPY_F32(config->args, where, "-select_posang_min", "posang", ">=");
-    PXOPT_COPY_F32(config->args, where, "-select_posang_max", "posang", "<=");
-    PXOPT_COPY_F32(config->args, where, "-select_solang_min", "solang", ">=");
-    PXOPT_COPY_F32(config->args, where, "-select_solang_max", "solang", "<=");
+    PXOPT_COPY_F64(config->args, where, "-select_ccd_temp_min", "ccd_temp", ">=");
+    PXOPT_COPY_F64(config->args, where, "-select_ccd_temp_max", "ccd_temp", "<=");
+    PXOPT_COPY_F64(config->args, where, "-select_pon_time_min", "pon_time", ">=");
+    PXOPT_COPY_F64(config->args, where, "-select_pon_time_max", "pon_time", "<=");
+    PXOPT_COPY_F64(config->args, where, "-select_posang_min", "posang", ">=");
+    PXOPT_COPY_F64(config->args, where, "-select_posang_max", "posang", "<=");
+    PXOPT_COPY_F64(config->args, where, "-select_solang_min", "solang", ">=");
+    PXOPT_COPY_F64(config->args, where, "-select_solang_max", "solang", "<=");
 
     if (!psListLength(where->list)) {
@@ -571,5 +561,5 @@
     // there is some namespace overlap between the names of the fields we'd
     // like to search by to setup a detrun and the names of the fields we'd
-    // like to assign values to so I've seperated them but prepending set- to
+    // like to assign values to so I've separated them but prepending set- to
     // the assigned values
 
@@ -731,34 +721,22 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-
-    // optional
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_STR(det_type, config->args, "-set_det_type", false, false);
-    PXOPT_LOOKUP_STR(mode, config->args, "-set_mode", false, false);
-    // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
-    PXOPT_LOOKUP_STR(camera, config->args, "-set_inst", false, false);
-    PXOPT_LOOKUP_STR(telescope, config->args, "-set_telescope", false, false);
+    
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_STR(det_type, config->args, "-set_det_type", false, false); // optional
+    PXOPT_LOOKUP_STR(mode, config->args, "-set_mode", false, false); // optional
     PXOPT_LOOKUP_STR(exp_type, config->args, "-set_exp_type", false, false);
     PXOPT_LOOKUP_STR(filelevel, config->args, "-set_filelevel", false, false);
     PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
     PXOPT_LOOKUP_STR(filter, config->args, "-set_filter", false, false);
-
     PXOPT_LOOKUP_F32(airmass_min, config->args, "-set_airmass_min", false, false);
     PXOPT_LOOKUP_F32(airmass_max, config->args, "-set_airmass_max", false, false);
     PXOPT_LOOKUP_F32(exp_time_min, config->args, "-set_exp_time_min", false, false);
     PXOPT_LOOKUP_F32(exp_time_max, config->args, "-set_exp_time_max", false, false);
-    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-set_ccd_temp_min", false, false);
-    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-set_ccd_temp_max", false, false);
-    PXOPT_LOOKUP_F32(posang_min, config->args, "-set_posang_min", false, false);
-    PXOPT_LOOKUP_F32(posang_max, config->args, "-set_posang_max", false, false);
-    PXOPT_LOOKUP_F32(solang_min, config->args, "-set_solang_min", false, false);
-    PXOPT_LOOKUP_F32(solang_max, config->args, "-set_solang_max", false, false);
-    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_F64(ccd_temp_min, config->args, "-set_ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F64(ccd_temp_max, config->args, "-set_ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F64(posang_min, config->args, "-set_posang_min", false, false);
+    PXOPT_LOOKUP_F64(posang_max, config->args, "-set_posang_max", false, false);
+    PXOPT_LOOKUP_F64(solang_min, config->args, "-set_solang_min", false, false);
+    PXOPT_LOOKUP_F64(solang_max, config->args, "-set_solang_max", false, false);
     PXOPT_LOOKUP_TIME(registered, config->args, "-set_registered", false, false);
     PXOPT_LOOKUP_TIME(time_begin, config->args, "-set_time_begin", false, false);
@@ -767,5 +745,12 @@
     PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
     PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
-
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false); // optional
+
+    // check mode
+    if (mode && !isValidMode(config, mode)) {
+        psError(PS_ERR_UNKNOWN, false, "invalud mode");
+        return false;
+    }
 
     // lookup the detRun that we will be basing this one on
@@ -814,14 +799,4 @@
     }
 
-    if (camera) {
-        psFree(detRun->camera);
-        detRun->camera = psStringCopy(camera);
-    }
-
-    if (telescope) {
-        psFree(detRun->telescope);
-        detRun->telescope = psStringCopy(telescope);
-    }
-
     if (exp_type) {
         psFree(detRun->exp_type);
@@ -925,6 +900,6 @@
     // XXX: possible mem leak: PXOPT_COPY* will free time_filter but NOTHING
     // that has previously been allocated
-    PXOPT_COPY_TIME(config->args, time_filter, "-filter_input_begin", "dateobs", ">=");
-    PXOPT_COPY_TIME(config->args, time_filter, "-filter_input_end", "dateobs", "<");
+    PXOPT_COPY_TIME(config->args, time_filter, "-set_input_begin", "dateobs", ">=");
+    PXOPT_COPY_TIME(config->args, time_filter, "-set_input_end", "dateobs", "<");
 
     // start a transaction so we don't end up with childlessed det_ids
@@ -951,16 +926,9 @@
     psS64 newDet_id = psDBLastInsertID(config->dbh);
 
-    psString query = psStringCopy(
-        "INSERT INTO detInputExp"
-        "   SELECT"
-        "       %d,"
-        "       0,"
-        "       detResidExp.exp_id,"
-        "       detResidExp.accept"
-        "   FROM detResidExp"
-        "   JOIN rawExp"
-        "       USING(exp_id)"
-        "   WHERE det_id = %d"
-    );
+    psString query = pxDataGet("dettool_definebydetrun.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
 
     if (time_filter->list->n) {
@@ -1017,27 +985,31 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_type", "det_type", "==");
+    PXOPT_COPY_STR(config->args, where, "-det_id",   "det_id", "==");
+
+    PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", "telescope", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
+
+    // airmass_min  < airmass  < airmass_max
+    PXOPT_COPY_F32(config->args, where, "-airmass", "airmass_min", "<=");
+    PXOPT_COPY_F32(config->args, where, "-airmass", "airmass_max", ">=");
+
+    // exp_time_min < exp_time < exp_time_max
+    PXOPT_COPY_F32(config->args, where, "-exp_time", "exp_time_min", "<=");
+    PXOPT_COPY_F32(config->args, where, "-exp_time", "exp_time_max", ">=");
+
+    // ccd_temp_min < ccd_temp < ccd_temp_max
+    PXOPT_COPY_F32(config->args, where, "-ccd_temp", "ccd_temp_min", "<=");
+    PXOPT_COPY_F32(config->args, where, "-ccd_temp", "ccd_temp_max", ">=");
+
+    PXOPT_COPY_F64(config->args, where, "-posang", "posang_min", "<=");
+    PXOPT_COPY_F64(config->args, where, "-posang", "posang_max", ">=");
+
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(active, config->args, "-active", false);
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
 
-    PXOPT_COPY_STR(config->args, config->where, "-inst", "camera", "==");
-    PXOPT_COPY_STR(config->args, config->where, "-telescope", "telescope", "==");
-    PXOPT_COPY_STR(config->args, config->where, "-filter", "filter", "==");
-
-    // airmass_min  < airmass  < airmass_max
-    PXOPT_COPY_F32(config->args, config->where, "-airmass", "airmass_min", "<=");
-    PXOPT_COPY_F32(config->args, config->where, "-airmass", "airmass_max", ">=");
-
-    // exp_time_min < exp_time < exp_time_max
-    PXOPT_COPY_F32(config->args, config->where, "-exp_time", "exp_time_min", "<=");
-    PXOPT_COPY_F32(config->args, config->where, "-exp_time", "exp_time_max", ">=");
-
-    // ccd_temp_min < ccd_temp < ccd_temp_max
-    PXOPT_COPY_F32(config->args, config->where, "-ccd_temp", "ccd_temp_min", "<=");
-    PXOPT_COPY_F32(config->args, config->where, "-ccd_temp", "ccd_temp_max", ">=");
-
-    PXOPT_COPY_F64(config->args, config->where, "-posang", "posang_min", "<=");
-    PXOPT_COPY_F64(config->args, config->where, "-posang", "posang_max", ">=");
-
     psString query = pxDataGet("dettool_runs.sql");
     if (!query) {
@@ -1046,17 +1018,18 @@
     }
 
-    if (config->where && active) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, "detRun");
+    if (psListLength(where->list) && active) {
+        psString whereClause = psDBGenerateWhereSQL(where, "detRun");
         psStringAppend(&query, " %s AND (detRun.state = 'run' OR detRun.state = 'stop' OR detRun.state = 'register')", whereClause);
         psFree(whereClause);
     }
-    if (config->where && !active) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, "detRun");
+    if (psListLength(where->list) && !active) {
+        psString whereClause = psDBGenerateWhereSQL(where, "detRun");
         psStringAppend(&query, " %s", whereClause);
         psFree(whereClause);
     }
-    if (!config->where && active) {
+    if (!psListLength(where->list) && active) {
         psStringAppend(&query, " WHERE (detRun.state = 'run' OR detRun.state = 'stop' OR detRun.state = 'register')");
     }
+    psFree (where);
 
     // treat limit == 0 as "no limit"
@@ -1080,14 +1053,4 @@
     }
 
-// XXX old version
-# if 0
-    // XXX fix the hard coding of the table name
-    psArray *runs = psDBSelectRows(config->dbh, "detRun", config->where, 0);
-    if (!runs) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-# endif
-
     if (!psArrayLength(runs)) {
         psTrace("dettool", PS_LOG_INFO, "no rows found");
@@ -1112,24 +1075,24 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_type", "det_type", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    psString query = psStringCopy(
-            "SELECT DISTINCT\n"
-            "   detRun.*\n"
-            " FROM detRun\n"
-            " LEFT JOIN detRun as foo\n"
-            "   ON foo.parent = detRun.det_id\n"
-            " WHERE\n"
-            "   detRun.state = 'stop'\n"
-            "   AND detRun.mode = 'master'\n"
-            "   AND foo.det_id IS NULL\n"
-        );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detRun");
+    // find the exp_id of all the exposures that we want to queue up.
+    psString query = pxDataGet("dettool_childlessrun.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psFree(where);
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detRun");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree (where);
 
     // treat limit == 0 as "no limit"
@@ -1188,21 +1151,22 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    // select detInputExp.*
-    // select rawExp.*
-    // by:
-    // exp_id
-
-    psString query = psStringCopy(
-        "SELECT DISTINCT *"
-        " FROM detInputExp"
-        " JOIN rawExp"
-        " USING(exp_id)"
-        );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, "detInputExp");
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id",    "exp_id", "==");
+
+    psString query = pxDataGet("dettool_input.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psFree(where);
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereSQL(where, "detInputExp");
         psStringAppend(&query, " %s", whereClause);
         psFree(whereClause);
     }
+    psFree (where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -1242,4 +1206,6 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
+    psMetadata *where = psMetadataAlloc();
+
     psString query = pxDataGet("dettool_raw.sql");
     if (!query) {
@@ -1248,9 +1214,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "rawImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree (where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -1288,4 +1255,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",   "det_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id",   "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -1297,9 +1269,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "rawImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree (where);
 
     // treat limit == 0 as "no limit"
@@ -1340,55 +1313,9 @@
 }
 
-static psArray *searchRawImfiles(pxConfig *config, psMetadata *where)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-
-    // use the default where if "where" is NULL
-    if (!where) {
-        where = config->where;
-    }
-
-    // select exp_ids from detInputExp matching det_idp
-    // where query should be pre-generated
-    psArray *detInputExp =
-        detInputExpSelectRowObjects(config->dbh, where, 0);
-    if (!detInputExp) {
-        psError(PS_ERR_UNKNOWN, false, "no rawExp rows found");
-        return NULL;
-    }
-
-    // generate where query with just the exp_ids
-    psMetadata *where_exp_ids = psMetadataAlloc();
-    for (long i = 0; i < psArrayLength(detInputExp); i++) {
-        detInputExpRow *row = detInputExp->data[i];
-        if (!psMetadataAddS64(where_exp_ids, PS_LIST_TAIL, "exp_id",
-                PS_META_DUPLICATE_OK, "==", row->exp_id)
-        ) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(detInputExp);
-            psFree(where_exp_ids);
-            return NULL;
-        }
-    }
-    psFree(detInputExp);
-
-    // select rawImfiles with matching exp_ids
-    psArray *rawImfiles =
-        rawImfileSelectRowObjects(config->dbh, where_exp_ids, 0);
-    psFree(where_exp_ids);
-    if (!rawImfiles) {
-        psError(PS_ERR_UNKNOWN, false, "no rawImfile rows found");
-        return NULL;
-    }
-
-    return rawImfiles;
-}
-
 static bool addprocessedimfileMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // det_id, exp_id, class_id, uri, recipe, -bg, -bg_stdev
-    // are required
+    // det_id, exp_id, class_id, uri, recipe, -bg, -bg_stdev are required
     PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
     PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
@@ -1416,25 +1343,16 @@
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
-
     // find the matching rawImfile by exp_id/class_id
     psMetadata *where = psMetadataAlloc();
-    if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-        psFree(where);
-        return false;
-    }
-    if (!psMetadataAddStr(where, PS_LIST_TAIL, "class_id", 0, "==", class_id)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
-        psFree(where);
-        return false;
-    }
+    PXOPT_COPY_STR(config->args, where, "-exp_id",   "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
 
     psArray *rawImfiles = rawImfileSelectRowObjects(config->dbh, where, 0);
     psFree(where);
+
     if (!rawImfiles) {
         psError(PS_ERR_UNKNOWN, false, "no rawImfile rows found ");
         return false;
     }
-
 
     // create a new detProcessedImfile object
@@ -1473,4 +1391,138 @@
 }
 
+static bool processedimfileMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    char *value = NULL;
+
+    PXOPT_LOOKUP_BOOL(included, config->args, "-included", false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+
+    psString query = pxDataGet("dettool_processedimfile.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psFree(where);
+        return false;
+    }
+
+    // add the two required restrictions: detRun.state and detRun.mode
+    // NOTE the above query requires one of the following two WHERE statements
+    {
+        bool status;
+        if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
+            psStringAppend(&query, " WHERE detRun.state = '%s'", value);
+        } else {
+            psStringAppend(&query, " WHERE detRun.state = 'run'");
+        }
+        if ((value = psMetadataLookupStr(&status, config->args, "-select_mode"))) {
+            psStringAppend(&query, " AND detRun.mode = '%s'", value);
+        } else {
+            psStringAppend(&query, " AND detRun.mode = 'master'");
+        }
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detProcessedImfile");
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree (where);
+
+    // restrict search to included imfiles
+    if (included) {
+	psStringAppend(&query, " AND detInputExp.include = 1");
+    }
+
+    if (faulted) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "AND detProcessedImfile.fault != 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "AND detProcessedImfile.fault = 0");
+    }
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, " %s", limitString);
+        psFree(limitString);
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+    if (!psArrayLength(output)) {
+        psTrace("dettool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        return true;
+    }
+
+    // negative simple so the default is true
+    if (!ippdbPrintMetadatas(stdout, output, "rawImfile", !simple)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to print array");
+        psFree(output);
+        return false;
+    }
+
+    psFree(output);
+
+    return true;
+}
+
+static bool revertprocessedimfileMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id", "class_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code", "fault", "==");
+
+    psString query = pxDataGet("dettool_revertprocessedimfile.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detProcessedImfile");
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(where);
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    if (psDBAffectedRows(config->dbh) < 1) {
+        psError(PS_ERR_UNKNOWN, false, "should have affected atleast 1 row");
+        return false;
+    }
+
+    return true;
+}
+
 static bool toprocessedexpMode(pxConfig *config)
 {
@@ -1485,13 +1537,4 @@
         return false;
     }
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
 
     // treat limit == 0 as "no limit"
@@ -1561,41 +1604,9 @@
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", true, false);
 
-
-    psString query = psStringCopy(
-        " SELECT DISTINCT"
-        "    detProcessedImfile.det_id,"
-        "    detRun.iteration,"
-        "    detRun.det_type,"
-        "    detProcessedImfile.exp_id"
-        " FROM detRun"
-        " JOIN detInputExp"
-        "    ON detRun.det_id = detInputExp.det_id"
-        "    AND detRun.iteration = detInputExp.iteration"
-        " JOIN rawExp"
-        "    ON detInputExp.exp_id = rawExp.exp_id"
-        " JOIN detProcessedImfile"
-        "    ON detInputExp.det_id = detProcessedImfile.det_id"
-        "    AND detInputExp.exp_id = detProcessedImfile.exp_id"
-        " LEFT JOIN detProcessedExp"
-        "    ON detInputExp.det_id = detProcessedExp.det_id"
-        "    AND detProcessedImfile.exp_id= detProcessedExp.exp_id"
-        " LEFT JOIN rawImfile"
-        "    ON detInputExp.exp_id = rawImfile.exp_id"
-        "    AND detProcessedImfile.class_id = rawImfile.class_id"
-        " WHERE"
-        "   detRun.state = 'run'"
-        "   AND detRun.mode = 'master'"
-        "   AND detProcessedExp.det_id IS NULL"
-        "   AND detProcessedExp.exp_id IS NULL"
-        "   AND detInputExp.include = 1"
-        "   AND detRun.det_id = %s"
-        "   AND detProcessedImfile.exp_id = '%s'"
-        " GROUP BY"
-        "    detProcessedImfile.class_id,"
-        "    rawImfile.class_id,"
-        "    detRun.det_id"
-        " HAVING"
-        "    COUNT(detProcessedImfile.class_id) = COUNT(rawImfile.class_id)"
-        );
+    psString query = pxDataGet("dettool_addprocessedexp.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
 
     if (!p_psDBRunQuery(config->dbh, query, det_id, exp_id)) {
@@ -1654,15 +1665,20 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
     psString query = psStringCopy("SELECT * FROM detProcessedExp");
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
         psStringAppend(&query, " %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -1716,4 +1732,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",   "fault", "==");
+
     psString query = pxDataGet("dettool_revertprocessedexp.sql");
     if (!query) {
@@ -1722,9 +1743,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detProcessedExp");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detProcessedExp");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -1756,13 +1778,4 @@
         return false;
     }
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
 
     // treat limit == 0 as "no limit"
@@ -1803,143 +1816,49 @@
 }
 
-static bool processedimfileMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    char *value = NULL;
-
-    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
-
-    psString query = psStringCopy(
-        " SELECT DISTINCT"
-        "   detRun.det_type,"
-        "   rawExp.exp_time,"
-        "   detProcessedImfile.*"
-        " FROM detProcessedImfile"
-        " JOIN detRun"
-        "   USING(det_id)"
-        " JOIN detInputExp"
-        "   ON detRun.det_id = detInputExp.det_id"
-        "   AND detRun.iteration = detInputExp.iteration"
-        "   AND detProcessedImfile.exp_id = detInputExp.exp_id"
-        " JOIN rawExp"
-        "   ON rawExp.exp_id = detProcessedImfile.exp_id"
-        " WHERE"
-    );
-    // NOTE the above WHERE is completed with the following line:
-
-    // add the two required restrictions: detRun.state and detRun.mode
-    {
-        bool status;
-        if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
-            psStringAppend(&query, " detRun.state = '%s'", value);
-        } else {
-            psStringAppend(&query, " detRun.state = 'run'");
+// this is NOT a command-line mode : it is used by 'addstackedMode'
+static psArray *searchRawImfiles(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, NULL);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+
+    // select exp_ids from detInputExp matching det_id & iteration
+    // where query should be pre-generated
+    psArray *detInputExp = detInputExpSelectRowObjects(config->dbh, where, 0);
+    psFree (where);
+
+    if (!detInputExp) {
+        psError(PS_ERR_UNKNOWN, false, "no rawExp rows found");
+        return NULL;
+    }
+
+    // generate where query with just the exp_ids
+    psMetadata *where_exp_ids = psMetadataAlloc();
+    for (long i = 0; i < psArrayLength(detInputExp); i++) {
+        detInputExpRow *row = detInputExp->data[i];
+        if (!psMetadataAddS64(where_exp_ids, PS_LIST_TAIL, "exp_id",
+                PS_META_DUPLICATE_OK, "==", row->exp_id)
+        ) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+            psFree(detInputExp);
+            psFree(where_exp_ids);
+            return NULL;
         }
-        if ((value = psMetadataLookupStr(&status, config->args, "-select_mode"))) {
-            psStringAppend(&query, " AND detRun.mode = '%s'", value);
-        } else {
-            psStringAppend(&query, " AND detRun.mode = 'master'");
-        }
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detProcessedImfile");
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    {
-        bool status = false;
-        bool included = psMetadataLookupBool(&status, config->args, "-included");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
-        // restrict search to included imfiles
-        if (included) {
-            psStringAppend(&query, " AND detInputExp.include = 1");
-        }
-    }
-
-    if (faulted) {
-        // list only faulted rows
-        psStringAppend(&query, " %s", "AND detProcessedImfile.fault != 0");
-    } else {
-        // don't list faulted rows
-        psStringAppend(&query, " %s", "AND detProcessedImfile.fault = 0");
-    }
-
-    // treat limit == 0 as "no limit"
-    if (limit) {
-        psString limitString = psDBGenerateLimitSQL(limit);
-        psStringAppend(&query, " %s", limitString);
-        psFree(limitString);
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-
-    psArray *output = p_psDBFetchResult(config->dbh);
-    if (!output) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-    if (!psArrayLength(output)) {
-        psTrace("dettool", PS_LOG_INFO, "no rows found");
-        psFree(output);
-        return true;
-    }
-
-    // negative simple so the default is true
-    if (!ippdbPrintMetadatas(stdout, output, "rawImfile", !simple)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to print array");
-        psFree(output);
-        return false;
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool revertprocessedimfileMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString query = pxDataGet("dettool_revertprocessedimfile.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detProcessedImfile");
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-
-    if (psDBAffectedRows(config->dbh) < 1) {
-        psError(PS_ERR_UNKNOWN, false, "should have affected atleast 1 row");
-        return false;
-    }
-
-    return true;
-}
-
+    }
+    psFree(detInputExp);
+
+    // select rawImfiles with matching exp_ids
+    psArray *rawImfiles =
+        rawImfileSelectRowObjects(config->dbh, where_exp_ids, 0);
+    psFree(where_exp_ids);
+    if (!rawImfiles) {
+        psError(PS_ERR_UNKNOWN, false, "no rawImfile rows found");
+        return NULL;
+    }
+
+    return rawImfiles;
+}
 
 static bool addstackedMode(pxConfig *config)
@@ -1947,6 +1866,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // det_id, class_id, uri, & recipe are required
+    // det_id, iteration, class_id, uri, & recipe are required
     PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", true, false);
     PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
 
@@ -1967,21 +1887,7 @@
     PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
 
-    // default values
-    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
-
     // correlate the class_id against the input exposure(s)
-
-    // we have to generate our own where clause as we want to search only by the
-    // det_id
-    psMetadata *where = psMetadataAlloc();
-    if (!psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==",
-            (psS64)atoll(det_id))) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-        psFree(where);
-        return false;
-    }
-
-    psArray *rawImfiles = searchRawImfiles(config, where);
-    psFree(where);
+    // searchRawImfiles defines a where clause to search by det_id and iteration
+    psArray *rawImfiles = searchRawImfiles(config);
 
     if (!rawImfiles) {
@@ -2045,28 +1951,27 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-recip",     "recipe", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
-
-    // select detStackedImfile.*
-    // by:
-    // where det_id, iteration, class_id is not in detNormalizedImfile
-
-    psString query = psStringCopy(
-        "SELECT"
-        "   detStackedImfile.*"
-        " FROM detStackedImfile"
-        " JOIN detRun"
-        "   USING(det_id, iteration)"
-        " WHERE"
-        "   detRun.state = 'run'"
-        "   AND detRun.mode = 'master'"
-    );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detStackedImfile");
+
+    psString query = pxDataGet("dettool_stacked.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psFree(where);
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detStackedImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -2120,4 +2025,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",      "fault", "==");
+
     psString query = pxDataGet("dettool_revertstacked.sql");
     if (!query) {
@@ -2126,9 +2037,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detStackedImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detStackedImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -2159,13 +2071,4 @@
         return false;
     }
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
 
     // treat limit == 0 as "no limit"
@@ -2240,7 +2143,12 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
     psString query = pxDataGet("dettool_normalizedstat.sql");
@@ -2258,9 +2166,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -2305,4 +2214,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",      "fault", "==");
+
     psString query = pxDataGet("dettool_revertnormalizedstat.sql");
     if (!query) {
@@ -2311,9 +2226,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detNormalizedStatImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detNormalizedStatImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -2339,46 +2255,9 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    // select detNormalizedStatImfile.*
-    // by:
-    // where det_id, iteration, class_id is not in detNormalizedImfile
-
-    psString query = psStringCopy(
-        "SELECT DISTINCT"
-        "   detRun.det_type,"
-        "   detRun.workdir,"
-        "   rawExp.camera,"
-        "   detStackedImfile.uri,"
-        "   detNormalizedStatImfile.*"
-        " FROM detRun"
-        " JOIN detStackedImfile"
-        "   USING(det_id, iteration)"
-        " JOIN detInputExp"
-        "   USING(det_id, iteration)"
-        " JOIN rawExp"
-        "   ON detInputExp.exp_id = rawExp.exp_id"
-        " JOIN detNormalizedStatImfile"
-        "   ON detStackedImfile.det_id = detNormalizedStatImfile.det_id"
-        "   AND detStackedImfile.iteration = detNormalizedStatImfile.iteration"
-        "   AND detStackedImfile.class_id = detNormalizedStatImfile.class_id"
-        " LEFT JOIN detNormalizedImfile"
-        "   ON detNormalizedStatImfile.det_id = detNormalizedImfile.det_id"
-        "   AND detNormalizedStatImfile.iteration = detNormalizedImfile.iteration"
-        "   AND detNormalizedStatImfile.class_id = detNormalizedImfile.class_id"
-        " WHERE"
-        "   detNormalizedImfile.det_id IS NULL"
-        "   AND detNormalizedImfile.iteration IS NULL"
-        "   AND detNormalizedImfile.class_id IS NULL"
-        "   AND detNormalizedStatImfile.fault = 0"
-        "   AND detRun.state = 'run'"
-        );
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
+    psString query = pxDataGet("dettool_tonormalize.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
 
     // treat limit == 0 as "no limit"
@@ -2419,95 +2298,4 @@
 }
 
-#if 0
-// XXX this function was left in commented as this method may be useful in the
-// future
-static psArray *validDetInputClassIds(pxConfig *config, const char *det_id)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    // det_id is input as a string because the fact that it is an integer
-    // is just a database impliementation detail.
-    PS_ASSERT_PTR_NON_NULL(det_id, NULL);
-
-    psArray *rawImfiles = searchInputImfiles(config, det_id);
-    if (!rawImfiles) {
-        return NULL;
-    }
-
-    psArray *valid_class_ids = NULL;
-    {
-        // All this jumping through hoops is so that we end up with unique
-        // values. PP thinks that making multiple passes through this array and
-        // deleting matched elements would end up being more expensive then a
-        // double sort and stagger scheme. JH thinks it would be cheaper to
-        // just do a unqiue sort and delete.  So this is really just a cheap
-        // hack to avoid implimenting a unique sort function but at least it's
-        // stable.
-        psHash *hash = psHashAlloc(psArrayLength(rawImfiles));
-        for (long i = 0; i < psArrayLength(rawImfiles); i++) {
-            psHashAdd(hash,
-                ((rawImfileRow *)rawImfiles->data[i])->class_id,
-                ((rawImfileRow *)rawImfiles->data[i])->class_id
-            );
-        }
-        valid_class_ids = psHashToArray(hash);
-        psFree(hash);
-    }
-    psFree(rawImfiles);
-
-    return valid_class_ids;
-}
-
-static psArray *searchInputImfiles(pxConfig *config, const char *det_id)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    // det_id is input as a string because the fact that it is an integer
-    // is just a database impliementation detail.
-    PS_ASSERT_PTR_NON_NULL(det_id, NULL);
-
-    psArray *inputExps = NULL;
-    {
-        psMetadata *where = psMetadataAlloc();
-        if (!psMetadataAddS32(where, PS_LIST_TAIL, "det_id", 0, "==",
-                (psS32)atoi(det_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-            psFree(where);
-            return NULL;
-        }
-        inputExps = detInputExpSelectRowObjects(config->dbh, where, 0);
-        psFree(where);
-    }
-    if (!inputExps) {
-        psError(PS_ERR_UNKNOWN, false, "no detInputExp rows found");
-        return NULL;
-    }
-
-    // find rawImfiles associated with detInputExps
-    psArray *rawImfiles = NULL;
-    {
-        psMetadata *where = psMetadataAlloc();
-        for (long i = 0; i < psArrayLength(inputExps); i++) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id",
-                    PS_META_DUPLICATE_OK, "==",
-                    ((detInputExpRow *)inputExps->data[i])->exp_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-                psFree(inputExps);
-                psFree(where);
-                return NULL;
-            }
-        }
-        psFree(inputExps);
-        rawImfiles = rawImfileSelectRowObjects(config->dbh, where, 0);
-        // XXX this really should be sorted for uniqueness
-        psFree(where);
-    }
-    if (!rawImfiles) {
-        psError(PS_ERR_UNKNOWN, false, "no rawImfile rows found");
-        return NULL;
-    }
-
-    return rawImfiles;
-}
-#endif
-
 static bool addnormalizedimfileMode(pxConfig *config)
 {
@@ -2516,4 +2304,5 @@
     // required
     PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
     PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
 
@@ -2533,7 +2322,4 @@
     PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
-
-    // default values
-    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
 
     if (!detNormalizedImfileInsert(config->dbh,
@@ -2560,8 +2346,13 @@
 }
 
-
 static bool normalizedimfileMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-recip",     "recipe", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
@@ -2569,26 +2360,16 @@
     PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
-    psString query = psStringCopy(
-        "SELECT"
-        " detNormalizedImfile.*"
-        " FROM detNormalizedImfile"
-        " JOIN detRun"
-        "   USING(det_id, iteration)"
-        " WHERE"
-        "   detRun.state = 'run'"
-        "   AND detRun.mode = 'master'"
-    );
-
-    if (config->where) {
-        bool status;
-        int iteration = psMetadataLookupS32 (&status, config->where, "iteration");
-        if (status) {
-            psMetadataRemoveKey (config->where, "iteration");
-            psMetadataAddS32 (config->where, PS_LIST_TAIL, "iteration", 0, "==", iteration);
-        }
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detNormalizedImfile");
+    psString query = pxDataGet("dettool_normalizedimfile.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detNormalizedImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -2642,4 +2423,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",      "fault", "==");
+
     psString query = pxDataGet("dettool_revertnormalizedimfile.sql");
     if (!query) {
@@ -2648,9 +2435,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detNormalizedImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detNormalizedImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -2668,5 +2456,4 @@
     return true;
 }
-
 
 static bool tonormalizedexpMode(pxConfig *config)
@@ -2682,13 +2469,4 @@
         return false;
     }
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
 
     // treat limit == 0 as "no limit"
@@ -2732,14 +2510,9 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-
+    
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
-
-    // Required if code == 0
-    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", (code == 0), false);
-
-    // optional
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", (code == 0), false); // Required if code == 0
     PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
     PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
@@ -2752,7 +2525,4 @@
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
-    // default values
-    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
-
     psString query = pxDataGet("dettool_tonormalizedexp.sql");
     if (!query) {
@@ -2761,8 +2531,6 @@
     }
 
-    psStringAppend(&query,
-            " WHERE det_id = %s"
-            " AND iteration = %d", det_id, iteration);
-
+    // XXX in some other places, we put the arguments in the .sql and supply them to RunQuery
+    psStringAppend(&query, " WHERE det_id = %s AND iteration = %d", det_id, iteration);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -2813,24 +2581,25 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-recip",  "recipe", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
-    psString query = psStringCopy(
-        "SELECT"
-        "   detNormalizedExp.*"
-        " FROM detNormalizedExp"
-        " JOIN detRun"
-        "   USING(det_id, iteration)"
-        " WHERE"
-        "   detRun.state = 'run'"
-        "   AND detRun.mode = 'master'"
-    );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
+    psString query = pxDataGet("dettool_normalizedexp.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
         psStringAppend(&query, " %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -2885,4 +2654,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",      "fault", "==");
+
     psString query = pxDataGet("dettool_revertnormalizedexp.sql");
     if (!query) {
@@ -2891,9 +2665,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detNormalizedExp");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detNormalizedExp");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -2925,13 +2700,4 @@
         return false;
     }
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
 
     // treat limit == 0 as "no limit"
@@ -2977,16 +2743,12 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
-
+    
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false); // required
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false); // required
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
-
-    // Required if code == 0
-    PXOPT_LOOKUP_STR(uri, config->args, "-uri", (code == 0), false);
-    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", (code == 0), false);
-
-    // optional
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", (code == 0), false); // Required if code == 0
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", (code == 0), false); // Required if code == 0
     PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
     PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
@@ -2995,5 +2757,4 @@
     PXOPT_LOOKUP_F64(bg_kurtosis, config->args, "-bg_kurtosis", false, false);
     PXOPT_LOOKUP_F64(bin_stdev, config->args, "-bin_stdev", false, false);
-
     PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
     PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
@@ -3002,5 +2763,4 @@
     PXOPT_LOOKUP_F64(fringe_resid_1, config->args, "-fringe_resid_1", false, false);
     PXOPT_LOOKUP_F64(fringe_resid_2, config->args, "-fringe_resid_2", false, false);
-
     PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
     PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
@@ -3009,7 +2769,4 @@
     PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
-
-    // default values
-    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
 
     if (!detResidImfileInsert(config->dbh,
@@ -3052,30 +2809,23 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",     "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration",  "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id",     "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",   "class_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-recip",      "recipe", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
-    // select detResidImfile.*
-    // by:
-    // where det_id, iteration, exp_id is not in detResidExp;
-
-    psString query = psStringCopy(
-        "SELECT"
-        "   detRun.det_type,"
-        "   detRun.mode,"
-        "   detResidImfile.*,"
-        "   rawExp.exp_time"
-        " FROM detResidImfile"
-        " JOIN detRun"
-        "   USING(det_id, iteration)"
-        " JOIN rawExp"
-        "   USING(exp_id)"
-        " WHERE"
-    );
-    // NOTE the above WHERE is completed with the following line:
-
+    psString query = pxDataGet("dettool_residimfile.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    // NOTE: the query ends in a WHERE, add the required restriction on detRun.state
     char *value = NULL;
-
-    // add the two required restrictions: detRun.state and detRun.mode
     bool status;
     if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
@@ -3085,9 +2835,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detResidImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detResidImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -3141,4 +2892,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id",  "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-class_id",  "class_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",      "fault", "==");
+
     psString query = pxDataGet("dettool_revertresidimfile.sql");
     if (!query) {
@@ -3147,9 +2905,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detResidImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detResidImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -3169,14 +2928,13 @@
 
 
+/*
+  The SQL returns a list of exposures for which all component class ids have had residuals
+  created.  This list includes the detrend id, iteration, exposure id, detrend type, and
+  whether the exposure was included in the stack for this iteration.
+*/
+
 static bool toresidexpMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-
-    /*
-which returns a list of exposures for which all component class ids
-have had residuals created.  This list includes the detrend id,
-iteration, exposure id, detrend type, and whether the exposure was
-included in the stack for this iteration.
-    */
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
@@ -3188,13 +2946,4 @@
         return false;
     }
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
 
     // treat limit == 0 as "no limit"
@@ -3235,18 +2984,25 @@
 }
 
+/*
+  The SQL returns a list of exposures for which all component class ids have had residuals
+  created.  This list includes the detrend id, iteration, exposure id, detrend type, and
+  whether the exposure was included in the stack for this iteration.
+*/
+
 static bool addresidexpMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
-
+    // limit search by det_id, iteration, exp_id
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false); // required
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
-
-    // Required if code == 0
-    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", (code == 0), false);
-
-    // optional
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", (code == 0), false); // Required if code == 0
     PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
     PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
@@ -3255,5 +3011,4 @@
     PXOPT_LOOKUP_F64(bg_kurtosis, config->args, "-bg_kurtosis", false, false);
     PXOPT_LOOKUP_F64(bin_stdev, config->args, "-bin_stdev", false, false);
-
     PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
     PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
@@ -3262,5 +3017,4 @@
     PXOPT_LOOKUP_F64(fringe_resid_1, config->args, "-fringe_resid_1", false, false);
     PXOPT_LOOKUP_F64(fringe_resid_2, config->args, "-fringe_resid_2", false, false);
-
     PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
     PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
@@ -3269,15 +3023,5 @@
     PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
     PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
-
-    // default values
-    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
     PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
-
-    /*
-which returns a list of exposures for which all component class ids
-have had residuals created.  This list includes the detrend id,
-iteration, exposure id, detrend type, and whether the exposure was
-included in the stack for this iteration.
-    */
 
     psString query = pxDataGet("dettool_toresidexp.sql");
@@ -3287,21 +3031,10 @@
     }
 
-    {
-        // build a query to search by det_id, iteration, exp_id
-        psMetadata *where = psMetadataAlloc();
-
-        PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
-        PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
-        PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
-
-
-        // there's not
-        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-        psFree(where);
-        if (whereClause) {
-            psStringAppend(&query, " WHERE %s", whereClause);
-            psFree(whereClause);
-        }
-    }
+    if (psListLength(where->list)) {
+	psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+	psStringAppend(&query, " WHERE %s", whereClause);
+	psFree(whereClause);
+    }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -3362,27 +3095,27 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id",    "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-recip",     "recipe", "==");
+
+    PXOPT_LOOKUP_U64(limit,    config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple,  config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
-
-    psString query = psStringCopy(
-        "SELECT"
-        "   detRun.mode,"
-        "   detResidExp.*,"
-        "   detInputExp.include"
-        " FROM detRun"
-        " JOIN detInputExp"
-        "   USING(det_id, iteration)"
-        " JOIN detResidExp"
-        "   USING(det_id, iteration, exp_id)"
-        " WHERE"
-        "   detRun.state = 'run'"
-    );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detResidExp");
+    PXOPT_LOOKUP_BOOL(reject,  config->args, "-reject", false);
+
+    psString query = pxDataGet("dettool_residexp.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detResidExp");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -3394,4 +3127,10 @@
     }
 
+    // list only accepted rows
+    // XXX the usage of this flag is unclear : -reject means "accepted"?
+    if (reject) {
+        psStringAppend(&query, " %s", "AND detResidExp.accept != 0");
+    } 
+
     // treat limit == 0 as "no limit"
     if (limit) {
@@ -3436,4 +3175,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id",    "exp_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",      "fault", "==");
+
     psString query = pxDataGet("dettool_revertresidexp.sql");
     if (!query) {
@@ -3442,9 +3187,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detResidExp");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detResidExp");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -3464,4 +3210,50 @@
 
 
+static bool updateresidexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
+
+    // build a query to search by det_id, iteration, exp_id
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
+
+    // find the values we're going to set
+    // copy everything but det_id, iteration, & exp_id from the args and
+    // remove the '-' prefix
+    psMetadata *set = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, set, "-recip", "recipe", "==");
+    PXOPT_COPY_F64(config->args, set, "-bg", "bg", "==");
+    PXOPT_COPY_F64(config->args, set, "-bg_stdev", "bg_stdev", "==");
+    PXOPT_COPY_F64(config->args, set, "-bg_mean_stdev", "bg_mean_stdev", "==");
+    PXOPT_COPY_STR(config->args, set, "-path_base", "path_base", "==");
+
+    // this can't be PXOPT_ macro-ized as reject is !'d
+    if (!psMetadataAddBool(set, PS_LIST_TAIL, "accept", 0, "==", !reject)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+
+    long changed = psDBUpdateRows(config->dbh, "detResidExp", where, set);
+    psFree(set);
+    psFree(where);
+
+    if (changed < 0) {
+        psError(PS_ERR_UNKNOWN, false, "no rows were updated");
+        return false;
+    }
+
+    return true;
+}
+
+/* The SQL returns a list of detrend runs (with detrend id, iteration and detrend type) which
+ * have completed all residexps.
+ */
+
 static bool todetrunsummaryMode(pxConfig *config)
 {
@@ -3470,8 +3262,4 @@
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-
-    /* which returns a list of detrend runs (with detrend id, iteration and
-     * detrend type) which have completed all residexps.
-     */
 
     psString query = pxDataGet("dettool_todetrunsummary.sql");
@@ -3480,13 +3268,4 @@
         return false;
     }
-
-    // XXX does it make sense to accept any search params?
-#if 0
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-#endif
 
     // treat limit == 0 as "no limit"
@@ -3527,56 +3306,58 @@
 }
 
-static bool updateresidexpMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
-
+// this function is used to generate the detrunSummary entries used below
+// XXX why is this a separate function?  roll it back into adddetrunsummary?
+static detRunSummaryRow *mdToDetRunSummary(pxConfig *config, psMetadata *row)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    bool status = false;
+    // from row
+    psS64 det_id = psMetadataLookupS64(&status, row, "det_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for det_id");
+        return false;
+    }
+    psS32 iteration = psMetadataLookupS32(&status, row, "iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for iteration");
+        return false;
+    }
+
+    // optional
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+    PXOPT_LOOKUP_BOOL(accept, config->args, "-accept", false);
+
+    return detRunSummaryRowAlloc(
+            det_id,
+            iteration,
+            bg,
+            bg_stdev,
+            bg_mean_stdev,
+            accept,
+            code
+        );
+}
+
+static bool adddetrunsummaryMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    
     // build a query to search by det_id, iteration, exp_id
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
     PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
-    PXOPT_COPY_STR(config->args, where, "-exp_id", "exp_id", "==");
-
-    // find the values we're going to set
-    // copy everything but det_id, iteration, & exp_id from the args and
-    // remove the '-' prefix
-    psMetadata *set = psMetadataAlloc();
-    // XXX if PXOPT_COPY_* errors here the where md will leak
-    PXOPT_COPY_STR(config->args, set, "-recip", "recipe", "==");
-    PXOPT_COPY_F64(config->args, set, "-bg", "bg", "==");
-    PXOPT_COPY_F64(config->args, set, "-bg_stdev", "bg_stdev", "==");
-    PXOPT_COPY_F64(config->args, set, "-bg_mean_stdev", "bg_mean_stdev", "==");
-    PXOPT_COPY_STR(config->args, set, "-path_base", "path_base", "==");
-
-    // this can't be PXOPT_ macro-ized as reject is !'d
-    if (!psMetadataAddBool(set, PS_LIST_TAIL, "accept", 0, "==", !reject)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-
-    long changed = psDBUpdateRows(config->dbh, "detResidExp", where, set);
-    psFree(set);
-    psFree(where);
-
-    if (changed < 0) {
-        psError(PS_ERR_UNKNOWN, false, "no rows were updated");
-        return false;
-    }
-
-    return true;
-}
-
-static bool adddetrunsummaryMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-
-    // optional
+
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
     PXOPT_LOOKUP_BOOL(again, config->args, "-again", false);
+
+    // The values supplied as arguments on the command (eg, -bg) are parsed 
+    // by mdToDetRunSummary below. 
+    // XXX why is there ever more than one?
 
     psString query = pxDataGet("dettool_find_completed_runs.sql");
@@ -3586,18 +3367,10 @@
     }
 
-    // build a query to search by det_id, iteration, exp_id
-    psMetadata *where = psMetadataAlloc();
-    PXOPT_COPY_STR(config->args, where, "-det_id", "det_id", "==");
-    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
-
-    {
-        // there's not
+    if (psListLength(where->list)) {
         psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-        psFree(where);
-        if (whereClause) {
-            psStringAppend(&query, " WHERE %s", whereClause);
-            psFree(whereClause);
-        }
-    }
+	psStringAppend(&query, " WHERE %s", whereClause);
+	psFree(whereClause);
+    }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -3626,4 +3399,5 @@
     }
 
+    // XXX why is there ever more than one result here?
     for (long i = 0; i < psArrayLength(output); i++) {
         psMetadata *row = output->data[i];
@@ -3654,4 +3428,5 @@
 
     // XXX this logic does not deal with the case of -code being set
+    // XXX it should be an error for -again and -code to both be set
     if (again) {
         if (!startNewIteration(config, (psS64)atoll(det_id))) {
@@ -3680,43 +3455,11 @@
 }
 
-static detRunSummaryRow *mdToDetRunSummary(pxConfig *config, psMetadata *row)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    // from row
-    psS64 det_id = psMetadataLookupS64(&status, row, "det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for det_id");
-        return false;
-    }
-    psS32 iteration = psMetadataLookupS32(&status, row, "iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for iteration");
-        return false;
-    }
-
-    // optional
-    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
-    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
-    PXOPT_LOOKUP_F64(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
-    // default values
-    PXOPT_LOOKUP_BOOL(accept, config->args, "-accept", false);
-    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
-
-    return detRunSummaryRowAlloc(
-            det_id,
-            iteration,
-            bg,
-            bg_stdev,
-            bg_mean_stdev,
-            accept,
-            code
-        );
-}
-
 static bool detrunsummaryMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
@@ -3724,21 +3467,17 @@
     PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
-    psString query = psStringCopy(
-        "SELECT DISTINCT\n"
-        "   detRunSummary.*,\n"
-        "   detRun.det_type,\n"
-        "   detRun.mode\n"
-        " FROM detRun\n"
-        " JOIN detRunSummary\n"
-        "   USING(det_id, iteration)\n"
-        " WHERE\n"
-        "   detRun.state = 'run'\n"
-        );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
+    psString query = pxDataGet("dettool_detrunsummary.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psFree(where);
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "NULL");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (faulted) {
@@ -3792,4 +3531,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_id",    "det_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-iteration", "iteration", "==");
+    PXOPT_COPY_STR(config->args, where, "-code",      "fault", "==");
+
     psString query = pxDataGet("dettool_revertdetrunsummary.sql");
     if (!query) {
@@ -3798,9 +3542,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detRunSummary");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "detRunSummary");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -3823,8 +3568,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-
+    
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
     PXOPT_LOOKUP_BOOL(accept, config->args, "-accept", false);
     PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
@@ -3854,11 +3597,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // det_id is required
-    // XXX this isn't strictly nessicary but not having the det_id complicates
-    // incrementing the iteration number
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
     PXOPT_LOOKUP_BOOL(again, config->args, "-again", false);
     PXOPT_LOOKUP_STR(state, config->args, "-state", false, false);
+
     // either -rerun or -state must be specified
     if (!(again || state)) {
@@ -3867,5 +3607,5 @@
     }
     if (again && state) {
-        psError(PS_ERR_UNKNOWN, true, "either -again or -state must be specified");
+        psError(PS_ERR_UNKNOWN, true, "-accept and -reject are exclusive");
         return false;
     }
@@ -3886,4 +3626,5 @@
 }
 
+// used by updatedetrunMode 
 static bool startNewIteration(pxConfig *config, psS64 det_id)
 {
@@ -3896,7 +3637,5 @@
     }
 
-    // XXX this query was not restricted by det_id, resulting
-    // in an inconsistent UPDATE below.  I added this AND clause
-    // though there may be a cleaner method (EAM 2006.10.08)
+    // restrict the update only to the specified det_id
     psStringAppend(&query, " WHERE det_id = %" PRId64 , det_id);
 
@@ -4151,9 +3890,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required
-    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
-    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
-
-    // optional
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false); // required
+    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", true, false); // required
     PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
     PXOPT_LOOKUP_STR(camera, config->args, "-inst", false, false);
@@ -4178,6 +3914,4 @@
     PXOPT_LOOKUP_STR(parent, config->args, "-parent", false, false);
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
-
-    // default
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
@@ -4191,5 +3925,5 @@
                       0,            // the iteration is fixed at 0
                       det_type,
-                      "register",   // mode
+                      "register",   // mode is required to be "register"
                       "register",   // state
                       filelevel,
@@ -4262,14 +3996,12 @@
 }
 
+// NOTE : this function is also used by addcorrectimfileMode
 bool register_detrend_imfileMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
-    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
-    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
-
-    // optional
+    
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false); // required
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false); // required
     PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
     PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
@@ -4389,2 +4121,95 @@
     return true;
 }
+
+
+#if 0
+// XXX this function was left in commented as this method may be useful in the
+// future
+static psArray *validDetInputClassIds(pxConfig *config, const char *det_id)
+{
+    PS_ASSERT_PTR_NON_NULL(config, NULL);
+    // det_id is input as a string because the fact that it is an integer
+    // is just a database impliementation detail.
+    PS_ASSERT_PTR_NON_NULL(det_id, NULL);
+
+    psArray *rawImfiles = searchInputImfiles(config, det_id);
+    if (!rawImfiles) {
+        return NULL;
+    }
+
+    psArray *valid_class_ids = NULL;
+    {
+        // All this jumping through hoops is so that we end up with unique
+        // values. PP thinks that making multiple passes through this array and
+        // deleting matched elements would end up being more expensive then a
+        // double sort and stagger scheme. JH thinks it would be cheaper to
+        // just do a unqiue sort and delete.  So this is really just a cheap
+        // hack to avoid implimenting a unique sort function but at least it's
+        // stable.
+        psHash *hash = psHashAlloc(psArrayLength(rawImfiles));
+        for (long i = 0; i < psArrayLength(rawImfiles); i++) {
+            psHashAdd(hash,
+                ((rawImfileRow *)rawImfiles->data[i])->class_id,
+                ((rawImfileRow *)rawImfiles->data[i])->class_id
+            );
+        }
+        valid_class_ids = psHashToArray(hash);
+        psFree(hash);
+    }
+    psFree(rawImfiles);
+
+    return valid_class_ids;
+}
+
+static psArray *searchInputImfiles(pxConfig *config, const char *det_id)
+{
+    PS_ASSERT_PTR_NON_NULL(config, NULL);
+    // det_id is input as a string because the fact that it is an integer
+    // is just a database impliementation detail.
+    PS_ASSERT_PTR_NON_NULL(det_id, NULL);
+
+    psArray *inputExps = NULL;
+    {
+        psMetadata *where = psMetadataAlloc();
+        if (!psMetadataAddS32(where, PS_LIST_TAIL, "det_id", 0, "==",
+                (psS32)atoi(det_id))) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
+            psFree(where);
+            return NULL;
+        }
+        inputExps = detInputExpSelectRowObjects(config->dbh, where, 0);
+        psFree(where);
+    }
+    if (!inputExps) {
+        psError(PS_ERR_UNKNOWN, false, "no detInputExp rows found");
+        return NULL;
+    }
+
+    // find rawImfiles associated with detInputExps
+    psArray *rawImfiles = NULL;
+    {
+        psMetadata *where = psMetadataAlloc();
+        for (long i = 0; i < psArrayLength(inputExps); i++) {
+            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id",
+                    PS_META_DUPLICATE_OK, "==",
+                    ((detInputExpRow *)inputExps->data[i])->exp_id)) {
+                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+                psFree(inputExps);
+                psFree(where);
+                return NULL;
+            }
+        }
+        psFree(inputExps);
+        rawImfiles = rawImfileSelectRowObjects(config->dbh, where, 0);
+        // XXX this really should be sorted for uniqueness
+        psFree(where);
+    }
+    if (!rawImfiles) {
+        psError(PS_ERR_UNKNOWN, false, "no rawImfile rows found");
+        return NULL;
+    }
+
+    return rawImfiles;
+}
+#endif
+
Index: trunk/ippTools/src/dettool.h
===================================================================
--- trunk/ippTools/src/dettool.h	(revision 18531)
+++ trunk/ippTools/src/dettool.h	(revision 18561)
@@ -17,4 +17,8 @@
  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
 
 #ifndef DETTOOL_H
Index: trunk/ippTools/src/dettoolConfig.c
===================================================================
--- trunk/ippTools/src/dettoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/dettoolConfig.c	(revision 18561)
@@ -18,11 +18,4 @@
  */
 
-#ifdef HAVE_CONFIG_H
-#include <config.h>
-#endif
-
-#include <psmodules.h>
-
-#include "pxtools.h"
 #include "dettool.h"
 
@@ -46,1098 +39,627 @@
 
     // -pending
+    // XXX EAM : is this used?  does it make sense?
     psMetadata *pendingArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exposure ID", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "search by exposure type", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-inst",  0,
-            "search by camera", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-telescope",  0,
-            "search by telescope", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-filter",  0,
-            "search by filter", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-uri",  0,
-            "search by URL", NULL);
-    psMetadataAddBool(pendingArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_type",  0,            "search by exposure type", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-inst",  0,            "search by camera", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-telescope",  0,            "search by telescope", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-filter",  0,            "search by filter", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-uri",  0,            "search by URL", NULL);
+    psMetadataAddBool(pendingArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -definebytag
     psMetadata *definebytagArgs = psMetadataAlloc();
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-exp_id",
-            PS_META_DUPLICATE_OK,
-            "include this exposure (multiple OK, required)", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-det_type",  0,
-            "define the type of detrend run (required)", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-mode",  0,
-            "define the mode of this detrend run", "master");
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "define filelevel", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-workdir",  0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-inst",  0,
-            "define camera", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-telescope",  0,
-            "define telescope", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "define exposure type", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-filter",  0,
-            "define filter ", NULL);
-    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min exposure time", NAN);
-    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max exposure time", NAN);
-    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-time_begin",  0,
-            "detrend applies to exposures taken during this period", NULL);
-    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-time_end",  0,
-            "detrend applies to exposures taken during this period", NULL);
-    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-use_begin",  0,
-            "start of detrend run applicable period", NULL);
-    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-use_end",  0,
-            "end of detrend run applicable period", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-reduction",  0,
-            "define reduction class for processing", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-label",  0,
-            "define detrun label", NULL);
-    psMetadataAddBool(definebytagArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-exp_id",            PS_META_DUPLICATE_OK,           "include this exposure (multiple OK, required)", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-det_type",  0,            "define the type of detrend run (required)", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-mode",  0,            "define the mode of this detrend run", "master");
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-filelevel",  0,            "define filelevel", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-workdir",  0,            "define workdir (required)", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-inst",  0,            "define camera", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-telescope",  0,            "define telescope", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-exp_type",  0,            "define exposure type", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-filter",  0,            "define filter ", NULL);
+    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-exp_time_min",  0,            "define min exposure time", NAN);
+    psMetadataAddF32(definebytagArgs, PS_LIST_TAIL, "-exp_time_max",  0,            "define max exposure time", NAN);
+    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-time_begin",  0,            "detrend applies to exposures taken during this period", NULL);
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-time_end",  0,            "detrend applies to exposures taken during this period", NULL);
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-use_begin",  0,            "start of detrend run applicable period", NULL);
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-use_end",  0,            "end of detrend run applicable period", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-reduction",  0,            "define reduction class for processing", NULL);
+    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-label",  0,            "define detrun label", NULL);
+    psMetadataAddBool(definebytagArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -definebyquery
     psMetadata *definebyqueryArgs = psMetadataAlloc();
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-det_type",  0,
-            "define the type of detrend run (required)", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-mode",  0,
-            "define the mode of this detrend run", "master");
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "define filelevel", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-workdir",  0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-inst",  0,
-            "define camera (required)", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-telescope",  0,
-            "define telescope", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-filter",  0,
-            "define filter ", NULL);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min exposure time", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max exposure time", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-time_begin",  0,
-            "detrend applies to exposures taken during this period", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-time_end",  0,
-            "detrend applies to exposures taken during this period", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-use_begin",  0,
-            "start of detrend run applicable period", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-use_end",  0,
-            "end of detrend run applicable period", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_type",  0,
-            "search for exp_type", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_inst",  0,
-            "search for camera", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_filter",  0,
-            "search for filter", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_uri",  0,
-            "search for uri", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_begin", 0,
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_sat_pixel_frac_max",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_min",  0,
-            "define min exposure time", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_max",  0,
-            "define max exposure time", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_pon_time_min",  0,
-            "define min power-on time", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_pon_time_max",  0,
-            "define max power-on time", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_max",  0,
-            "define max solar angle", NAN);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-pretend",  0,
-            "print the exposures that would be included in the detrend run and exit", false);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-reduction",  0,
-            "define reduction class for processing", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-label",  0,
-            "define detrun label", NULL);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-random_subset",  0,
-            "use a random subset of elements", false);
-    psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-random_limit",  0,
-            "use this number of random elements", 20);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-det_type",  0,            "define the type of detrend run (required)", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-mode",  0,            "define the mode of this detrend run", "master");
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-filelevel",  0,            "define filelevel", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-workdir",  0,            "define workdir (required)", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-inst",  0,            "define camera (required)", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-telescope",  0,            "define telescope", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-filter",  0,            "define filter ", NULL);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-exp_time_min",  0,            "define min exposure time", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-exp_time_max",  0,            "define max exposure time", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-time_begin",  0,            "detrend applies to exposures taken during this period", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-time_end",  0,            "detrend applies to exposures taken during this period", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-use_begin",  0,            "start of detrend run applicable period", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-use_end",  0,            "end of detrend run applicable period", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_type",  0,            "search for exp_type", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_inst",  0,            "search for camera", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_telescope",  0,            "search for telescope", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_filter",  0,            "search for filter", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_uri",  0,            "search for uri", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_begin", 0,            "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_end", 0,            "search for exposures by time (<)", NULL);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_sat_pixel_frac_max",  0,            "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_min",  0,            "define min exposure time", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_max",  0,            "define max exposure time", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_pon_time_min",  0,            "define min power-on time", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_pon_time_max",  0,            "define max power-on time", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_max",  0,            "define max solar angle", NAN);
+    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-pretend",  0,            "print the exposures that would be included in the detrend run and exit", false);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-reduction",  0,            "define reduction class for processing", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-label",  0,            "define detrun label", NULL);
+    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-random_subset",  0,            "use a random subset of elements", false);
+    psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-random_limit",  0,            "use this number of random elements", 20);
 
     // -definebydetrun
     psMetadata *definebydetrunArgs = psMetadataAlloc();
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-det_id",  0,
-            "det ID to base a new detRun on (required)", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_det_type",  0,
-            "define the type of detrend run", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_mode",  0,
-            "define the mode of this detrend run", "master");
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_exp_type",  0,
-            "define exposure type", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_filelevel",  0,
-            "define filelevel", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_workdir",  0,
-            "define workdir", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_filter",  0,
-            "define filter ", NULL);
-    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_airmass_min",  0,
-            "define airmass", NAN);
-    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_airmass_max",  0,
-            "define airmass", NAN);
-    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_exp_time_min",  0,
-            "define exposure time", NAN);
-    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_exp_time_max",  0,
-            "define exposure time", NAN);
-    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_ccd_temp_min",  0,
-            "define ccd tempature", NAN);
-    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_ccd_temp_max",  0,
-            "define ccd tempature", NAN);
-    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_posang_min",  0,
-            "define rotator position angle", NAN);
-    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_posang_max",  0,
-            "define rotator position angle", NAN);
-    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_time_begin",  0,
-            "start of period to apply detrend too", NULL);
-    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_time_end",  0,
-            "end of period to apply detrend too", NULL);
-    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_use_begin",  0,
-            "start of detrend run applicable period", NULL);
-    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_use_end",  0,
-            "end of detrend run applicable period", NULL);
-    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_solang_min",  0,
-            "define solar angle", NAN);
-    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_solang_max",  0,
-            "define solar angle", NAN);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-filter_input_begin", 0,
-            "filter input detrun exp to be in this period", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-filter_input_end", 0,
-            "filter input detrun exp to be in this period", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_reduction",  0,
-            "define reduction class for processing", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_label",  0,
-            "define detrun label", NULL);
-    psMetadataAddBool(definebydetrunArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
-
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-det_id",  0,            "det ID to base a new detRun on (required)", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_det_type",  0,            "define the type of detrend run", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_mode",  0,            "define the mode of this detrend run", "master");
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_exp_type",  0,            "define exposure type", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_filelevel",  0,            "define filelevel", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_workdir",  0,            "define workdir", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_filter",  0,            "define filter ", NULL);
+    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_airmass_min",  0,            "define airmass", NAN);
+    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_airmass_max",  0,            "define airmass", NAN);
+    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_exp_time_min",  0,            "define exposure time", NAN);
+    psMetadataAddF32(definebydetrunArgs, PS_LIST_TAIL, "-set_exp_time_max",  0,            "define exposure time", NAN);
+    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_ccd_temp_min",  0,            "define ccd tempature", NAN);
+    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_ccd_temp_max",  0,            "define ccd tempature", NAN);
+    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_posang_min",  0,            "define rotator position angle", NAN);
+    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_posang_max",  0,            "define rotator position angle", NAN);
+    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_solang_min",  0,            "define solar angle", NAN);
+    psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_solang_max",  0,            "define solar angle", NAN);
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_registered",  0,            "time detrend run was registered", now);
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_time_begin",  0,            "start of period to apply detrend too", NULL);
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_time_end",  0,            "end of period to apply detrend too", NULL);
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_use_begin",  0,            "start of detrend run applicable period", NULL);
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_use_end",  0,            "end of detrend run applicable period", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_reduction",  0,            "define reduction class for processing", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_label",  0,            "define detrun label", NULL);
+    psMetadataAddBool(definebydetrunArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_input_begin", 0,     "require input exp to be in this period", NULL);
+    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_input_end", 0,       "require input exp to be in this period", NULL);
+
+    // *** these are in dettool_correction.c ***
     // -makecorrection
     psMetadata *makecorrectionArgs = psMetadataAlloc();
-    psMetadataAddStr(makecorrectionArgs, PS_LIST_TAIL, "-det_id",  0,
-            "det ID to be corrected (required)", NULL);
-    psMetadataAddBool(makecorrectionArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(makecorrectionArgs, PS_LIST_TAIL, "-det_id",  0,            "det ID to be corrected (required)", NULL);
+    psMetadataAddBool(makecorrectionArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -tocorrectexp
     psMetadata *tocorrectexpArgs = psMetadataAlloc();
-    psMetadataAddU64(tocorrectexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tocorrectexpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddU64(tocorrectexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tocorrectexpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -tocorrectimfile
     psMetadata *tocorrectimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(tocorrectimfileArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search for detrend ID", NULL);
-    psMetadataAddU64(tocorrectimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tocorrectimfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(tocorrectimfileArgs, PS_LIST_TAIL, "-det_id", 0,            "search for detrend ID", NULL);
+    psMetadataAddU64(tocorrectimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tocorrectimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addcorrectimfile
     psMetadata *addcorrectimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID (required)", NULL);
-    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-uri",  0,
-            "define resid file URI", NULL);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
+    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search for class ID (required)", NULL);
+    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-uri",  0,            "define resid file URI", NULL);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addcorrectimfileArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(addcorrectimfileArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
 
     // -runs
     psMetadata *runsArgs = psMetadataAlloc();
-    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-det_type",  0,
-            "search for type of detrend run", NULL);
-    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-active",  0,
-            "only return active detRuns", false);
-    psMetadataAddU64(runsArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search for detrend ID", NULL);
-
-    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-inst", 0,
-            "search for camera (instrument)", NULL);
-    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-telescope", 0,
-            "search for telescope", NULL);
-    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-filter", 0,
-            "search for filter", NULL);
-
-    psMetadataAddF32(runsArgs, PS_LIST_TAIL, "-airmass", 0,
-            "match airmass", NAN);
-    psMetadataAddF32(runsArgs, PS_LIST_TAIL, "-exp_time", 0,
-            "match exp time", NAN);
-    psMetadataAddF32(runsArgs, PS_LIST_TAIL, "-ccd_temp", 0,
-            "match ccd temp", NAN);
-    psMetadataAddF64(runsArgs, PS_LIST_TAIL, "-posang", 0,
-            "match posang", NAN);
+    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-det_type",  0,            "search for type of detrend run", NULL);
+    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-det_id", 0,            "search for detrend ID", NULL);
+    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-inst", 0,            "search for camera (instrument)", NULL);
+    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-telescope", 0,            "search for telescope", NULL);
+    psMetadataAddStr(runsArgs, PS_LIST_TAIL, "-filter", 0,            "search for filter", NULL);
+    psMetadataAddF32(runsArgs, PS_LIST_TAIL, "-airmass", 0,            "match airmass", NAN);
+    psMetadataAddF32(runsArgs, PS_LIST_TAIL, "-exp_time", 0,            "match exp time", NAN);
+    psMetadataAddF32(runsArgs, PS_LIST_TAIL, "-ccd_temp", 0,            "match ccd temp", NAN);
+    psMetadataAddF64(runsArgs, PS_LIST_TAIL, "-posang", 0,            "match posang", NAN);
+    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    psMetadataAddBool(runsArgs, PS_LIST_TAIL, "-active",  0,            "only return active detRuns", false);
+    psMetadataAddU64(runsArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
 
     // -childlessrun
     psMetadata *childlessrunArgs = psMetadataAlloc();
-    psMetadataAddStr(childlessrunArgs, PS_LIST_TAIL, "-det_type",  0,
-            "search for type of detrend run", NULL);
-    psMetadataAddU64(childlessrunArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(childlessrunArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(childlessrunArgs, PS_LIST_TAIL, "-det_type",  0,            "search for type of detrend run", NULL);
+    psMetadataAddU64(childlessrunArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(childlessrunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -input
     psMetadata *inputArgs = psMetadataAlloc();
-    psMetadataAddStr(inputArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search for detrend ID", NULL);
-    psMetadataAddS32(inputArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(inputArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search for exp ID", NULL);
-    psMetadataAddBool(inputArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(inputArgs, PS_LIST_TAIL, "-det_id", 0,            "search for detrend ID", NULL);
+    psMetadataAddS32(inputArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddS64(inputArgs, PS_LIST_TAIL, "-exp_id",  0,            "search for exp ID", 0);
+    psMetadataAddBool(inputArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -raw
     psMetadata *rawArgs = psMetadataAlloc();
-    psMetadataAddBool(rawArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddBool(rawArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -toprocessedimfile
     psMetadata *toprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(toprocessedimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID", NULL);
-    psMetadataAddStr(toprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search for exp ID", NULL);
-    psMetadataAddStr(toprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID", NULL);
-    psMetadataAddU64(toprocessedimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(toprocessedimfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(toprocessedimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID", NULL);
+    psMetadataAddStr(toprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search for exp ID", NULL);
+    psMetadataAddStr(toprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search for class ID", NULL);
+    psMetadataAddU64(toprocessedimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(toprocessedimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addprocessedimfile
     psMetadata *addprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define exp ID (required)", NULL);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "define class ID (required)", NULL);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-uri",  0,
-            "define URI", NULL);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-recip",  0,
-            "define recipe", NULL);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-fringe_0",  0,
-            "define fringe slope (0th term)", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-fringe_1",  0,
-            "define fringe slope (1st term)", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-fringe_2",  0,
-            "define fringe slope (2nd term)", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
-    psMetadataAddS16(addprocessedimfileArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define exp ID (required)", NULL);
+    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "define class ID (required)", NULL);
+    psMetadataAddS16(addprocessedimfileArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-uri",  0,            "define URI", NULL);
+    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-recip",  0,            "define recipe", NULL);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-fringe_0",  0,            "define fringe slope (0th term)", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-fringe_1",  0,            "define fringe slope (1st term)", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-fringe_2",  0,            "define fringe slope (2nd term)", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addprocessedimfileArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
 
     // -processedimfile
     psMetadata *processedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID", NULL);
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search for exp ID", NULL);
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID", NULL);
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-select_state",  0,
-            "search for state", NULL);
-    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-select_mode",  0,
-            "search for mode", NULL);
-    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-chip",  0,
-            "restrict results to completed 'chip' sets", false);
-    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-exp",  0,
-            "restrict results to complete 'exposures'", false);
-    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-included",  0,
-            "restrict results to exposures 'includeded' in the current iteration", false);
-    psMetadataAddU64(processedimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID", NULL);
+    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search for exp ID", NULL);
+    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search for class ID", NULL);
+    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-select_state",  0,            "search for state", NULL);
+    psMetadataAddStr(processedimfileArgs, PS_LIST_TAIL, "-select_mode",  0,            "search for mode", NULL);
+    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-included",  0,            "restrict results to exposures 'includeded' in the current iteration", false);
+    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddU64(processedimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+
+    // XXX these don't seem to be used anymore
+    // psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-chip",  0,            "restrict results to completed 'chip' sets", false);
+    // psMetadataAddBool(processedimfileArgs, PS_LIST_TAIL, "-exp",  0,            "restrict results to complete 'exposures'", false);
 
     // -revertprocessedimfile
     psMetadata *revertprocessedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID (required)", NULL);
-    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exposure ID", NULL);
-    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search by class ID", NULL);
-    psMetadataAddS16(revertprocessedimfileArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID (required)", NULL);
+    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", NULL);
+    psMetadataAddStr(revertprocessedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search by class ID", NULL);
+    psMetadataAddS16(revertprocessedimfileArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -toprocessedexp
     psMetadata *toprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddU64(toprocessedexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(toprocessedexpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddU64(toprocessedexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(toprocessedexpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addproccessedexp
     psMetadata *addprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-recip",  0,
-            "define recipe", NULL);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_0",  0,
-            "define fringe slope (0th term)", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_1",  0,
-            "define fringe slope (1st term)", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_2",  0,
-            "define fringe slope (2nd term)", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
-    psMetadataAddS16(addprocessedexpArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-recip",  0,            "define recipe", NULL);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_0",  0,            "define fringe slope (0th term)", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_1",  0,            "define fringe slope (1st term)", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-fringe_2",  0,            "define fringe slope (2nd term)", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addprocessedexpArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
+    psMetadataAddS16(addprocessedexpArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
 
     // -proccessedexp
     psMetadata *processedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(processedexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID", NULL);
-    psMetadataAddStr(processedexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define detrend ID", NULL);
-    psMetadataAddU64(processedexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(processedexpArgs, PS_LIST_TAIL, "-det_id",  0,            "search by detrend ID", NULL);
+    psMetadataAddStr(processedexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp ID", NULL);
+    psMetadataAddU64(processedexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(processedexpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertprocessedexp
     psMetadata *revertprocessedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search by detrend ID (required)", NULL);
-    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exposure ID", NULL);
-    psMetadataAddS16(revertprocessedexpArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-det_id",  0,            "search by detrend ID (required)", NULL);
+    psMetadataAddStr(revertprocessedexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exposure ID", NULL);
+    psMetadataAddS16(revertprocessedexpArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -tostacked
     psMetadata *tostackedArgs = psMetadataAlloc();
-    psMetadataAddU64(tostackedArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tostackedArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddU64(tostackedArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tostackedArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addstacked
     psMetadata *addstackedArgs = psMetadataAlloc();
-    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddS32(addstackedArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-class_id",  0,
-            "define class ID (required)", NULL);
-    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-recip",  0,
-            "define recipe", NULL);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-uri",  0,
-            "define URI", NULL);
-    psMetadataAddS16(addstackedArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddS32(addstackedArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number (required)", 0);
+    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-class_id",  0,            "define class ID (required)", NULL);
+    psMetadataAddS16(addstackedArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-uri",  0,            "define URI", NULL);
+    psMetadataAddStr(addstackedArgs, PS_LIST_TAIL, "-recip",  0,            "define recipe", NULL);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addstackedArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
 
     // -stacked
     psMetadata *stackedArgs = psMetadataAlloc();
-    psMetadataAddStr(stackedArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID", NULL);
-    psMetadataAddS32(stackedArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search for iteration number", 0);
-    psMetadataAddStr(stackedArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID", NULL);
-    psMetadataAddStr(stackedArgs, PS_LIST_TAIL, "-recip",  0,
-            "search for recipe", NULL);
-    psMetadataAddU64(stackedArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(stackedArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(stackedArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(stackedArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID", NULL);
+    psMetadataAddS32(stackedArgs, PS_LIST_TAIL, "-iteration",  0,            "search for iteration number", 0);
+    psMetadataAddStr(stackedArgs, PS_LIST_TAIL, "-class_id",  0,            "search for class ID", NULL);
+    psMetadataAddStr(stackedArgs, PS_LIST_TAIL, "-recip",  0,            "search for recipe", NULL);
+    psMetadataAddU64(stackedArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(stackedArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(stackedArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertstacked
     psMetadata *revertstackedArgs= psMetadataAlloc();
-    psMetadataAddStr(revertstackedArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID (required)", NULL);
-    psMetadataAddS32(revertstackedArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search by iteration number", 0);
-    psMetadataAddStr(revertstackedArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search by class ID", NULL);
-    psMetadataAddS16(revertstackedArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertstackedArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID (required)", NULL);
+    psMetadataAddS32(revertstackedArgs, PS_LIST_TAIL, "-iteration",  0,            "search by iteration number", 0);
+    psMetadataAddStr(revertstackedArgs, PS_LIST_TAIL, "-class_id",  0,            "search by class ID", NULL);
+    psMetadataAddS16(revertstackedArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
+
+    // -tonormalizedstat
+    psMetadata *tonormalizedstatArgs = psMetadataAlloc();
+    psMetadataAddU64(tonormalizedstatArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tonormalizedstatArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+
+    // -addnormalizedstat
+    psMetadata *addnormstatArgs = psMetadataAlloc();
+    psMetadataAddStr(addnormstatArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddS32(addnormstatArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddStr(addnormstatArgs, PS_LIST_TAIL, "-class_id",  0,            "define class ID (required)", NULL);
+    psMetadataAddF32(addnormstatArgs, PS_LIST_TAIL, "-norm",  0,            "define normal value (required)", NAN);
+    psMetadataAddS16(addnormstatArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+
+    // -normalizedstat
+    psMetadata *normalizedstatArgs = psMetadataAlloc();
+    psMetadataAddStr(normalizedstatArgs, PS_LIST_TAIL, "-det_id",  0,            "search by detrend ID", NULL);
+    psMetadataAddS32(normalizedstatArgs, PS_LIST_TAIL, "-iteration",  0,            "search by iteration number", 0);
+    psMetadataAddStr(normalizedstatArgs, PS_LIST_TAIL, "-class_id",  0,            "search by class ID", NULL);
+    psMetadataAddU64(normalizedstatArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(normalizedstatArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(normalizedstatArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+
+    // -revertnormalizedstat
+    psMetadata *revertnormalizedstatArgs= psMetadataAlloc();
+    psMetadataAddStr(revertnormalizedstatArgs, PS_LIST_TAIL, "-det_id",  0,            "search by detrend ID (required)", NULL);
+    psMetadataAddS32(revertnormalizedstatArgs, PS_LIST_TAIL, "-iteration",  0,            "search by iteration number", 0);
+    psMetadataAddStr(revertnormalizedstatArgs, PS_LIST_TAIL, "-class_id",  0,            "search by class ID", NULL);
+    psMetadataAddS16(revertnormalizedstatArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -tonormalize
     psMetadata *tonormalizeArgs = psMetadataAlloc();
-    psMetadataAddU64(tonormalizeArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tonormalizeArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-
-    // -addnormalizedstat
-    psMetadata *addnormstatArgs = psMetadataAlloc();
-    psMetadataAddStr(addnormstatArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddS32(addnormstatArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(addnormstatArgs, PS_LIST_TAIL, "-class_id",  0,
-            "define class ID (required)", NULL);
-    psMetadataAddF32(addnormstatArgs, PS_LIST_TAIL, "-norm",  0,
-            "define normal value (required)", NAN);
-    psMetadataAddS16(addnormstatArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
-
-    // -normalizedstat
-    psMetadata *normalizedstatArgs = psMetadataAlloc();
-    psMetadataAddStr(normalizedstatArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search by detrend ID", NULL);
-    psMetadataAddS32(normalizedstatArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search by iteration number", 0);
-    psMetadataAddStr(normalizedstatArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search by class ID", NULL);
-    psMetadataAddU64(normalizedstatArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(normalizedstatArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(normalizedstatArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-
-    // -revertnormalizedstat
-    psMetadata *revertnormalizedstatArgs= psMetadataAlloc();
-    psMetadataAddStr(revertnormalizedstatArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search by detrend ID (required)", NULL);
-    psMetadataAddS32(revertnormalizedstatArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search by iteration number", 0);
-    psMetadataAddStr(revertnormalizedstatArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search by class ID", NULL);
-    psMetadataAddS16(revertnormalizedstatArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
-
-    // -tonormstat
-    psMetadata *tonormstatArgs = psMetadataAlloc();
-    psMetadataAddU64(tonormstatArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tonormstatArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddU64(tonormalizeArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tonormalizeArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addnormalizedimfile
     psMetadata *addnormalizedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-det_id", 0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddS32(addnormalizedimfileArgs, PS_LIST_TAIL, "-iteration", 0,
-            "define iteration number", 0);
-    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-class_id", 0,
-            "define class ID (required)", NULL);
-    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-uri", 0,
-            "define URI", NULL);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-bg", 0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-bg_stdev", 0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev", 0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-path_base", 0,
-            "define base output location", NULL);
-    psMetadataAddS16(addnormalizedimfileArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-det_id", 0,            "define detrend ID (required)", NULL);
+    psMetadataAddS32(addnormalizedimfileArgs, PS_LIST_TAIL, "-iteration", 0,            "define iteration number", 0);
+    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-class_id", 0,            "define class ID (required)", NULL);
+    psMetadataAddS16(addnormalizedimfileArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-uri", 0,            "define URI", NULL);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-bg", 0,            "define exposure background", NAN);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-bg_stdev", 0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev", 0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addnormalizedimfileArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(addnormalizedimfileArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", NULL);
 
     // -normalizedimfile
     psMetadata *normalizedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(normalizedimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID", NULL);
-    psMetadataAddS32(normalizedimfileArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search for iteration number", 0);
-    psMetadataAddStr(normalizedimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID", NULL);
-    psMetadataAddStr(normalizedimfileArgs, PS_LIST_TAIL, "-recip",  0,
-            "search for recipe", NULL);
-    psMetadataAddU64(normalizedimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(normalizedimfileArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(normalizedimfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(normalizedimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID", NULL);
+    psMetadataAddS32(normalizedimfileArgs, PS_LIST_TAIL, "-iteration",  0,            "search for iteration number", 0);
+    psMetadataAddStr(normalizedimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search for class ID", NULL);
+    psMetadataAddStr(normalizedimfileArgs, PS_LIST_TAIL, "-recip",  0,            "search for recipe", NULL);
+    psMetadataAddU64(normalizedimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(normalizedimfileArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(normalizedimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertnormalizedimfile
     psMetadata *revertnormalizedimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(revertnormalizedimfileArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search by detrend ID (required)", NULL);
-    psMetadataAddS32(revertnormalizedimfileArgs, PS_LIST_TAIL, "-iteration", 0,
-            "search by iteration number", 0);
-    psMetadataAddStr(revertnormalizedimfileArgs, PS_LIST_TAIL, "-class_id", 0,
-            "search by class ID", NULL);
-    psMetadataAddS16(revertnormalizedimfileArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertnormalizedimfileArgs, PS_LIST_TAIL, "-det_id", 0,            "search by detrend ID (required)", NULL);
+    psMetadataAddS32(revertnormalizedimfileArgs, PS_LIST_TAIL, "-iteration", 0,            "search by iteration number", 0);
+    psMetadataAddStr(revertnormalizedimfileArgs, PS_LIST_TAIL, "-class_id", 0,            "search by class ID", NULL);
+    psMetadataAddS16(revertnormalizedimfileArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -tonormalizedexp
     psMetadata *tonormalizedexpArgs = psMetadataAlloc();
-    psMetadataAddU64(tonormalizedexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tonormalizedexpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddU64(tonormalizedexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tonormalizedexpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addnormalizedexp
     psMetadata *addnormalizedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(addnormalizedexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddS32(addnormalizedexpArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(addnormalizedexpArgs, PS_LIST_TAIL, "-recip",  0,
-            "search for recipe", NULL);
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-
-    psMetadataAddStr(addnormalizedexpArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
-    psMetadataAddS16(addnormalizedexpArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddStr(addnormalizedexpArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddS32(addnormalizedexpArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddS16(addnormalizedexpArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddStr(addnormalizedexpArgs, PS_LIST_TAIL, "-recip",  0,            "search for recipe", NULL);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addnormalizedexpArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(addnormalizedexpArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
 
     // -normalizedexp
     psMetadata *normalizedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(normalizedexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID", NULL);
-    psMetadataAddS32(normalizedexpArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(normalizedexpArgs, PS_LIST_TAIL, "-recip",  0,
-            "search for recipe", NULL);
-    psMetadataAddF64(normalizedexpArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(normalizedexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(normalizedexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddStr(normalizedexpArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
-    psMetadataAddU64(normalizedexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(normalizedexpArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(normalizedexpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(normalizedexpArgs, PS_LIST_TAIL, "-det_id",  0,            "search by detrend ID", NULL);
+    psMetadataAddS32(normalizedexpArgs, PS_LIST_TAIL, "-iteration",  0,            "search by iteration number", 0);
+    psMetadataAddStr(normalizedexpArgs, PS_LIST_TAIL, "-recip",  0,            "search for recipe", NULL);
+    psMetadataAddU64(normalizedexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(normalizedexpArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(normalizedexpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertnormalizedexp
     psMetadata *revertnormalizedexpArgs = psMetadataAlloc();
-    psMetadataAddStr(revertnormalizedexpArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search by detrend ID (required)", NULL);
-    psMetadataAddS32(revertnormalizedexpArgs, PS_LIST_TAIL, "-iteration", 0,
-            "search by iteration number", 0);
-    psMetadataAddS16(revertnormalizedexpArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertnormalizedexpArgs, PS_LIST_TAIL, "-det_id", 0,            "search by detrend ID (required)", NULL);
+    psMetadataAddS32(revertnormalizedexpArgs, PS_LIST_TAIL, "-iteration", 0,            "search by iteration number", 0);
+    psMetadataAddS16(revertnormalizedexpArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -toresidimfile
     psMetadata *toresidimfileArgs = psMetadataAlloc();
-    psMetadataAddU64(toresidimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(toresidimfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddU64(toresidimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(toresidimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+
+    // -addresidimfile
+    psMetadata *addresidimfileArgs = psMetadataAlloc();
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddS32(addresidimfileArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "define class ID (required)", NULL);
+    psMetadataAddS16(addresidimfileArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-uri",  0,            "define resid file URI", NULL);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-recip",  0,            "define recipe", NULL);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_skewness",  0,            "define exposure background skewness", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_kurtosis",  0,            "define exposure background kurtosis", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bin_stdev",  0,            "define exposure background binned stdev", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_0",  0,            "define fringe slope (0th term)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_1",  0,            "define fringe slope (1st term)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_2",  0,            "define fringe slope (2nd term)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_resid_0",  0,            "define fringe residual (0th term)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_resid_1",  0,            "define fringe residual (1st term)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_resid_2",  0,            "define fringe residual (2nd term)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
+
+    // -residimfile
+    psMetadata *residimfileArgs = psMetadataAlloc();
+    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID", NULL);
+    psMetadataAddS32(residimfileArgs, PS_LIST_TAIL, "-iteration",  0,            "search for iteration number", 0);
+    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by detrend ID", NULL);
+    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search for class ID", NULL);
+    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-recip",  0,            "search for recipe", NULL);
+    psMetadataAddU64(residimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(residimfileArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(residimfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-select_state",  0,            "search for state", NULL);
+
+    // -revertresidimfile
+    psMetadata *revertresidimfileArgs =  psMetadataAlloc();
+    psMetadataAddStr(revertresidimfileArgs, PS_LIST_TAIL, "-det_id", 0,          "search by detrend ID (required)", NULL);
+    psMetadataAddS32(revertresidimfileArgs, PS_LIST_TAIL, "-iteration", 0,       "search by iteration number", 0);
+    psMetadataAddStr(revertresidimfileArgs, PS_LIST_TAIL, "-exp_id",  0,         "search by detrend ID", NULL);
+    psMetadataAddStr(revertresidimfileArgs, PS_LIST_TAIL, "-class_id",  0,       "search for class ID", NULL);
+    psMetadataAddS16(revertresidimfileArgs, PS_LIST_TAIL, "-code",  0,           "search by fault code", 0);
 
     // -toresidexp
     psMetadata *toresidexpArgs = psMetadataAlloc();
-    psMetadataAddU64(toresidexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(toresidexpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-
-    // -addresidimfile
-    psMetadata *addresidimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddS32(addresidimfileArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "define class ID (required)", NULL);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-uri",  0,
-            "define resid file URI", NULL);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-recip",  0,
-            "define recipe", NULL);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_skewness",  0,
-            "define exposure background skewness", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bg_kurtosis",  0,
-            "define exposure background kurtosis", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-bin_stdev",  0,
-            "define exposure background binned stdev", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_0",  0,
-            "define fringe slope (0th term)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_1",  0,
-            "define fringe slope (1st term)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_2",  0,
-            "define fringe slope (2nd term)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_resid_0",  0,
-            "define fringe residual (0th term)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_resid_1",  0,
-            "define fringe residual (1st term)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-fringe_resid_2",  0,
-            "define fringe residual (2nd term)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addresidimfileArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(addresidimfileArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
-    psMetadataAddS16(addresidimfileArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
-
-    // -residimfile
-    psMetadata *residimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID", NULL);
-    psMetadataAddS32(residimfileArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search for iteration number", 0);
-    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define detrend ID", NULL);
-    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID", NULL);
-    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-recip",  0,
-            "search for recipe", NULL);
-    psMetadataAddU64(residimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(residimfileArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(residimfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-    psMetadataAddStr(residimfileArgs, PS_LIST_TAIL, "-select_state",  0,
-            "search for state", NULL);
-
-    // -revertresidimfile
-    psMetadata *revertresidimfileArgs =  psMetadataAlloc();
-    psMetadataAddStr(revertresidimfileArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search by detrend ID (required)", NULL);
-    psMetadataAddS32(revertresidimfileArgs, PS_LIST_TAIL, "-iteration", 0,
-            "search by iteration number", 0);
-    psMetadataAddStr(revertresidimfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by detrend ID", NULL);
-    psMetadataAddStr(revertresidimfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID", NULL);
-    psMetadataAddS16(revertresidimfileArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddU64(toresidexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(toresidexpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addresidexp
     psMetadata *addresidexpArgs = psMetadataAlloc();
-    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddS32(addresidexpArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-recip",  0,
-            "define recipe", NULL);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_skewness",  0,
-            "define exposure background skewness", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_kurtosis",  0,
-            "define exposure background kurtosis", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bin_stdev",  0,
-            "define exposure background binned stdev", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_0",  0,
-            "define fringe slope (0th term)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_1",  0,
-            "define fringe slope (1st term)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_2",  0,
-            "define fringe slope (2nd term)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_resid_0",  0,
-            "define fringe residual (0th term)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_resid_1",  0,
-            "define fringe residual (1st term)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_resid_2",  0,
-            "define fringe residual (2nd term)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
-    psMetadataAddS16(addresidexpArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
-    psMetadataAddBool(addresidexpArgs, PS_LIST_TAIL, "-reject",  0,
-            "exposure is not to be stacked in the next iteration", false);
+    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddS32(addresidexpArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddS16(addresidexpArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-recip",  0,            "define recipe", NULL);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_skewness",  0,            "define exposure background skewness", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bg_kurtosis",  0,            "define exposure background kurtosis", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-bin_stdev",  0,            "define exposure background binned stdev", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_0",  0,            "define fringe slope (0th term)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_1",  0,            "define fringe slope (1st term)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_2",  0,            "define fringe slope (2nd term)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_resid_0",  0,            "define fringe residual (0th term)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_resid_1",  0,            "define fringe residual (1st term)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-fringe_resid_2",  0,            "define fringe residual (2nd term)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(addresidexpArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(addresidexpArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
+    psMetadataAddBool(addresidexpArgs, PS_LIST_TAIL, "-reject",  0,            "exposure is not to be stacked in the next iteration", false);
 
     // -residexp
     psMetadata *residexpArgs = psMetadataAlloc();
-    psMetadataAddStr(residexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID", NULL);
-    psMetadataAddS32(residexpArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search for iteration number", 0);
-    psMetadataAddStr(residexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search for exp ID", NULL);
-    psMetadataAddStr(residexpArgs, PS_LIST_TAIL, "-recip",  0,
-            "search for recipe", NULL);
-    psMetadataAddU64(residexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(residexpArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(residexpArgs, PS_LIST_TAIL, "-reject",  0,
-            "search for acceptable residuals", false);
-    psMetadataAddBool(residexpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(residexpArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID", NULL);
+    psMetadataAddS32(residexpArgs, PS_LIST_TAIL, "-iteration",  0,            "search for iteration number", 0);
+    psMetadataAddStr(residexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "search for exp ID", NULL);
+    psMetadataAddStr(residexpArgs, PS_LIST_TAIL, "-recip",  0,            "search for recipe", NULL);
+    psMetadataAddBool(residexpArgs, PS_LIST_TAIL, "-reject",  0,            "search for acceptable residuals", false);
+    psMetadataAddU64(residexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(residexpArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(residexpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertresidexp
     psMetadata *revertresidexpArgs = psMetadataAlloc();
-    psMetadataAddStr(revertresidexpArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search by detrend ID (required)", NULL);
-    psMetadataAddS32(revertresidexpArgs, PS_LIST_TAIL, "-iteration", 0,
-            "search by iteration number", 0);
-    psMetadataAddStr(revertresidexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by detrend ID", NULL);
-    psMetadataAddS16(revertresidexpArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertresidexpArgs, PS_LIST_TAIL, "-det_id", 0,            "search by detrend ID (required)", NULL);
+    psMetadataAddS32(revertresidexpArgs, PS_LIST_TAIL, "-iteration", 0,            "search by iteration number", 0);
+    psMetadataAddStr(revertresidexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by detrend ID", NULL);
+    psMetadataAddS16(revertresidexpArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
+
+    // -updateresidexp
+    psMetadata *updateresidexpArgs = psMetadataAlloc();
+    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID", NULL);
+    psMetadataAddS32(updateresidexpArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-exp_id",  0,            "define exp ID", NULL);
+    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-recip",  0,            "define recipe", NULL);
+    psMetadataAddF64(updateresidexpArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(updateresidexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(updateresidexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
+    psMetadataAddBool(updateresidexpArgs, PS_LIST_TAIL, "-reject",  0,            "exposure is not to be stacked in the next iteration", false);
 
     // -todetrunsummary
     psMetadata *todetrunsummaryArgs = psMetadataAlloc();
-    psMetadataAddBool(todetrunsummaryArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-    psMetadataAddU64(todetrunsummaryArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-
-    // -updateresidexp
-    psMetadata *updateresidexpArgs = psMetadataAlloc();
-    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID", NULL);
-    psMetadataAddS32(updateresidexpArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define exp ID", NULL);
-    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-recip",  0,
-            "define recipe", NULL);
-    psMetadataAddF64(updateresidexpArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(updateresidexpArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(updateresidexpArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddStr(updateresidexpArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
-    psMetadataAddBool(updateresidexpArgs, PS_LIST_TAIL, "-reject",  0,
-            "exposure is not to be stacked in the next iteration", false);
+    psMetadataAddBool(todetrunsummaryArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    psMetadataAddU64(todetrunsummaryArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
 
     // -adddetrunsummary
     psMetadata *adddetrunsummaryArgs = psMetadataAlloc();
-    psMetadataAddStr(adddetrunsummaryArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddS32(adddetrunsummaryArgs, PS_LIST_TAIL, "-iteration",  0,
-            "define iteration number", 0);
-    psMetadataAddF64(adddetrunsummaryArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(adddetrunsummaryArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(adddetrunsummaryArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddS16(adddetrunsummaryArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
-    psMetadataAddBool(adddetrunsummaryArgs, PS_LIST_TAIL, "-accept",  0,
-            "declare that this detrun iteration is accepted as a master", false);
-    psMetadataAddBool(adddetrunsummaryArgs, PS_LIST_TAIL, "-again",  0,
-            "start a new iteration of this detrend run", false);
+    psMetadataAddStr(adddetrunsummaryArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddS32(adddetrunsummaryArgs, PS_LIST_TAIL, "-iteration",  0,            "define iteration number", 0);
+    psMetadataAddF64(adddetrunsummaryArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(adddetrunsummaryArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(adddetrunsummaryArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddS16(adddetrunsummaryArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddBool(adddetrunsummaryArgs, PS_LIST_TAIL, "-accept",  0,            "declare that this detrun iteration is accepted as a master", false);
+    psMetadataAddBool(adddetrunsummaryArgs, PS_LIST_TAIL, "-again",  0,            "start a new iteration of this detrend run", false);
 
     // -detrunsummary
     psMetadata *detrunsummaryArgs = psMetadataAlloc();
-    psMetadataAddStr(detrunsummaryArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend ID", NULL);
-    psMetadataAddU64(detrunsummaryArgs, PS_LIST_TAIL, "-limit",  0,
-                     "limit result set to N items", 0);
-    psMetadataAddS32(detrunsummaryArgs, PS_LIST_TAIL, "-iteration",  0,
-            "search for iteration number", 0);
-    psMetadataAddBool(detrunsummaryArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddBool(detrunsummaryArgs, PS_LIST_TAIL, "-reject",  0,
-            "search for acceptable residuals", false);
-    psMetadataAddBool(detrunsummaryArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(detrunsummaryArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend ID", NULL);
+    psMetadataAddS32(detrunsummaryArgs, PS_LIST_TAIL, "-iteration",  0,            "search for iteration number", 0);
+    psMetadataAddU64(detrunsummaryArgs, PS_LIST_TAIL, "-limit",  0,                     "limit result set to N items", 0);
+    psMetadataAddBool(detrunsummaryArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddBool(detrunsummaryArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    psMetadataAddBool(detrunsummaryArgs, PS_LIST_TAIL, "-reject",  0,            "search for acceptable residuals", false);
 
     // -revertdetrunsummary
     psMetadata *revertdetrunsummaryArgs = psMetadataAlloc();
-    psMetadataAddStr(revertdetrunsummaryArgs, PS_LIST_TAIL, "-det_id", 0,
-            "search by detrend ID (required)", NULL);
-    psMetadataAddS32(revertdetrunsummaryArgs, PS_LIST_TAIL, "-iteration", 0,
-            "search by iteration number", 0);
-    psMetadataAddS16(revertdetrunsummaryArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertdetrunsummaryArgs, PS_LIST_TAIL, "-det_id", 0,            "search by detrend ID (required)", NULL);
+    psMetadataAddS32(revertdetrunsummaryArgs, PS_LIST_TAIL, "-iteration", 0,            "search by iteration number", 0);
+    psMetadataAddS16(revertdetrunsummaryArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -updatedetrunsummary
     psMetadata *updatedetrunsummaryArgs = psMetadataAlloc();
-    psMetadataAddStr(updatedetrunsummaryArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend master for detrend ID (required)", NULL);
-    psMetadataAddBool(updatedetrunsummaryArgs, PS_LIST_TAIL, "-accept",  0,
-            "declare that this detrun iteration is accepted as a master", false);
-    psMetadataAddBool(updatedetrunsummaryArgs, PS_LIST_TAIL, "-reject",  0,
-            "reject this detrun iteration as a master", false);
+    psMetadataAddStr(updatedetrunsummaryArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend master for detrend ID (required)", NULL);
+    psMetadataAddBool(updatedetrunsummaryArgs, PS_LIST_TAIL, "-accept",  0,            "declare that this detrun iteration is accepted as a master", false);
+    psMetadataAddBool(updatedetrunsummaryArgs, PS_LIST_TAIL, "-reject",  0,            "reject this detrun iteration as a master", false);
 
     // -updatedetrun
     psMetadata *updatedetrunArgs = psMetadataAlloc();
-    psMetadataAddStr(updatedetrunArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend master for detrend ID (required)", NULL);
-    psMetadataAddBool(updatedetrunArgs, PS_LIST_TAIL, "-again",  0,
-            "start a new iteration of this detrend run", false);
-    psMetadataAddStr(updatedetrunArgs, PS_LIST_TAIL, "-state",  0,
-            "set the state of this detrend run", false);
+    psMetadataAddStr(updatedetrunArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend master for detrend ID (required)", NULL);
+    psMetadataAddBool(updatedetrunArgs, PS_LIST_TAIL, "-again",  0,            "start a new iteration of this detrend run", false);
+    psMetadataAddStr(updatedetrunArgs, PS_LIST_TAIL, "-state",  0,            "set the state of this detrend run", false);
 
     // -rerun
     psMetadata *rerunArgs = psMetadataAlloc();
-    psMetadataAddStr(rerunArgs, PS_LIST_TAIL, "-det_id",  0,
-            "search for detrend master for detrend ID (required)", NULL);
-    psMetadataAddStr(rerunArgs, PS_LIST_TAIL, "-exp_id",  PS_META_DUPLICATE_OK,
-            "include this exposure (multiple OK, required)", NULL);
+    psMetadataAddStr(rerunArgs, PS_LIST_TAIL, "-det_id",  0,            "search for detrend master for detrend ID (required)", NULL);
+    psMetadataAddStr(rerunArgs, PS_LIST_TAIL, "-exp_id",  PS_META_DUPLICATE_OK,            "include this exposure (multiple OK, required)", NULL);
 
     // -register_detrend
     psMetadata *register_detrendArgs = psMetadataAlloc();
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-det_type",  0,
-            "define the type of detrend run (required)", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-mode",  0,
-            "define the mode of this detrend run", "master");
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "define filelevel (required)", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-workdir",  0,
-            "define workdir", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-inst",  0,
-            "define camera", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-telescope",  0,
-            "define telescope", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "define exposure type", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-filter",  0,
-            "define filter ", NULL);
-    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min exposure time", NAN);
-    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max exposure time", NAN);
-    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-time_begin",  0,
-            "detrend applies to exposures taken during this period", NULL);
-    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-time_end",  0,
-            "detrend applies to exposures taken during this period", NULL);
-    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_begin",  0,
-            "start of detrend run applicable period", NULL);
-    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_end",  0,
-            "end of detrend run applicable period", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-parent",  0,
-            "define parent det_id", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-label",  0,
-            "define detrun label", NULL);
-    psMetadataAddBool(register_detrendArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-det_type",  0,            "define the type of detrend run (required)", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-filelevel",  0,            "define filelevel (required)", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-workdir",  0,            "define workdir", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-inst",  0,            "define camera", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-telescope",  0,            "define telescope", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-exp_type",  0,            "define exposure type", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-filter",  0,            "define filter ", NULL);
+    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-exp_time_min",  0,            "define min exposure time", NAN);
+    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-exp_time_max",  0,            "define max exposure time", NAN);
+    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF32(register_detrendArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-time_begin",  0,            "detrend applies to exposures taken during this period", NULL);
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-time_end",  0,            "detrend applies to exposures taken during this period", NULL);
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_begin",  0,            "start of detrend run applicable period", NULL);
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_end",  0,            "end of detrend run applicable period", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-parent",  0,            "define parent det_id", NULL);
+    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-label",  0,            "define detrun label", NULL);
+    psMetadataAddBool(register_detrendArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -register_detrend_imfile
     psMetadata *register_detrend_imfileArgs = psMetadataAlloc();
-    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-det_id",  0,
-            "define detrend ID (required)", NULL);
-    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-class_id",  0,
-            "search for class ID (required)", NULL);
-    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-uri",  0,
-            "define resid file URI (required)", NULL);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_1",  0,
-            "define user statistic (1)", NAN);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_2",  0,
-            "define user statistic (2)", NAN);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_3",  0,
-            "define user statistic (3)", NAN);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_4",  0,
-            "define user statistic (4)", NAN);
-    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_5",  0,
-            "define user statistic (5)", NAN);
-    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-path_base",  0,
-            "define base output location", NULL);
+    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-det_id",  0,            "define detrend ID (required)", NULL);
+    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-class_id",  0,            "search for class ID (required)", NULL);
+    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-uri",  0,            "define resid file URI (required)", NULL);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-bg_mean_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_1",  0,            "define user statistic (1)", NAN);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_2",  0,            "define user statistic (2)", NAN);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_3",  0,            "define user statistic (3)", NAN);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_4",  0,            "define user statistic (4)", NAN);
+    psMetadataAddF64(register_detrend_imfileArgs, PS_LIST_TAIL, "-user_5",  0,            "define user statistic (5)", NAN);
+    psMetadataAddStr(register_detrend_imfileArgs, PS_LIST_TAIL, "-path_base",  0,            "define base output location", NULL);
 
     psFree(now);
@@ -1175,5 +697,5 @@
     PXOPT_ADD_MODE("-revertnormalizedstat",  "", DETTOOL_MODE_REVERTNORMALIZEDSTAT,   revertnormalizedstatArgs);
 
-    PXOPT_ADD_MODE("-tonormalizedstat",      "", DETTOOL_MODE_TONORMALIZEDSTAT,    tonormstatArgs);
+    PXOPT_ADD_MODE("-tonormalizedstat",      "", DETTOOL_MODE_TONORMALIZEDSTAT,    tonormalizedstatArgs);
     PXOPT_ADD_MODE("-addnormalizedimfile", "", DETTOOL_MODE_ADDNORMALIZEDIMFILE,addnormalizedimfileArgs);
     PXOPT_ADD_MODE("-normalizedimfile","", DETTOOL_MODE_NORMALIZEDIMFILE, normalizedimfileArgs);
@@ -1213,106 +735,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-    addWhereStr(det_id);
-    {
-        // XXX this is broke because you can't specify -iteration 0
-        psMetadataItem *item = psMetadataLookup(config->args, "-iteration");
-        if (item && psStrcasestr(item->comment, "found")) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "iteration", 0, "==", item->data.S32)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(det_type);
-    addWhereStr(exp_id);
-    addWhereStr(class_id);
-    // convert '-inst' to 'camera'
-    {
-        psString str = NULL;
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
-            if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(telescope);
-    addWhereStr(exp_type);
-    {
-        int n = 0;
-        bool status = false;
-        if ((n = psMetadataLookupS32(&status, config->args, "-imfiles"))) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "imfiles", 0, "==", n)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(filter);
-    addWhereStr(recipe);
-    {
-        int n = 0;
-        bool status = false;
-        if ((n = psMetadataLookupS32(&status, config->args, "-guide_version"))) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "guide_version", 0, "==", n)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item guide_version");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    {
-        bool boolean = false;
-        bool status = false;
-
-        // map reject -> !accept
-        if ((boolean = psMetadataLookupBool(&status, config->args, "-reject"))) {
-            if (!psMetadataAddBool(config->where, PS_LIST_TAIL, "accept", 0, "==", !boolean)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item reject");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
Index: trunk/ippTools/src/dettool_correction.c
===================================================================
--- trunk/ippTools/src/dettool_correction.c	(revision 18531)
+++ trunk/ippTools/src/dettool_correction.c	(revision 18561)
@@ -18,17 +18,4 @@
  */
 
-#ifdef HAVB_CONFIG_H
-#include <config.h>
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <inttypes.h>
-
-#include <ippdb.h>
-
-#include "pxtools.h"
 #include "dettool.h"
 
@@ -37,16 +24,13 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status     = false;
-    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
-        return false;
-    }
-    if (!det_id) {
-        psError(PS_ERR_UNKNOWN, true, "-det_id is required");
-        return false;
-    }
-
-    psArray *runs = detRunSelectRowObjects(config->dbh, config->where, 1);
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false); // required
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false); // optional
+
+    // build the needed where 
+    psMetadata *where = psMetadataAlloc();
+    psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", (psS64)atoll(det_id));
+    psArray *runs = detRunSelectRowObjects(config->dbh, where, 1);
+    psFree (where);
+
     if (!psArrayLength(runs)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -103,11 +87,9 @@
     }
 
-    psArray *detRuns = NULL;
-    {
-        psMetadata *where = psMetadataAlloc();
-        psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", new_det_id);
-        detRuns = psDBSelectRows(config->dbh, "detRun", where, 0);
-        psFree(where);
-    }
+    psMetadata *where_new = psMetadataAlloc();
+    psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", new_det_id);
+    psArray *detRuns = psDBSelectRows(config->dbh, "detRun", where_new, 0);
+    psFree(where_new);
+
     if (!detRuns) {
         psError(PS_ERR_UNKNOWN, false, "can't find the detRun we just created");
@@ -118,14 +100,4 @@
         psAbort("found more then one detRun matching det_id %" PRId64 "(this should not happen)", new_det_id);
         return false;
-    }
-
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
     }
 
@@ -145,10 +117,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = pxDataGet("dettool_tocorrectexp.sql");
@@ -183,14 +151,4 @@
     }
 
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detRun", !simple)) {
@@ -209,10 +167,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-det_type", "det_type", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = pxDataGet("dettool_tocorrectimfile.sql");
@@ -222,9 +179,11 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "det1");
+    if (psListLength(where->list)) {
+	// NOTE the SQL uses an intermediate table 'det1' for this query
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "det1"); 
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree (where);
 
     // treat limit == 0 as "no limit"
@@ -253,14 +212,4 @@
     }
 
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detPendingCorrectImfile", !simple)) {
@@ -275,4 +224,5 @@
 }
 
+// NOTE : the command-line args are parsed by register_detrend_imfileMode
 bool addcorrectimfileMode(pxConfig *config)
 {
Index: trunk/ippTools/src/difftool.c
===================================================================
--- trunk/ippTools/src/difftool.c	(revision 18531)
+++ trunk/ippTools/src/difftool.c	(revision 18561)
@@ -104,6 +104,6 @@
 
     // default
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     diffRunRow *run = diffRunRowAlloc(
@@ -282,6 +282,15 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_S64(config->args, where,  "-diff_id", "diff_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
+    PXOPT_COPY_STR(config->args, where,  "-tess_id", "tess_id", "==");
+    PXOPT_COPY_STR(config->args, where,  "-kind", "kind", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(template, config->args, "-template", false);
 
     // find all rawImfiles matching the default query
@@ -292,9 +301,18 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
-        psStringAppend(&query, " %s", whereClause);
+    if (template) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "WHERE diffInputSkyfile.template != 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "WHERE diffInputSkyfile.template = 0");
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -351,4 +369,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where,  "-diff_id", "diff_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -360,9 +381,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "diffSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "diffSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -418,22 +440,9 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", true, false);
-
-    // default to 0
+    
+    PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", true, false); // required
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
-
-    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
-    if (code == 0 && !uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-
-    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
-    if (code == 0 && !path_base) {
-        psError(PS_ERR_UNKNOWN, true, "-path_base is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", (code == 0), false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", (code == 0), false);
 
     // optional
@@ -441,9 +450,9 @@
     PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
     PXOPT_LOOKUP_F32(dtime_diff, config->args, "-dtime_diff", false, false);
-    PXOPT_LOOKUP_STR(hostname, config->args, "-hostname", false, false);
-    PXOPT_LOOKUP_F32(good_frac, config->args, "-good_frac", false, false);
     PXOPT_LOOKUP_S32(stamps_num, config->args, "-stamps_num", false, false);
     PXOPT_LOOKUP_F32(stamps_rms, config->args, "-stamps_rms", false, false);
     PXOPT_LOOKUP_S32(sources, config->args, "-sources", false, false);
+    PXOPT_LOOKUP_STR(hostname, config->args, "-hostname", false, false);
+    PXOPT_LOOKUP_F32(good_frac, config->args, "-good_frac", false, false);
 
     if (!psDBTransaction(config->dbh)) {
@@ -495,4 +504,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where,  "-diff_id", "diff_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-tess_id", "tess_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -504,9 +518,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "diffSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "diffSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -563,4 +578,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where,  "-diff_id", "diff_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code",     "fault", "==");
+
     psString query = pxDataGet("difftool_revertdiffskyfile.sql");
     if (!query) {
@@ -569,9 +588,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "diffSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "diffSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -741,12 +761,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
-    PXOPT_LOOKUP_STR(skycell_id, config->args, "-skycell_id", true, false);
-    PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false);
-
-    // optional
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false); // required options
+    PXOPT_LOOKUP_STR(skycell_id, config->args, "-skycell_id", true, false); // required options
+    PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false); // required options
+    PXOPT_LOOKUP_S64(template_warp_id, config->args, "-template_warp_id", false, false);
     PXOPT_LOOKUP_S64(template_stack_id, config->args, "-template_stack_id", false, false);
-    PXOPT_LOOKUP_S64(template_warp_id, config->args, "-template_warp_id", false, false);
+    PXOPT_LOOKUP_S64(input_warp_id, config->args, "-input_warp_id", false, false);
+    PXOPT_LOOKUP_S64(input_stack_id, config->args, "-input_stack_id", false, false);
 
     if (template_stack_id && template_warp_id) {
@@ -760,6 +779,4 @@
     }
 
-    PXOPT_LOOKUP_S64(input_stack_id, config->args, "-input_stack_id", false, false);
-    PXOPT_LOOKUP_S64(input_warp_id, config->args, "-input_warp_id", false, false);
     if (input_stack_id && input_warp_id) {
         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Only one input can be defined.");
@@ -787,10 +804,15 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
-
-    // default
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_S64(config->args, where,  "-diff_id", "diff_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
+    PXOPT_COPY_STR(config->args, where,  "-tess_id", "tess_id", "==");
+    PXOPT_COPY_STR(config->args, where,  "-kind", "kind", "==");
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false); // required options
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_BOOL(template, config->args, "-template", false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     // find all things to queue
@@ -801,9 +823,18 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereSQL(config->where, NULL);
-        psStringAppend(&query, " %s", whereClause);
+    if (template) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "WHERE diffInputSkyfile.template != 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "WHERE diffInputSkyfile.template = 0");
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
Index: trunk/ippTools/src/difftoolConfig.c
===================================================================
--- trunk/ippTools/src/difftoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/difftoolConfig.c	(revision 18561)
@@ -47,145 +47,91 @@
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,
-            "define skycell ID (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "define tessellation ID (required)", NULL);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,            "define skycell ID (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID (required)", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define diff ID (required)", 0);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
-            "set state (required)", NULL);
-#if 0
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-#endif
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-diff_id", 0,            "define diff ID (required)", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "set state (required)", NULL);
 
     // -addinputskyfile
     psMetadata *addinputskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define diff ID (required)", 0);
-    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "define warp ID", 0);
-    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID", 0);
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-kind", 0,
-            "define kind", NULL);
-    psMetadataAddBool(addinputskyfileArgs, PS_LIST_TAIL, "-template",  0,
-            "this sky cell file is the subtrahend", false);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "define diff ID (required)", 0);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,            "define stack ID", 0);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,            "define warp ID", 0);
+    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-kind", 0,            "define kind", NULL);
+    psMetadataAddBool(addinputskyfileArgs, PS_LIST_TAIL, "-template",  0,            "this sky cell file is the subtrahend", false);
 
     // -inputskyfile
     psMetadata *inputskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "search by diff ID", 0);
-    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", 0);
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-skycell_id", 0,
-            "search by skycell ID", NULL);
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-tess_id", 0,
-            "search by tess ID", NULL);
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-kind", 0,
-            "search by kind", NULL);
-    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-template",  0,
-            "search by subtrahend", false);
-    psMetadataAddU64(inputskyfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "search by diff ID", 0);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warp ID", 0);
+    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-skycell_id", 0,            "search by skycell ID", NULL);
+    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-tess_id", 0,            "search by tess ID", NULL);
+    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-kind", 0,            "search by kind", NULL);
+    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-template",  0,            "search by subtrahend", false);
+    psMetadataAddU64(inputskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -todiffskyfile
     psMetadata *todiffskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(todiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "search by diff ID", 0);
-    psMetadataAddU64(todiffskyfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(todiffskyfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(todiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "search by diff ID", 0);
+    psMetadataAddU64(todiffskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(todiffskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -adddiffskyfile
     psMetadata *adddiffskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(adddiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define warp ID (required)", 0);
-    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-uri", 0,
-            "define URI of file", 0);
-    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-path_base", 0,
-            "define base output location", 0);
-    psMetadataAddF64(adddiffskyfileArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(adddiffskyfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background mean stdev", NAN);
-    psMetadataAddF32(adddiffskyfileArgs, PS_LIST_TAIL, "-dtime_diff",  0,
-            "define elapsed processing time", NAN);
-    psMetadataAddS32(adddiffskyfileArgs, PS_LIST_TAIL, "-stamps_num",  0,
-            "define subtraction stamp number", 0);
-    psMetadataAddF32(adddiffskyfileArgs, PS_LIST_TAIL, "-stamps_rms",  0,
-            "define subtraction stamp rms", NAN);
-    psMetadataAddS32(adddiffskyfileArgs, PS_LIST_TAIL, "-sources",  0,
-            "define number of sources", 0);
-    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-hostname", 0,
-            "define hostname", 0);
-    psMetadataAddF32(adddiffskyfileArgs, PS_LIST_TAIL, "-good_frac",  0,
-            "define %% of good pixels", NAN);
-    psMetadataAddS16(adddiffskyfileArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddS64(adddiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "define warp ID (required)", 0);
+    psMetadataAddS16(adddiffskyfileArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
+    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-uri", 0,            "define URI of file", 0);
+    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", 0);
+    psMetadataAddF64(adddiffskyfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(adddiffskyfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background mean stdev", NAN);
+    psMetadataAddF32(adddiffskyfileArgs, PS_LIST_TAIL, "-dtime_diff",  0,            "define elapsed processing time", NAN);
+    psMetadataAddS32(adddiffskyfileArgs, PS_LIST_TAIL, "-stamps_num",  0,            "define subtraction stamp number", 0);
+    psMetadataAddF32(adddiffskyfileArgs, PS_LIST_TAIL, "-stamps_rms",  0,            "define subtraction stamp rms", NAN);
+    psMetadataAddS32(adddiffskyfileArgs, PS_LIST_TAIL, "-sources",  0,            "define number of sources", 0);
+    psMetadataAddStr(adddiffskyfileArgs, PS_LIST_TAIL, "-hostname", 0,            "define hostname", 0);
+    psMetadataAddF32(adddiffskyfileArgs, PS_LIST_TAIL, "-good_frac",  0,            "define %% of good pixels", NAN);
 
     // -diffskyfile
     psMetadata *diffskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(diffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "search by warp ID", 0);
-    psMetadataAddStr(diffskyfileArgs , PS_LIST_TAIL, "-skycell_id",  0,
-            "define skycell ID", NULL);
-    psMetadataAddStr(diffskyfileArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "define tessellation ID", NULL);
-    psMetadataAddU64(diffskyfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(diffskyfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(diffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "search by warp ID", 0);
+    psMetadataAddStr(diffskyfileArgs , PS_LIST_TAIL, "-skycell_id",  0,            "define skycell ID", NULL);
+    psMetadataAddStr(diffskyfileArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID", NULL);
+    psMetadataAddU64(diffskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(diffskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertdiffskyfile
     psMetadata *revertdiffskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(revertdiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define warp ID (required)", 0);
-    psMetadataAddS16(revertdiffskyfileArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddS64(revertdiffskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "define warp ID (required)", 0);
+    psMetadataAddS16(revertdiffskyfileArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -definepoprun
     psMetadata *definepoprunArgs = psMetadataAlloc();
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddTime(definepoprunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-skycell_id",  0,
-            "define skycell ID (required)", NULL);
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "define tessellation ID (required)", NULL);
-    psMetadataAddBool(definepoprunArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
-    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_warp_id", 0,
-            "define warp ID for template", 0);
-    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_stack_id", 0,
-            "define stack ID for template", 0);
-    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-input_warp_id", 0,
-            "define warp ID for input", 0);
-    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-input_stack_id", 0,
-            "define stack ID for input", 0);
+    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddTime(definepoprunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-skycell_id",  0,            "define skycell ID (required)", NULL);
+    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID (required)", NULL);
+    psMetadataAddBool(definepoprunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_warp_id", 0,            "define warp ID for template", 0);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-template_stack_id", 0,            "define stack ID for template", 0);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-input_warp_id", 0,            "define warp ID for input", 0);
+    psMetadataAddS64(definepoprunArgs, PS_LIST_TAIL, "-input_stack_id", 0,            "define stack ID for input", 0);
 
     // -definebyquery
     psMetadata *queueArgs = psMetadataAlloc();
-    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddTime(queueArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddBool(queueArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(queueArgs, PS_LIST_TAIL, "-diff_id", 0,            "search by diff ID", 0);
+    psMetadataAddS64(queueArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warp ID", 0);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-skycell_id", 0,            "search by skycell ID", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-tess_id", 0,            "search by tess ID", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-kind", 0,            "search by kind", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddTime(queueArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddBool(queueArgs, PS_LIST_TAIL, "-template",  0,            "search by subtrahend", false);
+    psMetadataAddBool(queueArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     psFree(now);
@@ -216,78 +162,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereS32(name) \
-{ \
-    psS32 s32 = 0; \
-    bool status = false; \
-    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-{
-    psS64 s64 = 0;
-    bool status = false;
-    if ((s64 = psMetadataLookupS64(&status, config->args, "-diff_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "diff_id", 0, "==", s64)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item diff_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-{
-    psString str = NULL;
-    bool status = false;
-    if ((str = psMetadataLookupStr(&status, config->args, "-warp_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "warp_id", 0, "==", (psS64)atoll(str))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-    addWhereStr(skycell_id);
-    addWhereStr(tess_id);
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
Index: trunk/ippTools/src/flatcorr.c
===================================================================
--- trunk/ippTools/src/flatcorr.c	(revision 18531)
+++ trunk/ippTools/src/flatcorr.c	(revision 18561)
@@ -92,16 +92,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
-
     psMetadata *where = psMetadataAlloc();
-    // convert exp_id into a psS64
-    if (exp_id) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(exp_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-            psFree(where);
-            return false; 
-        }
-    }
-
+
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
     PXOPT_COPY_STR(config->args, where, "-exp_name", "exp_name", "==");
     PXOPT_COPY_STR(config->args, where, "-inst", "camera", "==");
@@ -110,9 +101,10 @@
     PXOPT_COPY_TIME(config->args, where, "-dateobs_end", "dateobs", "<=");
     PXOPT_COPY_STR(config->args, where, "-exp_tag", "exp_tag", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_type", "exp_type", "==");
     PXOPT_COPY_STR(config->args, where, "-filelevel", "filelvel", "==");
     PXOPT_COPY_STR(config->args, where, "-reduction", "reduction", "==");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
-    PXOPT_COPY_F64(config->args, where, "-airmass_min", "airmass", ">=");
-    PXOPT_COPY_F64(config->args, where, "-airmass_max", "airmass", "<");
+    PXOPT_COPY_F32(config->args, where, "-airmass_min", "airmass", ">=");
+    PXOPT_COPY_F32(config->args, where, "-airmass_max", "airmass", "<");
     PXOPT_COPY_F64(config->args, where, "-ra_min", "ra", ">=");
     PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
@@ -157,7 +149,4 @@
     PXOPT_LOOKUP_STR(region, config->args, "-set_region", false, false);
 
-    // default
-    PXOPT_COPY_STR(config->args, where, "-exp_type", "exp_type", "==");
-
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -324,39 +313,40 @@
 
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(limit, config->args, "-limit", false);
 
     // create a temp table to hold completely processed chipRuns
-{
-    psString query = pxDataGet("flatcorr_create_tmp_chiprundone.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-
-    psFree(query);
-}
-
+    {
+	psString query = pxDataGet("flatcorr_create_tmp_chiprundone.sql");
+	if (!query) {
+	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	    return false;
+	}
+
+	if (!p_psDBRunQuery(config->dbh, query)) {
+	    psError(PS_ERR_UNKNOWN, false, "database error");
+	    psFree(query);
+	    return false;
+	}
+
+	psFree(query);
+    }
    
     // find all completed chipRuns
-{
-    psString query = pxDataGet("flatcorr_completely_processed_chiprun.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-
-    psFree(query);
-}
+    {
+	psString query = pxDataGet("flatcorr_completely_processed_chiprun.sql");
+	if (!query) {
+	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	    return false;
+	}
+
+	if (!p_psDBRunQuery(config->dbh, query)) {
+	    psError(PS_ERR_UNKNOWN, false, "database error");
+	    psFree(query);
+	    return false;
+	}
+
+	psFree(query);
+    }
+
     // find flatcorrRun's that have had all of their chipRun's completed by
     // comparing against the temp table
@@ -367,4 +357,11 @@
     }
 
+    // treat limit == 0 as "no limit"
+    if (limit) {
+	psString limitString = psDBGenerateLimitSQL(limit);
+	psStringAppend(&query, " %s", limitString);
+	psFree(limitString);
+    }
+
     if (!p_psDBRunQuery(config->dbh, query)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -377,10 +374,10 @@
         psErrorCode err = psErrorCodeLast();
         switch (err) {
-            case PS_ERR_DB_CLIENT:
-                psError(PXTOOLS_ERR_SYS, false, "database error");
-            case PS_ERR_DB_SERVER:
-                psError(PXTOOLS_ERR_PROG, false, "database error");
-            default:
-                psError(PXTOOLS_ERR_PROG, false, "unknown error");
+	  case PS_ERR_DB_CLIENT:
+	    psError(PXTOOLS_ERR_SYS, false, "database error");
+	  case PS_ERR_DB_SERVER:
+	    psError(PXTOOLS_ERR_PROG, false, "database error");
+	  default:
+	    psError(PXTOOLS_ERR_PROG, false, "unknown error");
         }
 
@@ -412,4 +409,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-corr_id", "corr_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -422,9 +422,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
Index: trunk/ippTools/src/flatcorrConfig.c
===================================================================
--- trunk/ippTools/src/flatcorrConfig.c	(revision 18531)
+++ trunk/ippTools/src/flatcorrConfig.c	(revision 18561)
@@ -48,140 +48,81 @@
     psMetadata *newrunArgs = psMetadataAlloc();
     // XXX need to allow multiple exp_ids
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_name",  0,
-            "search by exp_name", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-inst",  0,
-            "search for camera", NULL); 
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddTime(newrunArgs, PS_LIST_TAIL, "-dateobs_begin", 0,   
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(newrunArgs, PS_LIST_TAIL, "-dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_tag",  0,
-            "search by exp_tag", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "search by exp_type", "object");
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "search by filelevel", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-reduction",  0,
-            "search by reduction class", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-filter",  0,
-            "search for filter", NULL); 
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN); 
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-ra_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-ra_max",  0,
-            "define max", NAN); 
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-decl_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-decl_max",  0,
-            "define max", NAN); 
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min", NAN);
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max", NAN); 
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,
-            "define min fraction of saturated pixels", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-alt_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-alt_max",  0,
-            "define max", NAN); 
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-az_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-az_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,   
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-object",  0,
-            "search by exposure object", NULL);
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_workdir",  0,
-            "define workdir", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_label",  0,
-            "define label", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_reduction",  0,
-            "define reduction class", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_expgroup",  0,
-            "define exposure group", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_dvodb",  0,
-            "define DVO db", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_filter",  0,
-            "define filter", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_tess_id",  0,
-            "define tessalation", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_end_stage",  0,
-            "define processing end stage", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_region",  0,
-            "define region", NULL);
+    psMetadataAddS64(newrunArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", 0);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_name",  0,            "search by exp_name", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-inst",  0,            "search for camera", NULL); 
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-telescope",  0,            "search for telescope", NULL);
+    psMetadataAddTime(newrunArgs, PS_LIST_TAIL, "-dateobs_begin", 0,               "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(newrunArgs, PS_LIST_TAIL, "-dateobs_end", 0,            "search for exposures by time (<)", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_tag",  0,            "search by exp_tag", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_type",  0,            "search by exp_type", "object");
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-filelevel",  0,            "search by filelevel", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-reduction",  0,            "search by reduction class", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-filter",  0,            "search for filter", NULL); 
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-airmass_max",  0,            "define max airmass", NAN); 
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-ra_min",  0,            "define min", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-ra_max",  0,            "define max", NAN); 
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-decl_min",  0,            "define min", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-decl_max",  0,            "define max", NAN); 
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-exp_time_min",  0,            "define min", NAN);
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-exp_time_max",  0,            "define max", NAN); 
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,            "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,            "define min fraction of saturated pixels", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_min",  0,            "define max", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_max",  0,            "define max", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-alt_min",  0,            "define min", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-alt_max",  0,            "define max", NAN); 
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-az_min",  0,            "define min", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-az_max",  0,            "define max", NAN);
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,               "define min ccd tempature", NAN);
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(newrunArgs, PS_LIST_TAIL, "-posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-object",  0,            "search by exposure object", NULL);
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF32(newrunArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
 
-    psMetadataAddBool(newrunArgs, PS_LIST_TAIL, "-pretend",  0,
-            "print the exposures that would be included in the detrend run and exit", false);
-    psMetadataAddBool(newrunArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_workdir",  0,            "define workdir", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_label",  0,            "define label", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_reduction",  0,            "define reduction class", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_expgroup",  0,            "define exposure group", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_dvodb",  0,            "define DVO db", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_filter",  0,            "define filter", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_tess_id",  0,            "define tessalation", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_end_stage",  0,            "define processing end stage", NULL);
+    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-set_region",  0,            "define region", NULL);
+
+    psMetadataAddBool(newrunArgs, PS_LIST_TAIL, "-pretend",  0,            "print the exposures that would be included in the detrend run and exit", false);
+    psMetadataAddBool(newrunArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -addexp
     psMetadata *addexpArgs = psMetadataAlloc();
-    psMetadataAddStr(addexpArgs, PS_LIST_TAIL, "-corr_id", 0,
-            "define Flat Correction ID (required)", NULL);
-    psMetadataAddStr(addexpArgs, PS_LIST_TAIL, "-chip_id", 0,
-            "define Chip ID (required)", NULL);
+    psMetadataAddStr(addexpArgs, PS_LIST_TAIL, "-corr_id", 0,            "define Flat Correction ID (required)", NULL);
+    psMetadataAddStr(addexpArgs, PS_LIST_TAIL, "-chip_id", 0,            "define Chip ID (required)", NULL);
 
     // -pending
     psMetadata *pendingArgs = psMetadataAlloc();
-    psMetadataAddU64(pendingArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(pendingArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddU64(pendingArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(pendingArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -flatcorrimfile
     psMetadata *flatcorrimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(flatcorrimfileArgs, PS_LIST_TAIL, "-corr_id",  0,
-            "search by flat correction ID (required)", NULL);
-    psMetadataAddU64(flatcorrimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(flatcorrimfileArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(flatcorrimfileArgs, PS_LIST_TAIL, "-corr_id",  0,            "search by flat correction ID (required)", NULL);
+    psMetadataAddU64(flatcorrimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(flatcorrimfileArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -done
     psMetadata *doneArgs = psMetadataAlloc();
-    psMetadataAddStr(doneArgs, PS_LIST_TAIL, "-corr_id",  0,
-            "define correction id (required)", NULL);
-    psMetadataAddStr(doneArgs, PS_LIST_TAIL, "-stats",  0,
-            "define stats (required)", NULL);
+    psMetadataAddStr(doneArgs, PS_LIST_TAIL, "-corr_id",  0,            "define correction id (required)", NULL);
+    psMetadataAddStr(doneArgs, PS_LIST_TAIL, "-stats",  0,            "define stats (required)", NULL);
 
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-corr_id",  0,
-            "define correction id (required)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
-            "set state (required)", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-corr_id",  0,            "define correction id (required)", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "set state (required)", NULL);
 
     psFree(now);
@@ -190,16 +131,10 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXOPT_ADD_MODE("-newrun",  "start a new flat correction run",
-        FLATCORR_MODE_NEWRUN,       newrunArgs);
-    PXOPT_ADD_MODE("-addexp",  "add an exp to a flat correction run",
-        FLATCORR_MODE_ADDEXP,       addexpArgs);
-    PXOPT_ADD_MODE("-pending", "show flat correction runs needing to be processed",
-        FLATCORR_MODE_PENDING,      pendingArgs);
-    PXOPT_ADD_MODE("-flatcorrimfile", "list all the imfiles in a flat correction run",
-        FLATCORR_MODE_FLATCORRIMFILE, flatcorrimfileArgs);
-    PXOPT_ADD_MODE("-done",  "change a flat calibration run's state",
-        FLATCORR_MODE_DONE,         doneArgs);
-    PXOPT_ADD_MODE("-updaterun",  "change a flat calibration run's state",
-        FLATCORR_MODE_UPDATERUN,   updaterunArgs);
+    PXOPT_ADD_MODE("-newrun",  "start a new flat correction run",        FLATCORR_MODE_NEWRUN,       newrunArgs);
+    PXOPT_ADD_MODE("-addexp",  "add an exp to a flat correction run",        FLATCORR_MODE_ADDEXP,       addexpArgs);
+    PXOPT_ADD_MODE("-pending", "show flat correction runs needing to be processed",        FLATCORR_MODE_PENDING,      pendingArgs);
+    PXOPT_ADD_MODE("-flatcorrimfile", "list all the imfiles in a flat correction run",        FLATCORR_MODE_FLATCORRIMFILE, flatcorrimfileArgs);
+    PXOPT_ADD_MODE("-done",  "change a flat calibration run's state",        FLATCORR_MODE_DONE,         doneArgs);
+    PXOPT_ADD_MODE("-updaterun",  "change a flat calibration run's state",        FLATCORR_MODE_UPDATERUN,   updaterunArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
@@ -213,38 +148,4 @@
     psFree(argSets);
     psFree(modes);
-
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-{   
-    psString str = NULL;
-    bool status = false;
-    if ((str = psMetadataLookupStr(&status, config->args, "-corr_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "corr_id", 0, "==", (psS64)atoll(str))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item corr_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-} 
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
 
     // define Database handle, if used
Index: trunk/ippTools/src/guidetool.c
===================================================================
--- trunk/ippTools/src/guidetool.c	(revision 18531)
+++ trunk/ippTools/src/guidetool.c	(revision 18561)
@@ -61,15 +61,26 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-exp_id",        "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-inst",          "camera", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", 	  "telescope", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_type",  	  "exp_type", "==");
+    PXOPT_COPY_S32(config->args, where, "-imfiles",   	  "imfiles", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter",    	  "filter", "==");
+    PXOPT_COPY_STR(config->args, where, "-recip",         "recipe", "==");
+    PXOPT_COPY_S32(config->args, where, "-guide_version", "guide_version", "==");
+    if (!psListLength(where->list)) {
+	psFree (where);
+	where = NULL;
+    }
+
     // return all guidePendingExp rows unless there CLI search options
-    psArray *guidePendingExp = guidePendingExpSelectRowObjects(
-        config->dbh,
-        config->where ? config->where : NULL,
-        0
-    );
+    psArray *guidePendingExp = guidePendingExpSelectRowObjects(config->dbh, where, 0);
+    psFree (where);
+
     if (!guidePendingExp) {
         psError(PS_ERR_UNKNOWN, false, "no guidePendingExp found");
         return false;
     }
-
     psMetadata *output = psMetadataAlloc();
 
@@ -94,11 +105,20 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
     
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-exp_id",        "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-inst",          "camera", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", 	  "telescope", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_type",  	  "exp_type", "==");
+    PXOPT_COPY_S32(config->args, where, "-imfiles",   	  "imfiles", "==");
+    PXOPT_COPY_STR(config->args, where, "-filter",    	  "filter", "==");
+    if (!psListLength(where->list)) {
+	psFree (where);
+	where = NULL;
+    }
+
     // return all rawScienceExp rows unless there CLI search options
-    psArray *rawScienceExps = rawScienceExpSelectRowObjects(
-        config->dbh,
-        config->where ? config->where : NULL,
-        0
-    );
-
+    psArray *rawScienceExps = rawScienceExpSelectRowObjects(config->dbh, where, 0);
+    psFree (where);
+    
     if (!rawScienceExps) {
         psError(PS_ERR_UNKNOWN, false, "no rawScienceExp rows found");
Index: trunk/ippTools/src/guidetoolConfig.c
===================================================================
--- trunk/ippTools/src/guidetoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/guidetoolConfig.c	(revision 18561)
@@ -52,40 +52,24 @@
     // -pending search
     psMetadata *pendingArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_id",  0,
-        "define exposure ID", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-inst",  0,
-        "define camera of interest", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-telescope",  0,
-        "define telescope of interest", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_type",  0,
-        "define exposure type", NULL);
-    psMetadataAddS32(pendingArgs, PS_LIST_TAIL, "-imfiles",  0,
-        "define number of imfiles", 0);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-filter",  0,
-        "define filter of interest", NULL);
-    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-recipe",  0,
-        "define recipe of interest", NULL);
-    psMetadataAddS32(pendingArgs, PS_LIST_TAIL, "-guide_version",  0,
-        "define guide_version of interest", 0);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_id",  0,        "define exposure ID", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-inst",  0,        "define camera of interest", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-telescope",  0,        "define telescope of interest", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-exp_type",  0,        "define exposure type", NULL);
+    psMetadataAddS32(pendingArgs, PS_LIST_TAIL, "-imfiles",  0,        "define number of imfiles", 0);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-filter",  0,        "define filter of interest", NULL);
+    psMetadataAddStr(pendingArgs, PS_LIST_TAIL, "-recipe",  0,        "define recipe of interest", NULL);
+    psMetadataAddS32(pendingArgs, PS_LIST_TAIL, "-guide_version",  0,        "define guide_version of interest", 0);
 
     // -define inputs
     psMetadata *defineArgs = psMetadataAlloc();
-    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-exp_id",  0,
-        "define class", NULL);
-    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-inst",  0,
-        "define camera of interest", NULL);
-    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-telescope",  0,
-        "define camera of interest", NULL);
-    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-exp_type",  0,
-        "define class", NULL);
-    psMetadataAddS32(defineArgs, PS_LIST_TAIL, "-imfiles",  0,
-        "define number of imfiles", 0);
-    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-filter",  0,
-        "define filter of interest", NULL);
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-exp_id",  0,        "define class", NULL);
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-inst",  0,        "define camera of interest", NULL);
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-telescope",  0,        "define camera of interest", NULL);
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-exp_type",  0,        "define class", NULL);
+    psMetadataAddS32(defineArgs, PS_LIST_TAIL, "-imfiles",  0,        "define number of imfiles", 0);
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-filter",  0,        "define filter of interest", NULL);
     // these two are inputs NOT search parameters
-    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-recipe",  0,
-        "define recipe of interest", NULL);
-    psMetadataAddS32(defineArgs, PS_LIST_TAIL, "-guide_version",  0,
-        "define guide_version of interest", 0);
+    psMetadataAddStr(defineArgs, PS_LIST_TAIL, "-recipe",  0,        "define recipe of interest", NULL);
+    psMetadataAddS32(defineArgs, PS_LIST_TAIL, "-guide_version",  0,        "define guide_version of interest", 0);
 
     // find which mode we're running under
@@ -146,53 +130,4 @@
     psFree(defineArgs);
 
-    // setup search criterion
-#define addWhereStr(name) \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            exit(EXIT_FAILURE); \
-        } \
-    }
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-{
-    psString str = NULL;
-    int n = 0;
-    bool status = false;
-
-    addWhereStr(exp_id);
-    // convert '-inst' to 'camera'
-    if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-            exit(EXIT_FAILURE);
-        }
-    }
-    addWhereStr(telescope);
-    addWhereStr(exp_type);
-    if ((n = psMetadataLookupS32(&status, config->args, "-imfiles"))) {
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "imfiles", 0, "==", n)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
-            exit(EXIT_FAILURE);
-        }
-    }
-    addWhereStr(filter);
-    addWhereStr(stats);
-    addWhereStr(recipe);
-    if ((n = psMetadataLookupS32(&status, config->args, "-guide_version"))) {
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "guide_version", 0, "==", n)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item guide_version");
-            exit(EXIT_FAILURE);
-        }
-    }
-}
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
Index: trunk/ippTools/src/magictool.c
===================================================================
--- trunk/ippTools/src/magictool.c	(revision 18531)
+++ trunk/ippTools/src/magictool.c	(revision 18561)
@@ -104,20 +104,266 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+
     // create warped skycells temp table
-{
-    char *query =
-        "CREATE TEMPORARY TABLE warpComplete\n"
-        " (warp_id BIGINT, skycell_id VARCHAR(64), tess_id VARCHAR(64),\n"
-        " PRIMARY KEY(warp_id, skycell_id, tess_id)) ENGINE=MEMORY\n";
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-}
+    {
+	psString query = pxDataGet("magictool_create_tmp_warpcomplete.sql");
+	if (!query) {
+	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	    return false;
+	}
+
+	if (!p_psDBRunQuery(config->dbh, query)) {
+	    psError(PS_ERR_UNKNOWN, false, "database error");
+	    return false;
+	}
+    }
 
     // find warped skycells
-{
-    psString query = pxDataGet("magictool_find_complete_warpruns.sql");
+    {
+	psString query = pxDataGet("magictool_find_complete_warpruns.sql");
+	if (!query) {
+	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	    return false;
+	}
+
+	if (!p_psDBRunQuery(config->dbh, query)) {
+	    psError(PS_ERR_UNKNOWN, false, "database error");
+	    psFree(query);
+	    return false;
+	}
+	psFree(query);
+    }
+
+    // find the diff_id's of the warped skycells
+    {
+	psString query = pxDataGet("magictool_find_complete_diffed_exposures.sql");
+	if (!query) {
+	    psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+	    return false;
+	}
+
+	if (!p_psDBRunQuery(config->dbh, query)) {
+	    psError(PS_ERR_UNKNOWN, false, "database error");
+	    psFree(query);
+	    return false;
+	}
+	psFree(query);
+    }
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        psErrorCode err = psErrorCodeLast();
+        switch (err) {
+	  case PS_ERR_DB_CLIENT:
+	    psError(PXTOOLS_ERR_SYS, false, "database error");
+	  case PS_ERR_DB_SERVER:
+	    psError(PXTOOLS_ERR_PROG, false, "database error");
+	  default:
+	    psError(PXTOOLS_ERR_PROG, false, "unknown error");
+        }
+
+        return false;
+    }
+    if (!psArrayLength(output)) {
+        psTrace("magictool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        return true;
+    }
+
+    // pre-allocate enough hash buckets for 1 unique warp_id per row
+    psHash *groups = psHashAlloc(psArrayLength(output));
+    // iterate over result set, and group by warp_id
+    for (long i = 0; i < psArrayLength(output); i++) {
+        // lookup the key we're grouping by
+        bool status = false;
+        psS64 warp_id = psMetadataLookupS64(&status, output->data[i], "warp_id");
+        if (!status) {
+            psAbort("failed to lookup value for warp_id");
+        }
+
+        psString key = psDBIntToString(warp_id);
+        // look to see if there is a bin for this key
+        psArray *groupBin = psHashLookup(groups, key);
+        if (!groupBin) {
+            // if not, create one
+            groupBin = psArrayAlloc(0);
+            psHashAdd(groups, key, groupBin);
+        }
+        psFree(key);
+
+        // add this row to the bin
+        psArrayAdd(groupBin, 0, output->data[i]);
+        psFree(groupBin);
+    }
+    psFree(output);
+
+    // create a magic run
+    psArray *grouped =  psHashToArray(groups);
+    psFree(groups);
+
+    // iterate over array of grouped warp_ids
+    for (long i = 0; i < psArrayLength(grouped); i++) {
+        psArray *group = grouped->data[i];
+
+        // create a new magicRun for this group
+        magicRunRow *run = magicRunRowAlloc(
+	    0,				// ID
+	    "reg",			// state
+	    workdir,			// workdir
+	    "dirty",			// workdir_state
+	    label,			// label
+	    dvodb,			// dvodb
+	    registered,			// registered
+	    0				// fault
+	    );
+        if (!run) {
+            psAbort("failed to alloc magicRun object");
+        }
+        if (!magicRunInsertObject(config->dbh, run)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(run);
+            psFree(grouped);
+            return false;
+        }
+
+        // get the assigned warp_id
+        psS64 magic_id = psDBLastInsertID(config->dbh);
+
+        // insert all rows in this bin into the new magicRun
+        for (long j = 0; j < psArrayLength(group); j++) {
+            psMetadata *row = group->data[j];
+
+            bool status = false;
+            psS64 diff_id = psMetadataLookupS64(&status, row, "diff_id");
+            if (!status) {
+                psAbort("failed to lookup value for diff_id");
+            }
+            psString node = psMetadataLookupStr(&status, row, "skycell_id");
+            if (!status) {
+                psAbort("failed to lookup value for diff_id");
+            }
+
+            if (!magicInputSkyfileInsert(config->dbh,
+					 magic_id,
+					 diff_id,
+					 node)) {
+                psError(PS_ERR_UNKNOWN, false, "database error");
+                psFree(grouped);
+                return false;
+            }
+        }
+
+        // set magicRun.state to 'run'
+        return setmagicRunState(config, magic_id, "run");
+    }
+    psFree(grouped);
+
+    return true;
+}
+
+static psS64 definerunMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
+
+    // optional
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    magicRunRow *run = magicRunRowAlloc(
+            0,          // ID
+            "reg",      // state
+            workdir,
+            "dirty",    // workdir_state
+            label,
+            dvodb,
+            registered,
+            0
+    );
+
+    if (!run) {
+        psError(PS_ERR_UNKNOWN, false, "failed to alloc magicRun object");
+        return false;
+    }
+    if (!magicRunInsertObject(config->dbh, run)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(run);
+        return false;
+    }
+
+    // get the assigned warp_id
+    psS64 magic_id = psDBLastInsertID(config->dbh);
+    run->magic_id = magic_id;
+
+    if (!magicRunPrintObject(stdout, run, !simple)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print object");
+            psFree(run);
+            return false;
+    }
+
+    psFree(run);
+
+    return magic_id;
+}
+
+
+static bool updaterunMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
+
+    if (state) {
+        // set detRun.state to state
+        return setmagicRunState(config, (psS64)atoll(magic_id), state);
+    }
+
+    return true;
+}
+
+
+static bool addinputskyfileMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
+    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
+    PXOPT_LOOKUP_STR(node, config->args, "-node", true, false);
+
+    magicInputSkyfileInsert(
+            config->dbh,
+            (psS64)atoll(magic_id),
+            (psS64)atoll(diff_id),
+            node
+    );
+
+    return true;
+}
+
+
+static bool inputskyfileMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-magic_id", "magic_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-diff_id", "diff_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-node", "node", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    // find all rawImfiles matching the default query
+    psString query = pxDataGet("magictool_inputskyfile.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
@@ -125,4 +371,18 @@
     }
 
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "magicInputSkyfile");
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(where);
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, " %s", limitString);
+        psFree(limitString);
+    }
+
     if (!p_psDBRunQuery(config->dbh, query)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -131,21 +391,5 @@
     }
     psFree(query);
-}
-
-    // find the diff_id's of the warped skycells
-{
-    psString query = pxDataGet("magictool_find_complete_diffed_exposures.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-}
+
     psArray *output = p_psDBFetchResult(config->dbh);
     if (!output) {
@@ -168,193 +412,30 @@
     }
 
-    // pre-allocate enough hash buckets for 1 unique warp_id per row
-    psHash *groups = psHashAlloc(psArrayLength(output));
-    // iterate over result set, and group by warp_id
-    for (long i = 0; i < psArrayLength(output); i++) {
-        // lookup the key we're grouping by
-        bool status = false;
-        psS64 warp_id = psMetadataLookupS64(&status, output->data[i], "warp_id");
-        if (!status) {
-            psAbort("failed to lookup value for warp_id");
-        }
-
-        psString key = psDBIntToString(warp_id);
-        // look to see if there is a bin for this key
-        psArray *groupBin = psHashLookup(groups, key);
-        if (!groupBin) {
-            // if not, create one
-            groupBin = psArrayAlloc(0);
-            psHashAdd(groups, key, groupBin);
-        }
-        psFree(key);
-
-        // add this row to the bin
-        psArrayAdd(groupBin, 0, output->data[i]);
-        psFree(groupBin);
-    }
+    if (psArrayLength(output)) {
+        // negative simple so the default is true
+        if (!ippdbPrintMetadatas(stdout, output, "magicInputSkyfile", !simple)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print array");
+            psFree(output);
+            return false;
+        }
+    }
+
     psFree(output);
 
-    // create a magic run
-    psArray *grouped =  psHashToArray(groups);
-    psFree(groups);
-
-    // iterate over array of grouped warp_ids
-    for (long i = 0; i < psArrayLength(grouped); i++) {
-        psArray *group = grouped->data[i];
-
-        // create a new magicRun for this group
-        // XXX This need to have options passed through to it
-
-        magicRunRow *run = magicRunRowAlloc(
-                0,          // ID
-                "reg",      // state
-                NULL,       // workdir
-                "dirty",    // workdir_state
-                NULL,       // label
-                NULL,       // dvodb
-                NULL,       // registered
-                0           // fault
-        );
-        if (!run) {
-            psAbort("failed to alloc magicRun object");
-        }
-        if (!magicRunInsertObject(config->dbh, run)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(run);
-            psFree(grouped);
-            return false;
-        }
-
-        // get the assigned warp_id
-        psS64 magic_id = psDBLastInsertID(config->dbh);
-
-        // insert all rows in this bin into the new magicRun
-        for (long j = 0; j < psArrayLength(group); j++) {
-            psMetadata *row = group->data[j];
-
-            bool status = false;
-            psS64 diff_id = psMetadataLookupS64(&status, row, "diff_id");
-            if (!status) {
-                psAbort("failed to lookup value for diff_id");
-            }
-            psString node = psMetadataLookupStr(&status, row, "skycell_id");
-            if (!status) {
-                psAbort("failed to lookup value for diff_id");
-            }
-
-            if (!magicInputSkyfileInsert(config->dbh,
-                magic_id,
-                diff_id,
-                node)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-                psFree(grouped);
-                return false;
-            }
-        }
-
-        // set magicRun.state to 'run'
-        return setmagicRunState(config, magic_id, "run");
-    }
-    psFree(grouped);
-
-    return true;
-}
-
-static psS64 definerunMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
-
-    // optional
-    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
-    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
-
-    magicRunRow *run = magicRunRowAlloc(
-            0,          // ID
-            "reg",      // state
-            workdir,
-            "dirty",    // workdir_state
-            label,
-            dvodb,
-            registered,
-            0
-    );
-
-    if (!run) {
-        psError(PS_ERR_UNKNOWN, false, "failed to alloc magicRun object");
-        return false;
-    }
-    if (!magicRunInsertObject(config->dbh, run)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(run);
-        return false;
-    }
-
-    // get the assigned warp_id
-    psS64 magic_id = psDBLastInsertID(config->dbh);
-    run->magic_id = magic_id;
-
-    if (!magicRunPrintObject(stdout, run, !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print object");
-            psFree(run);
-            return false;
-    }
-
-    psFree(run);
-
-    return magic_id;
-}
-
-
-static bool updaterunMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
-    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
-
-    if (state) {
-        // set detRun.state to state
-        return setmagicRunState(config, (psS64)atoll(magic_id), state);
-    }
-
-    return true;
-}
-
-
-static bool addinputskyfileMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
-    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
-    PXOPT_LOOKUP_STR(node, config->args, "-node", true, false);
-
-    magicInputSkyfileInsert(
-            config->dbh,
-            (psS64)atoll(magic_id),
-            (psS64)atoll(diff_id),
-            node
-    );
-
-    return true;
-}
-
-
-static bool inputskyfileMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
+    return true;
+}
+
+static bool totreeMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-magic_id", "magicRun.magic_id", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    // find all rawImfiles matching the default query
-    psString query = pxDataGet("magictool_inputskyfile.sql");
+    // look for "inputs" that need to processed
+    psString query = pxDataGet("magictool_totree.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
@@ -362,9 +443,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "magicInputSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -404,5 +486,5 @@
     if (psArrayLength(output)) {
         // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "magicInputSkyfile", !simple)) {
+        if (!ippdbPrintMetadatas(stdout, output, "totree", !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(output);
@@ -416,18 +498,43 @@
 }
 
-
-static bool totreeMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
+static bool inputtreeMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
+    PXOPT_LOOKUP_STR(dep_file, config->args, "-dep_file", true, false);
+
+    if (!parseAndInsertNodeDeps(config, (psS64)atoll(magic_id), dep_file)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to parse file");
+        return false;
+    }
+
+    return true;
+}
+
+static bool inputsMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-magic_id", "magic_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-node", "node", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    // look for "inputs" that need to processed
-    psString query = pxDataGet("magictool_totree.sql");
+    psString query = pxDataGet("magictool_inputs.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
         return false;
     }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -467,5 +574,5 @@
     if (psArrayLength(output)) {
         // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "totree", !simple)) {
+        if (!ippdbPrintMetadatas(stdout, output, "magicNode", !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(output);
@@ -478,22 +585,4 @@
     return true;
 }
-
-
-static bool inputtreeMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
-    PXOPT_LOOKUP_STR(dep_file, config->args, "-dep_file", true, false);
-
-    if (!parseAndInsertNodeDeps(config, (psS64)atoll(magic_id), dep_file)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to parse file");
-        return false;
-    }
-
-    return true;
-}
-
 
 bool findBaseNodes(void *arg, pxNode *node)
@@ -573,5 +662,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", false, false);
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-magic_id", "magic_id", "==");
+
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
@@ -583,12 +674,11 @@
     }
 
-    if (magic_id) {
-        psMetadata *where = psMetadataAlloc();
-        psMetadataAddS64(where, PS_LIST_TAIL, "magic_id", 0, "==", (psS64)atoll(magic_id));
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psFree(where);
+    psString whereClause = NULL;
+    if (psListLength(where->list)) {
+        whereClause = psDBGenerateWhereSQL(where, NULL);
         psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
+	psFree(whereClause);
+    }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -615,6 +705,6 @@
     if (!psArrayLength(output)) {
         psTrace("magictool", PS_LOG_INFO, "no rows found");
-//        psFree(output);
-//        return true;
+	// psFree(output);
+        // return true;
     }
 
@@ -626,12 +716,6 @@
     }
 
-
-    if (magic_id) {
-        psMetadata *where = psMetadataAlloc();
-        psMetadataAddS64(where, PS_LIST_TAIL, "magic_id", 0, "==", (psS64)atoll(magic_id));
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psFree(where);
+    if (whereClause) {
         psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
     }
 
@@ -686,5 +770,5 @@
     pxNode *root = psHashLookup(forest, "root");
     psFree(forest);
-//    pxTreePrint(stdout, root);
+    // pxTreePrint(stdout, root);
 
     // crawl through the tree and looking for nodes with children that are all
@@ -703,4 +787,5 @@
 
     psFree(output);
+    psFree(whereClause);
 
     return true;
@@ -735,5 +820,5 @@
 }
 
-static bool inputsMode(pxConfig *config)
+static bool tomaskMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -742,14 +827,9 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    psString query = pxDataGet("magictool_inputs.sql");
+    // look for "inputs" that need to processed
+    psString query = pxDataGet("magictool_tomask.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
         return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
     }
 
@@ -790,5 +870,5 @@
     if (psArrayLength(output)) {
         // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "magicNode", !simple)) {
+        if (!ippdbPrintMetadatas(stdout, output, "toprocess", !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(output);
@@ -803,17 +883,81 @@
 
 
-static bool tomaskMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
+static bool addmaskMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
+
+    // optional
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
+    PXOPT_LOOKUP_S32(streaks, config->args, "-streaks", false, false);
+
+    // default values
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    if (!psDBTransaction(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    if (!magicMaskInsert(config->dbh,
+                         (psS64)atoll(magic_id),
+                         uri,
+                         streaks,
+                         code
+        )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    // Set the magicRun state
+    psString query = pxDataGet("magictool_addmask.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    // manually add constraint
+    psStringAppend(&query, " AND magic_id = %s", magic_id);
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    if (!psDBCommit(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
+}
+
+
+static bool maskMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-magic_id", "magicRun.magic_id", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
-    // look for "inputs" that need to processed
-    psString query = pxDataGet("magictool_tomask.sql");
+    psString query = pxDataGet("magictool_mask.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
         return false;
     }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -853,129 +997,4 @@
     if (psArrayLength(output)) {
         // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "toprocess", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool addmaskMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
-
-    // optional
-    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
-    PXOPT_LOOKUP_S32(streaks, config->args, "-streaks", false, false);
-
-    // default values
-    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
-
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    if (!magicMaskInsert(config->dbh,
-                         (psS64)atoll(magic_id),
-                         uri,
-                         streaks,
-                         code
-        )) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    // Set the magicRun state
-    psString query = pxDataGet("magictool_addmask.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    // Add "magic_id = value"
-    psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
-    psStringAppend(&query, " AND %s", whereClause);
-    psFree(whereClause);
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-
-static bool maskMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-
-    psString query = pxDataGet("magictool_mask.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, NULL);
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    // treat limit == 0 as "no limit"
-    if (limit) {
-        psString limitString = psDBGenerateLimitSQL(limit);
-        psStringAppend(&query, " %s", limitString);
-        psFree(limitString);
-    }
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-    psFree(query);
-
-    psArray *output = p_psDBFetchResult(config->dbh);
-    if (!output) {
-        psErrorCode err = psErrorCodeLast();
-        switch (err) {
-            case PS_ERR_DB_CLIENT:
-                psError(PXTOOLS_ERR_SYS, false, "database error");
-            case PS_ERR_DB_SERVER:
-                psError(PXTOOLS_ERR_PROG, false, "database error");
-            default:
-                psError(PXTOOLS_ERR_PROG, false, "unknown error");
-        }
-
-        return false;
-    }
-    if (!psArrayLength(output)) {
-        psTrace("magictool", PS_LOG_INFO, "no rows found");
-        psFree(output);
-        return true;
-    }
-
-    if (psArrayLength(output)) {
-        // negative simple so the default is true
         if (!ippdbPrintMetadatas(stdout, output, "magicNode", !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
Index: trunk/ippTools/src/magictoolConfig.c
===================================================================
--- trunk/ippTools/src/magictoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/magictoolConfig.c	(revision 18561)
@@ -49,52 +49,35 @@
     // -definebyquery
     psMetadata *queueArgs = psMetadataAlloc();
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-workdir",     0, "define workdir (required)", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-label",       0, "define label", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-dvodb",       0, "define dvodb", NULL);
+    psMetadataAddTime(queueArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
 
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", 0,
-            "define label", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-dvodb", 0,
-            "define dvodb", NULL);
-    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", 0,            "define label", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-dvodb", 0,            "define dvodb", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "define warptool ID (required)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
-            "set state (required)", NULL);
-#if 0
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-#endif
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-magic_id", 0,            "define warptool ID (required)", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "set state (required)", NULL);
 
     // -addinputskyfile
     psMetadata *addinputskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "define magictool ID (required)", NULL);
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "define difftool ID (required)", NULL);
-    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-node",  0,
-            "define symbolic node name (required)", NULL);
+    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-magic_id", 0,            "define magictool ID (required)", NULL);
+    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "define difftool ID (required)", NULL);
+    psMetadataAddStr(addinputskyfileArgs, PS_LIST_TAIL, "-node",  0,            "define symbolic node name (required)", NULL);
 
     // -inputskyfile
     psMetadata *inputskyfileArgs = psMetadataAlloc();
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "search by magictool ID", NULL);
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,
-            "search by difftool ID", NULL);
-    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-node",  0,
-            "search by symbolic node name", NULL);
-    psMetadataAddU64(inputskyfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-magic_id", 0,            "search by magictool ID", NULL);
+    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-diff_id", 0,            "search by difftool ID", NULL);
+    psMetadataAddStr(inputskyfileArgs, PS_LIST_TAIL, "-node",  0,            "search by symbolic node name", NULL);
+    psMetadataAddU64(inputskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -totree
@@ -106,54 +89,53 @@
     // -inputtree
     psMetadata *inputtreeArgs = psMetadataAlloc();
-    psMetadataAddStr(inputtreeArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "define magictool ID (required)", NULL);
-    psMetadataAddStr(inputtreeArgs, PS_LIST_TAIL, "-dep_file", 0,
-            "order of operations dep. file (required)", NULL);
+    psMetadataAddStr(inputtreeArgs, PS_LIST_TAIL, "-magic_id", 0,            "define magictool ID (required)", NULL);
+    psMetadataAddStr(inputtreeArgs, PS_LIST_TAIL, "-dep_file", 0,            "order of operations dep. file (required)", NULL);
     psMetadataAddS16(inputtreeArgs, PS_LIST_TAIL, "-code",  0, "set fault code", 0);
 
     // -inputs
     psMetadata *inputsArgs = psMetadataAlloc();
-    psMetadataAddStr(inputsArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "search by magictool ID", NULL);
-    psMetadataAddStr(inputsArgs, PS_LIST_TAIL, "-node",  0,
-            "search by symbolic node name", NULL);
-    psMetadataAddU64(inputsArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(inputsArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(inputsArgs, PS_LIST_TAIL, "-magic_id", 0,            "search by magictool ID", NULL);
+    psMetadataAddStr(inputsArgs, PS_LIST_TAIL, "-node",  0,            "search by symbolic node name", NULL);
+    psMetadataAddU64(inputsArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(inputsArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -tooprocess
     psMetadata *toprocessArgs = psMetadataAlloc();
-    psMetadataAddStr(toprocessArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "search by magic ID", NULL);
-    psMetadataAddU64(toprocessArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(toprocessArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(toprocessArgs, PS_LIST_TAIL, "-magic_id", 0,            "search by magic ID", NULL);
+    psMetadataAddU64(toprocessArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(toprocessArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addresult
     psMetadata *addresultArgs = psMetadataAlloc();
-    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "define magictool ID (required)", NULL);
-    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-node",  0,
-            "define symbolic node name (required)", NULL);
-    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-uri",  0,
-            "define URI", NULL);
+    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-magic_id", 0,            "define magictool ID (required)", NULL);
+    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-node",  0,            "define symbolic node name (required)", NULL);
+    psMetadataAddStr(addresultArgs, PS_LIST_TAIL, "-uri",  0,            "define URI (required)", NULL);
     psMetadataAddS16(addresultArgs, PS_LIST_TAIL, "-code",  0, "set fault code", 0);
 
     // -tomask
     psMetadata *tomaskArgs = psMetadataAlloc();
-    psMetadataAddU64(tomaskArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tomaskArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddU64(tomaskArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tomaskArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addmask
     psMetadata *addmaskArgs = psMetadataAlloc();
-    psMetadataAddStr(addmaskArgs, PS_LIST_TAIL, "-magic_id", 0,
-            "define magictool ID (required)", NULL);
+    psMetadataAddStr(addmaskArgs, PS_LIST_TAIL, "-magic_id", 0,          "define magictool ID (required)", NULL);
     psMetadataAddStr(addmaskArgs, PS_LIST_TAIL, "-uri",  0, "define URI", NULL);
     psMetadataAddS32(addmaskArgs, PS_LIST_TAIL, "-streaks",  0, "define number of streaks", 0);
     psMetadataAddS16(addmaskArgs, PS_LIST_TAIL, "-code",  0, "set fault code", 0);
+
+# if (0)
+    // -toskyfilemask
+    psMetadata *toskyfilemaskArgs = psMetadataAlloc();
+    psMetadataAddStr(toskyfilemaskArgs, PS_LIST_TAIL, "-magic_id", 0,            "search by magic ID", NULL);
+    psMetadataAddU64(toskyfilemaskArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(toskyfilemaskArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+
+    // -addskyfilemask
+    psMetadata *addskyfilemaskArgs = psMetadataAlloc();
+    psMetadataAddStr(addskyfilemaskArgs, PS_LIST_TAIL, "-magic_id", 0,            "define magictool ID (required)", NULL);
+    psMetadataAddStr(addskyfilemaskArgs, PS_LIST_TAIL, "-diff_id",  0,            "define difftool ID (required)", NULL);
+    psMetadataAddStr(addskyfilemaskArgs, PS_LIST_TAIL, "-uri",  0,            "define URI (required)", NULL);
+# endif
 
     // -mask
@@ -193,69 +175,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereS32(name) \
-{ \
-    psS32 s32 = 0; \
-    bool status = false; \
-    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-{
-    psString str = NULL;
-    bool status = false;
-    if ((str = psMetadataLookupStr(&status, config->args, "-magic_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "magic_id", 0, "==", (psS64)atoll(str))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item magic_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-    addWhereStr(skycell_id);
-    addWhereStr(tess_id);
-    addWhereStr(exp_id);
-    addWhereStr(node);
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
Index: trunk/ippTools/src/pstamptool.c
===================================================================
--- trunk/ippTools/src/pstamptool.c	(revision 18531)
+++ trunk/ippTools/src/pstamptool.c	(revision 18561)
@@ -102,29 +102,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-    psString outProduct = psMetadataLookupStr(&status, config->args, "-out_product");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to looku value for -out_product");
-        return false;
-    }
-    if (!outProduct) {
-        psError(PS_ERR_UNKNOWN, true, "-out_product is required");
-        return false;
-    }
-
-    psString lastFileset = psMetadataLookupStr(&status, config->args, "-last_fileset");
-    psString state = psMetadataLookupStr(&status, config->args, "-state");
-    if (!state) {
-        state = "enabled";
-    }
+    PXOPT_LOOKUP_STR(uri,         config->args, "-uri",           true, false);
+    PXOPT_LOOKUP_STR(outProduct,  config->args, "-out_product",   true, false);
+    PXOPT_LOOKUP_STR(lastFileset, config->args, "-last_fileset", false, false);
+    PXOPT_LOOKUP_STR(state,       config->args, "-state",         false, false);
 
     if (!pstampDataStoreInsert(config->dbh,
@@ -144,18 +123,24 @@
 static bool datastoreMode(pxConfig *config)
 {
-    bool status = false;
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString ds_id = psMetadataLookupStr(&status, config->args, "-ds_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ds_id");
-        return false;
-    }
-
-    psString query = NULL;
-    psStringAppend(&query, "SELECT * FROM pstampDataStore");
-    if (ds_id) {
-        psStringAppend(&query, " WHERE ds_id = '%s'", ds_id);
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-ds_id", "ds_id", "==");
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = pxDataGet("pstamptool_datastore.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereSQL(where, NULL);
+        psStringAppend(&query, " %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(where);
+
     if (!p_psDBRunQuery(config->dbh, query)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -172,14 +157,4 @@
         psFree(output);
         return true;
-    }
-
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            return false;
-        }
     }
 
@@ -197,27 +172,9 @@
 static bool moddatastoreMode(pxConfig *config)
 {
-    bool    status;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString ds_id = psMetadataLookupStr(&status, config->args, "-ds_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ds_id");
-        return false;
-    }
-    if (!ds_id) {
-        psError(PS_ERR_UNKNOWN, true, "-ds_id is required");
-        return false;
-    }
-    psString lastFileset = psMetadataLookupStr(&status, config->args, "-last_fileset");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -last_fileset");
-        return false;
-    }
-    psString state = psMetadataLookupStr(&status, config->args, "-state");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -state");
-        return false;
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_STR(ds_id,       config->args, "-ds_id",         true, false);
+    PXOPT_LOOKUP_STR(lastFileset, config->args, "-last_fileset",  false, false);
+    PXOPT_LOOKUP_STR(state,       config->args, "-state",         false, false);
 
     if (!state && !lastFileset) {
@@ -226,9 +183,7 @@
     }
 
-    char *query = NULL;
+    char *query = psStringCopy ("UPDATE pstampDataStore SET");
     bool needComma = false;
     
-    psStringAppend(&query, "UPDATE pstampDataStore SET");
-
     if (lastFileset) {
         psStringAppend(&query, " lastFileset = '%s'", lastFileset);
@@ -237,6 +192,5 @@
 
     if (state) {
-        psStringAppend(&query, "%s state = '%s'", needComma ? "," : " ",
-            state);
+        psStringAppend(&query, "%s state = '%s'", needComma ? "," : " ", state);
         needComma = true; // be ready in case we add another field
     }
@@ -262,27 +216,9 @@
 static bool addReqMode(pxConfig *config)
 {
-    bool    status;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-
-    // Data Store ID is optional
-    psString ds_id = psMetadataLookupStr(&status, config->args, "-ds_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ds_id");
-        return false;
-    }
-    if (!ds_id) {
-        ds_id = "0";
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_STR(uri,         config->args, "-uri",           true, false);
+    // PXOPT_LOOKUP_STR(outFileset,  config->args, "-out_fileset",   true, false);
+    PXOPT_LOOKUP_STR(ds_id,       config->args, "-ds_id",         false, false);
 
     char *query ="INSERT INTO pstampRequest"
@@ -313,23 +249,22 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    psString query = psStringCopy(
-            "SELECT"
-            " *"
-            " FROM pstampRequest"
-            " WHERE state = 'new'"
-        );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "pstampRequest");
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where, "-ds_id", "ds_id", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = pxDataGet("pstamptool_pendingreq.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "pstampRequest");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -358,15 +293,4 @@
     }
 
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "pstampRequest", !simple)) {
@@ -380,21 +304,19 @@
     return true;
 }
-static bool completedReqMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
+
+static bool listReqMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_STR(req_id,  config->args, "-req_id", true, false);
+    PXOPT_LOOKUP_U64(limit,   config->args, "-limit",  false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = NULL;
     psStringAppend(&query, 
-        "SELECT * FROM pstampRequest WHERE state = 'run' AND "
-            "(SELECT count(*) FROM pstampJob WHERE pstampJob.req_id = pstampRequest.req_id "
-            " AND pstampJob.state != 'stop') = 0" );
-
+		   "SELECT * FROM pstampRequest WHERE state = 'run' AND "
+		   "(SELECT count(*) FROM pstampJob WHERE pstampJob.req_id = pstampRequest.req_id "
+		   " AND pstampJob.state != 'stop') = 0" );
+    
     // treat limit == 0 as "no limit"
     if (limit) {
@@ -409,4 +331,5 @@
         return false;
     }
+    psFree(query);
 
     psArray *output = p_psDBFetchResult(config->dbh);
@@ -415,20 +338,8 @@
         return false;
     }
-
     if (!psArrayLength(output)) {
         psTrace("pstamptool", PS_LOG_INFO, "no rows found");
         psFree(output);
         return true;
-    }
-
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            psFree(output);
-            return false;
-        }
     }
 
@@ -445,30 +356,15 @@
 }
 
-static bool listReqMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    psString query = NULL;
-
-    psString req_id = psMetadataLookupStr(&status, config->args, "-req_id");
-    
-    if (req_id) {
-        psStringAppend(&query,
-                "SELECT"
-                " *"
-                " FROM pstampRequest"
-                " WHERE req_id = %s", req_id
-            );
-    } else {
-        fprintf(stderr, "req_id must be specified\n");
-        exit (1);
-    }
+static bool completedReqMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = 
+        "SELECT * FROM pstampRequest WHERE state = 'run' AND "
+            "(SELECT count(*) FROM pstampJob WHERE pstampJob.req_id = pstampRequest.req_id "
+            " AND pstampJob.state != 'stop') = 0" ;
 
     // treat limit == 0 as "no limit"
@@ -484,5 +380,4 @@
         return false;
     }
-    psFree(query);
 
     psArray *output = p_psDBFetchResult(config->dbh);
@@ -491,19 +386,9 @@
         return false;
     }
+
     if (!psArrayLength(output)) {
         psTrace("pstamptool", PS_LOG_INFO, "no rows found");
         psFree(output);
         return true;
-    }
-
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            psFree(output);
-            return false;
-        }
     }
 
@@ -522,48 +407,13 @@
 static bool processedReqMode(pxConfig *config)
 {
-    bool    status;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString req_id = psMetadataLookupStr(&status, config->args, "-req_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -req_id");
-        return false;
-    }
-    if (!req_id) {
-        psError(PS_ERR_UNKNOWN, true, "-req_id is required");
-        return false;
-    }
-    psString state = psMetadataLookupStr(&status, config->args, "-state");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -state");
-        return false;
-    }
-    psString outProduct = psMetadataLookupStr(&status, config->args, "-outProduct");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -outProduct");
-        return false;
-    }
-    psString fault = psMetadataLookupStr(&status, config->args, "-fault");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fault");
-        return false;
-    }
-
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-    psString name = psMetadataLookupStr(&status, config->args, "-name");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -name");
-        return false;
-    }
-    psString reqType = psMetadataLookupStr(&status, config->args, "-reqType");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reqType");
-        return false;
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_STR(req_id,     config->args, "-req_id",     true, false);
+    PXOPT_LOOKUP_STR(state,      config->args, "-state",      false, false);
+    PXOPT_LOOKUP_STR(outProduct, config->args, "-outProduct", false, false);
+    PXOPT_LOOKUP_STR(fault, 	 config->args, "-fault",      false, false);
+    PXOPT_LOOKUP_STR(uri,   	 config->args, "-uri",        false, false);
+    PXOPT_LOOKUP_STR(name,  	 config->args, "-name",       false, false);
+    PXOPT_LOOKUP_STR(reqType,    config->args, "-reqType",    false, false);
 
     psString query = NULL;
@@ -621,18 +471,7 @@
 static bool revertReqMode(pxConfig *config)
 {
-    bool    status;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psS64 req_id = psMetadataLookupS64(&status, config->args, "-req_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -req_id");
-        return false;
-    }
-    if (!req_id) {
-        psError(PS_ERR_UNKNOWN, true, "-req_id is required");
-        return false;
-    }
-        
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_S64(req_id,     config->args, "-req_id",     true, false);
 
     printf("Revert request %" PRId64 "\n", req_id);
@@ -653,106 +492,41 @@
 static bool addJobMode(pxConfig *config)
 {
-    bool    status;
     bool    stampJob = false;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString job_type = psMetadataLookupStr(&status, config->args, "-job_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -job_type");
-        return false;
-    }
-    if (job_type) {
-        if (!strcmp(job_type, "get_image") || !strcmp(job_type, "detect_query")) {
-            stampJob = false;
-        } else if (!strcmp(job_type, "stamp")) {
-            stampJob = true;
-        } else {
-            psError(PS_ERR_UNKNOWN, false, "unknown value for -job_type: %s", job_type);
-            return false;
-        }
+    char   *query = NULL;
+
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_STR(uri,         config->args, "-uri",        true, false);
+    PXOPT_LOOKUP_STR(req_id,      config->args, "-req_id",     true, false);
+    PXOPT_LOOKUP_STR(rownum,      config->args, "-rownum",     true, false);
+    PXOPT_LOOKUP_STR(job_type,    config->args, "-job_type",   false, false);
+    PXOPT_LOOKUP_STR(outputBase,  config->args, "-outputBase", true,  false);
+    PXOPT_LOOKUP_STR(argString,   config->args, "-args",       false, false);
+    PXOPT_LOOKUP_STR(stateString, config->args, "-state",      false, false);
+    PXOPT_LOOKUP_STR(fault,       config->args, "-fault",      false, false);
+
+    // default value for job_type is defined in pstamptoolConfig.c
+    if (!strcmp(job_type, "get_image") || !strcmp(job_type, "detect_query")) {
+	stampJob = false;
+    } else if (!strcmp(job_type, "stamp")) {
+	stampJob = true;
     } else {
-        job_type = "stamp";
-        stampJob = true;
-    }
-
-    psString rownum = psMetadataLookupStr(&status, config->args, "-rownum");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -rownum");
-        return false;
-    }
-    if (!rownum) {
-        psError(PS_ERR_UNKNOWN, true, "-rownum is required");
-        return false;
-    }
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
-    if (!uri) {
-        psError(PS_ERR_UNKNOWN, true, "-uri is required");
-        return false;
-    }
-
-    psString req_id = psMetadataLookupStr(&status, config->args, "-req_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -req_id");
-        return false;
-    }
-    if (!req_id) {
-        psError(PS_ERR_UNKNOWN, true, "-req_id is required");
-        return false;
-    }
-
-    psString outputBase = psMetadataLookupStr(&status, config->args, "-outputBase");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -outputBase");
-        return false;
-    }
-    if (!outputBase) {
-        psError(PS_ERR_UNKNOWN, true, "-outputBase is required");
-        return false;
-    }
-
-    psString argString = psMetadataLookupStr(&status, config->args, "-args");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -args");
-        return false;
-    }
-    if (!argString) {
-        if (stampJob) {
-            psError(PS_ERR_UNKNOWN, true, "-args is required");
-            return false;
-        }
-    }
-
-    psString stateString = psMetadataLookupStr(&status, config->args, "-state");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -state");
-        return false;
-    }
-    if (!stateString) {
-        stateString = "run";
-    }
-    psString fault = psMetadataLookupStr(&status, config->args, "-fault");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fault");
-        return false;
-    }
-    if (!fault) {
-        fault = "0";
-    }
-
-    char *query;
-    
+	psError(PS_ERR_UNKNOWN, false, "unknown value for -job_type: %s", job_type);
+	return false;
+    }
+
+    if (stampJob && !argString) {
+	psError(PS_ERR_UNKNOWN, true, "-args is required for stamp job");
+	return false;
+    }
+
     if (stampJob) {
-        query ="INSERT INTO pstampJob"
-                 " (req_id, rownum, state, jobType, uri, outputBase, fault, args)"
-                 " VALUES( %s, '%s', '%s', '%s', '%s', '%s', %s, '%s')";
+	query = pxDataGet("pstamptool_addjob_stampjob.sql");
     } else {
-        query ="INSERT INTO pstampJob"
-                 " (req_id, rownum, state, jobType, uri, outputBase, fault)"
-                 " VALUES( %s, '%s', '%s', '%s', '%s', '%s', %s)";
+	query = pxDataGet("pstamptool_addjob_otherjob.sql");
+    }
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
     }
 
@@ -780,16 +554,17 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(req_id, config->args, "-req_id", false, false);
+    PXOPT_LOOKUP_STR(job_id, config->args, "-job_id", false, false);
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = NULL;
 
-    psString req_id = psMetadataLookupStr(&status, config->args, "-req_id");
-    psString job_id = psMetadataLookupStr(&status, config->args, "-job_id");
-    
+    if (!req_id && !job_id) {
+        fprintf(stderr, "either req_id or job_id must be specified\n");
+        exit (1);
+    }
+
     if (req_id) {
         psStringAppend(&query,
@@ -799,5 +574,5 @@
                 " WHERE req_id = %s", req_id
             );
-    } else if (job_id) {
+    } else {
         psStringAppend(&query,
                 "SELECT"
@@ -806,8 +581,5 @@
                 " WHERE job_id = %s", job_id
             );
-    } else {
-        fprintf(stderr, "either req_id or job_id must be specified\n");
-        exit (1);
-    }
+    } 
 
     // treat limit == 0 as "no limit"
@@ -836,15 +608,4 @@
     }
 
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "pstampJob", !simple)) {
@@ -863,23 +624,23 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    psString query = psStringCopy(
-            "SELECT"
-            " *"
-            " FROM pstampJob"
-            " WHERE state = 'run'"
-        );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "pstampJob");
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-cam_id", "cam_id", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = pxDataGet("pstamptool_pendingjob.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    // use psDBGenerateWhereSQL because the SQL yields an intermediate table
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "pstampJob");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -908,15 +669,4 @@
     }
 
-    bool simple = false;
-    {
-        bool status = false;
-        simple = psMetadataLookupBool(&status, config->args, "-simple");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-            psFree(output);
-            return false;
-        }
-    }
-
     // negative simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "pstampJob", !simple)) {
@@ -933,31 +683,9 @@
 static bool processedJobMode(pxConfig *config)
 {
-    bool    status;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString job_id = psMetadataLookupStr(&status, config->args, "-job_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -job_id");
-        return false;
-    }
-    if (!job_id) {
-        psError(PS_ERR_UNKNOWN, true, "-job_id is required");
-        return false;
-    }
-    psString state = psMetadataLookupStr(&status, config->args, "-state");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -state");
-        return false;
-    }
-    if (!state) {
-        psError(PS_ERR_UNKNOWN, true, "-state is required");
-        return false;
-    }
-    psString fault = psMetadataLookupStr(&status, config->args, "-fault");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fault");
-        return false;
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_STR(job_id,    config->args, "-job_id", true, false);
+    PXOPT_LOOKUP_STR(state,     config->args, "-state",  true, false);
+    PXOPT_LOOKUP_STR(fault,     config->args, "-fault",  false, false);
 
     psString faultStr = NULL;
@@ -967,9 +695,9 @@
         psStringAppend(&faultStr, ", fault = '%s'", fault);
     }
-        
+
     char *query ="UPDATE pstampJob"
-                 " SET state = '%s' %s"
-                 " WHERE job_id = '%s'";
-
+	" SET state = '%s' %s"
+	" WHERE job_id = '%s'";
+    
     if (!p_psDBRunQuery(config->dbh, query, state, faultStr, job_id)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
Index: trunk/ippTools/src/pstamptoolConfig.c
===================================================================
--- trunk/ippTools/src/pstamptoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/pstamptoolConfig.c	(revision 18561)
@@ -45,152 +45,88 @@
     // -adddatastore
     psMetadata *adddatastoreArgs = psMetadataAlloc();
-    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-uri", 0,
-            "define storage uri", NULL);
-    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-last_fileset", 0,
-            "define last fileset seen", NULL);
-    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-state", 0,
-            "define datastore state", NULL);
-    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-out_product", 0,
-            "define output product name", NULL);
+    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-uri",          0, "define storage uri (required)", NULL);
+    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-out_product",  0, "define output product name (required)", NULL);
+    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-last_fileset", 0, "define last fileset seen", NULL);
+    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-state",        0, "define datastore state", "enabled");
     
     // -datastore
     psMetadata *datastoreArgs = psMetadataAlloc();
-    psMetadataAddBool(datastoreArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
-    psMetadataAddStr(datastoreArgs, PS_LIST_TAIL, "-ds_id", 0,
-            "define ds_id", NULL); 
+    psMetadataAddStr(datastoreArgs, PS_LIST_TAIL, "-ds_id", 0,            "define ds_id", NULL); 
+    psMetadataAddBool(datastoreArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -moddatastore
     psMetadata *moddatastoreArgs = psMetadataAlloc();
-    psMetadataAddStr(moddatastoreArgs, PS_LIST_TAIL, "-ds_id", 0,
-            "define ds_id", NULL); 
-    psMetadataAddStr(moddatastoreArgs, PS_LIST_TAIL, "-last_fileset", 0,
-            "define storage uri", NULL);
-    psMetadataAddStr(moddatastoreArgs, PS_LIST_TAIL, "-state", 0,
-            "define storage uri", NULL);
-    psMetadataAddStr(moddatastoreArgs, PS_LIST_TAIL, "-out_product", 0,
-            "define output product name", NULL);
-
+    psMetadataAddStr(moddatastoreArgs, PS_LIST_TAIL, "-ds_id", 0,            "define ds_id", "0"); 
+    psMetadataAddStr(moddatastoreArgs, PS_LIST_TAIL, "-last_fileset", 0,            "define storage uri", NULL);
+    psMetadataAddStr(moddatastoreArgs, PS_LIST_TAIL, "-state", 0,            "define storage uri", NULL);
 
     // -addreq
     psMetadata *addreqArgs = psMetadataAlloc();
-    psMetadataAddStr(addreqArgs, PS_LIST_TAIL, "-uri", 0,
-            "define request file uri", NULL); 
-    psMetadataAddStr(addreqArgs, PS_LIST_TAIL, "-ds_id", 0,
-            "define request ds_id", NULL); 
+    psMetadataAddStr(addreqArgs, PS_LIST_TAIL, "-uri", 0,            "define request file uri", NULL); 
+    psMetadataAddStr(addreqArgs, PS_LIST_TAIL, "-ds_id", 0,            "define request ds_id", NULL); 
+    // psMetadataAddStr(addreqArgs, PS_LIST_TAIL, "-out_fileset", 0,            "define request output_fileset", NULL); 
 
     // -pendingreq
     psMetadata *pendingreqArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingreqArgs, PS_LIST_TAIL, "-req_id", 0,
-            "define req_id", NULL); 
-    psMetadataAddU64(pendingreqArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(pendingreqArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(pendingreqArgs, PS_LIST_TAIL, "-req_id", 0,            "define req_id", NULL); 
+    psMetadataAddU64(pendingreqArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(pendingreqArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -listreq
     psMetadata *listreqArgs = psMetadataAlloc();
-    psMetadataAddStr(listreqArgs, PS_LIST_TAIL, "-req_id", 0,
-            "define req_id", NULL); 
-    psMetadataAddU64(listreqArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(listreqArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(listreqArgs, PS_LIST_TAIL, "-req_id", 0,            "define req_id", NULL); 
+    psMetadataAddU64(listreqArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(listreqArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -completedreq
     psMetadata *completedreqArgs = psMetadataAlloc();
-    psMetadataAddU64(completedreqArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(completedreqArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddU64(completedreqArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(completedreqArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -processedreq
     psMetadata *processedreqArgs = psMetadataAlloc();
-    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-req_id", 0,
-            "req_id for which to change state", NULL); 
-    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-state", 0,
-            "new state", NULL); 
-    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-outProduct", 0,
-            "define request outProduct", NULL); 
-    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-fault", 0,
-            "define request fault code", NULL); 
-    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-uri", 0,
-            "define the uri", NULL); 
-    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-name", 0,
-            "define the name", NULL); 
-    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-reqType", 0,
-            "define the reqType", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-req_id", 0,            "req_id for which to change state", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-state", 0,            "new state", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-outProduct", 0,            "define request outProduct", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-fault", 0,            "define request fault code", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-uri", 0,            "define the uri", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-name", 0,            "define the name", NULL); 
+    psMetadataAddStr(processedreqArgs, PS_LIST_TAIL, "-reqType", 0,            "define the reqType", NULL); 
 
     // -revertreq
     psMetadata *revertreqArgs = psMetadataAlloc();
-    psMetadataAddS64(revertreqArgs, PS_LIST_TAIL, "-req_id", 0,
-            "req_id for which to revert", 0); 
+    psMetadataAddS64(revertreqArgs, PS_LIST_TAIL, "-req_id", 0,            "req_id for which to revert", 0); 
 
     // -addjob
     psMetadata *addjobArgs = psMetadataAlloc();
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-uri", 0,
-            "define job file uri", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-req_id", 0,
-            "define job req_id", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-rownum", 0,
-            "define job rownum", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-job_type", 0,
-            "define job job_type", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-outputBase", 0,
-            "define job outputBase", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-args", 0,
-            "define job args", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-state", 0,
-            "new state", NULL); 
-    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-fault", 0,
-            "new result", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-uri", 0,            "define job file uri", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-req_id", 0,            "define job req_id", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-rownum", 0,            "define job rownum", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-job_type", 0,            "define job job_type", "stamp"); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-outputBase", 0,            "define job outputBase", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-args", 0,            "define job args", NULL); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-state", 0,            "new state", "run"); 
+    // psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-result", 0,            "new result", "0"); 
+    psMetadataAddStr(addjobArgs, PS_LIST_TAIL, "-fault", 0,            "new result", NULL); 
 
     // -listjob
     psMetadata *listjobArgs = psMetadataAlloc();
-    psMetadataAddStr(listjobArgs, PS_LIST_TAIL, "-req_id", 0,
-            "define request", NULL); 
-    psMetadataAddStr(listjobArgs, PS_LIST_TAIL, "-job_id", 0,
-            "define job", NULL); 
-    psMetadataAddU64(listjobArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(listjobArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(listjobArgs, PS_LIST_TAIL, "-req_id", 0,            "define request", NULL); 
+    psMetadataAddStr(listjobArgs, PS_LIST_TAIL, "-job_id", 0,            "define job", NULL); 
+    psMetadataAddU64(listjobArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(listjobArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -pendingjob
     psMetadata *pendingjobArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingjobArgs, PS_LIST_TAIL, "-job_id", 0,
-            "define job", NULL); 
-    psMetadataAddU64(pendingjobArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(pendingjobArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(pendingjobArgs, PS_LIST_TAIL, "-job_id", 0,            "define job", NULL); 
+    psMetadataAddU64(pendingjobArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(pendingjobArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -processedjob
     psMetadata *processedjobArgs = psMetadataAlloc();
-    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-job_id", 0,
-            "req_id for which to change state", NULL); 
-    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-state", 0,
-            "new state", NULL); 
-    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-fault", 0,
-            "new result", NULL); 
-
-#define PXTOOL_MODE(option, modeval, argset) \
-{ \
-    int N = 0; \
-    if ((N = psArgumentGet (argc, argv, option))) { \
-        psArgumentRemove (N, &argc, argv); \
-        if (config->mode) { \
-            psError(PS_ERR_UNKNOWN, true, "only one mode selection is allowed"); \
-            psFree(config); \
-            return NULL; \
-        } \
-        config->mode = modeval; \
-        config->args = psMemIncrRefCounter(argset); \
-    } \
-    if (!psMetadataAddMetadata(argSets, PS_LIST_TAIL, option, 0, NULL, argset)) {;\
-        psError(PS_ERR_UNKNOWN, false, "failed to add argset for %s", option); \
-    } \
-    psFree(argset); \
-}
+    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-job_id", 0,            "req_id for which to change state", NULL); 
+    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-state", 0,            "new state", NULL); 
+    // psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-result", 0,            "new result", NULL); 
+    psMetadataAddStr(processedjobArgs, PS_LIST_TAIL, "-fault", 0,            "new result", NULL); 
 
     psMetadata *argSets = psMetadataAlloc();
@@ -224,29 +160,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-    addWhereStr(req_id); 
-    addWhereStr(job_id); 
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
Index: trunk/ippTools/src/pxconfig.c
===================================================================
--- trunk/ippTools/src/pxconfig.c	(revision 18531)
+++ trunk/ippTools/src/pxconfig.c	(revision 18561)
@@ -43,5 +43,5 @@
     config->dbh             = NULL;
     config->modules         = NULL;
-    config->where           = NULL;
+    // XXX config->where           = NULL;
     config->args            = NULL;
 
@@ -54,5 +54,5 @@
     psFree(config->dbh);
     psFree(config->modules);
-    psFree(config->where);
+    // XXX psFree(config->where);
     psFree(config->args);
 }
Index: trunk/ippTools/src/pxconfig.h
===================================================================
--- trunk/ippTools/src/pxconfig.h	(revision 18531)
+++ trunk/ippTools/src/pxconfig.h	(revision 18561)
@@ -30,5 +30,5 @@
     psDB *dbh;
     psMetadata *args;
-    psMetadata *where;
+    // XXX deprecate psMetadata *where;
     int argc;
     char **argv;
Index: trunk/ippTools/src/pxinjectConfig.c
===================================================================
--- trunk/ippTools/src/pxinjectConfig.c	(revision 18531)
+++ trunk/ippTools/src/pxinjectConfig.c	(revision 18561)
@@ -45,41 +45,25 @@
     // -newExp
     psMetadata *newExpArgs = psMetadataAlloc();
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tmp_exp_name",  0,
-            "define the exp_name (required)", NULL);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tmp_inst",  0,
-            "define the camera name (required)", NULL);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tmp_telescope",  0,
-            "define the telescope name (required)", NULL);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-workdir",  0,
-            "define workdir (required)", 0);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-reduction",  0,
-            "define reduction class", NULL);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-dvodb",  0,
-            "define the dvodb for the next processing step", NULL);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "define the tess_id for the next processing step", NULL);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-end_stage",  0,
-            "define the end goal processing step", NULL);
-    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-label",  0,
-            "define a label (carried to chip stage)", NULL);
-    psMetadataAddBool(newExpArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tmp_exp_name",  0,            "define the exp_name (required)", NULL);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tmp_inst",  0,            "define the camera name (required)", NULL);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tmp_telescope",  0,            "define the telescope name (required)", NULL);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-workdir",  0,            "define workdir (required)", 0);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-reduction",  0,            "define reduction class", NULL);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-dvodb",  0,            "define the dvodb for the next processing step", NULL);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-tess_id",  0,            "define the tess_id for the next processing step", NULL);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-end_stage",  0,            "define the end goal processing step", NULL);
+    psMetadataAddStr(newExpArgs, PS_LIST_TAIL, "-label",  0,            "define a label (carried to chip stage)", NULL);
+    psMetadataAddBool(newExpArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -newImfile
     psMetadata *newImfileArgs = psMetadataAlloc();
-    psMetadataAddS64(newImfileArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define the exp_id (required)", 0);
-    psMetadataAddStr(newImfileArgs, PS_LIST_TAIL, "-tmp_class_id",  0,
-            "define the class ID (required)", NULL);
-    psMetadataAddStr(newImfileArgs, PS_LIST_TAIL, "-uri",  0,
-            "define the URI (required)", NULL);
+    psMetadataAddS64(newImfileArgs, PS_LIST_TAIL, "-exp_id",  0,            "define the exp_id (required)", 0);
+    psMetadataAddStr(newImfileArgs, PS_LIST_TAIL, "-tmp_class_id",  0,            "define the class ID (required)", NULL);
+    psMetadataAddStr(newImfileArgs, PS_LIST_TAIL, "-uri",  0,            "define the URI (required)", NULL);
 
     // -updatenewExp
     psMetadata *updatenewExpArgs = psMetadataAlloc();
-    psMetadataAddS64(updatenewExpArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "define the exp_id (required)", 0);
-    psMetadataAddStr(updatenewExpArgs, PS_LIST_TAIL, "-state", 0,
-            "set state (required)", NULL);
-
+    psMetadataAddS64(updatenewExpArgs, PS_LIST_TAIL, "-exp_id",  0,            "define the exp_id (required)", 0);
+    psMetadataAddStr(updatenewExpArgs, PS_LIST_TAIL, "-state", 0,            "set state (required)", NULL);
 
     psMetadata *argSets = psMetadataAlloc();
@@ -101,92 +85,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-    addWhereStr(det_id);
-    {
-        int n = 0;
-        bool status = false;
-        if ((n = psMetadataLookupS32(&status, config->args, "-iteration"))) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "iteration", 0, "==", n)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(det_type);
-    addWhereStr(exp_id);
-    addWhereStr(class_id);
-    // convert '-inst' to 'camera'
-    {
-        psString str = NULL;
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
-            if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(telescope);
-    {
-        int n = 0;
-        bool status = false;
-        if ((n = psMetadataLookupS32(&status, config->args, "-imfiles"))) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "imfiles", 0, "==", n)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item imfiles");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(filter);
-    addWhereStr(stats);
-    addWhereStr(recipe);
-    {
-        int n = 0;
-        bool status = false;
-        if ((n = psMetadataLookupS32(&status, config->args, "-guide_version"))) {
-            if (!psMetadataAddS32(config->where, PS_LIST_TAIL, "guide_version", 0, "==", n)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item guide_version");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    {
-        bool boolean = false;
-        bool status = false;
-
-        if ((boolean = psMetadataLookupBool(&status, config->args, "-accept"))) {
-            if (!psMetadataAddBool(config->where, PS_LIST_TAIL, "accept", 0, "==", boolean)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
Index: trunk/ippTools/src/pxtools.h
===================================================================
--- trunk/ippTools/src/pxtools.h	(revision 18531)
+++ trunk/ippTools/src/pxtools.h	(revision 18561)
@@ -22,6 +22,12 @@
 
 #include <stdio.h>
+#include <string.h>   // for strcmp and strncmp
 #include <strings.h>  // for strcasecmp
 #include <unistd.h>   // for unlink
+
+// #include <stdlib.h>
+// #include <stdint.h>
+// #include <inttypes.h>
+
 #include <pslib.h>
 #include <psmodules.h>
@@ -253,3 +259,222 @@
   PXOPT_COPY_PRIMITIVE(from, to, psU64, U64, oldname, newname, comment)
 
+
+/*** these PXOPT_ADD_WHERE macros are used to construct the default sql elements ***/
+
+#define PXOPT_ADD_WHERE_STR(name) \
+{ \
+    psString str = NULL; \
+    bool status = false; \
+    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_STR_ALIAS(name,realname) \
+{ \
+    psString str = NULL; \
+    bool status = false; \
+    if ((str = psMetadataLookupStr(&status, config->args, name))) { \
+        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, realname, 0, "==", str)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item %s", name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_S16(name) \
+{ \
+    psS16 s16 = 0; \
+    bool status = false; \
+    if ((s16= psMetadataLookupS16(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddS16(config->where, PS_LIST_TAIL, #name, 0, "==", s16)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_BOOL(name) \
+{ \
+    bool value = false;	 \
+    bool status = false; \
+    if ((value = psMetadataLookupBool(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddBool(config->where, PS_LIST_TAIL, #name, 0, "==", value)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_S32(name) \
+{ \
+    psS32 s32 = 0; \
+    bool status = false; \
+    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_S64(name) \
+{ \
+    psS64 s64 = 0; \
+    bool status = false; \
+    if ((s64= psMetadataLookupS64(&status, config->args, "-" #name))) { \
+        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, #name, 0, "==", s64)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_F32(name) \
+{ \
+    psF32 var = 0; \
+    bool status = false; \
+    if ((var = psMetadataLookupF32(&status, config->args, "-" #name))) { \
+        if (!isnan(var)) { \
+            if (!psMetadataAddF32(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
+                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+                psFree(config); \
+                return NULL; \
+            } \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_F64(name) \
+{ \
+    psF64 var = 0; \
+    bool status = false; \
+    if ((var = psMetadataLookupF64(&status, config->args, "-" #name))) { \
+        if (!isnan(var))  { \
+            if (!psMetadataAddF64(config->where, PS_LIST_TAIL, #name, 0, "==", var)) { \
+                psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+                psFree(config); \
+                return NULL; \
+            } \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_BOOL_ALIAS(flag,name)	\
+{ \
+    bool value = 0; \
+    bool status = false; \
+    if ((value = psMetadataLookupBool(&status, config->args, flag))) {	\
+        if (!psMetadataAddBOOL(config->where, PS_LIST_TAIL, name, 0, "==", value)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item %s", flag); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_S16_ALIAS(flag,name)	\
+{ \
+    psS16 s16 = 0; \
+    bool status = false; \
+    if ((s16= psMetadataLookupS16(&status, config->args, flag))) {	\
+        if (!psMetadataAddS16(config->where, PS_LIST_TAIL, name, 0, "==", s16)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item %s", flag); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_S32_ALIAS(flag,name)	\
+{ \
+    psS32 s32 = 0; \
+    bool status = false; \
+    if ((s32= psMetadataLookupS32(&status, config->args, flag))) {	\
+        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, name, 0, "==", s32)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item %s", flag); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_S64_ALIAS(flag,name)	\
+{ \
+    psS64 s64 = 0; \
+    bool status = false; \
+    if ((s64= psMetadataLookupS64(&status, config->args, flag))) {	\
+        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, name, 0, "==", s64)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item %s", flag); \
+            psFree(config); \
+            return NULL; \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_F32_ALIAS(flag,name)	\
+{ \
+    psF32 var = 0; \
+    bool status = false; \
+    if ((var = psMetadataLookupF32(&status, config->args, flag))) {	\
+        if (!isnan(var))  { \
+            if (!psMetadataAddF32(config->where, PS_LIST_TAIL, name, 0, "==", var)) { \
+                psError(PS_ERR_UNKNOWN, false, "failed to add item %s", flag); \
+                psFree(config); \
+                return NULL; \
+            } \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_F64_ALIAS(flag,name)	\
+{ \
+    psF64 var = 0; \
+    bool status = false; \
+    if ((var = psMetadataLookupF64(&status, config->args, flag))) {	\
+        if (!isnan(var))  { \
+            if (!psMetadataAddF64(config->where, PS_LIST_TAIL, name, 0, "==", var)) { \
+                psError(PS_ERR_UNKNOWN, false, "failed to add item %s", flag); \
+                psFree(config); \
+                return NULL; \
+            } \
+        } \
+    } \
+}
+
+#define PXOPT_ADD_WHERE_TIME_STR(name) \
+{ \
+    psString str = NULL; \
+    bool status = false; \
+    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
+        psTime *time = psTimeFromISO(str, PS_TIME_UTC); \
+        if (!time) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to convert " #name " into a psTime object"); \
+            psFree(config); \
+            return NULL; \
+        } \
+        psMetadataItem *item = psMetadataLookup(config->args, "-" #name); \
+        if (item) { \
+            str = item->comment; \
+        } else { \
+            str = NULL; \
+        } \
+        if (!psMetadataAddTime(config->where, PS_LIST_TAIL, #name, 0, str, time)) {\
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
+            psFree(config); \
+            return NULL; \
+        } \
+        psFree(time); \
+    } \
+}
+
 #endif // PXTOOLS_H
Index: trunk/ippTools/src/pztool.c
===================================================================
--- trunk/ippTools/src/pztool.c	(revision 18531)
+++ trunk/ippTools/src/pztool.c	(revision 18561)
@@ -162,13 +162,20 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where,  "-exp_name",     "exp_name", "==");
+    PXOPT_COPY_STR(config->args, where,  "-inst",         "camera", "==");
+    PXOPT_COPY_STR(config->args, where,  "-telescope",    "telescope", "==");
+    PXOPT_COPY_STR(config->args, where,  "-exp_type",     "exp_type", "==");
+
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = psStringCopy("SELECT * FROM summitExp");
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "summitExp");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "summitExp");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -206,8 +213,15 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where,  "-exp_name",     "exp_name", "==");
+    PXOPT_COPY_STR(config->args, where,  "-inst",         "camera", "==");
+    PXOPT_COPY_STR(config->args, where,  "-telescope",    "telescope", "==");
+    PXOPT_COPY_STR(config->args, where,  "-exp_type",     "exp_type", "==");
+
     PXOPT_LOOKUP_BOOL(desc, config->args, "-desc", false);
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
+    // XXX leave this query here ?
     psString query = psStringCopy(
             "SELECT"
@@ -223,9 +237,10 @@
         );
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "pzDownloadExp");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "pzDownloadExp");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     psStringAppend(&query, " ORDER BY summitExp.dateobs");
@@ -274,4 +289,10 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where,  "-exp_name",     "exp_name", "==");
+    PXOPT_COPY_STR(config->args, where,  "-inst",         "camera", "==");
+    PXOPT_COPY_STR(config->args, where,  "-telescope",    "telescope", "==");
+    PXOPT_COPY_STR(config->args, where,  "-exp_type",     "exp_type", "==");
 
     PXOPT_LOOKUP_BOOL(desc, config->args, "-desc", false);
@@ -300,6 +321,6 @@
         psStringAppend(&query, " WHERE camera = \"%s\"", camera);
 
-        if (config->where) {
-            psString whereClause = psDBGenerateWhereConditionSQL(config->where, "pzDownloadImfile");
+        if (psListLength(where->list)) {
+            psString whereClause = psDBGenerateWhereConditionSQL(where, "pzDownloadImfile");
             psStringAppend(&query, " AND %s", whereClause);
             psFree(whereClause);
@@ -347,4 +368,5 @@
         psFree(result);
     }
+    psFree(where);
 
     // stitch the arrays of imfiles together
@@ -378,4 +400,6 @@
     // default values
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    // NOTE : the rest of the command-line args are parsed in copydoneCompleteExp
 
     if (!pzDownloadImfileInsert(config->dbh,
@@ -447,4 +471,6 @@
     }
 
+    // XXX this is a bit ugly : could just use the PXOPT_COPY_* methods 
+    // and not pass exp_name, camera, or telescope as additional args
     psMetadata *where = psMetadataAlloc();
     if (exp_name) {
@@ -472,5 +498,5 @@
     }
 
-    if (config->where) {
+    if (psListLength(where->list)) {
         psString whereClause = psDBGenerateWhereSQL(where, NULL);
         psStringAppend(&query, " %s", whereClause);
@@ -720,10 +746,19 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where,  "-exp_name", "exp_name", "==");
+    PXOPT_COPY_STR(config->args, where, "-inst", "inst", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", "telescope", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class", "class", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class_id", "class_id", "==");
+
     PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
-    if (!pxSetFaultCode(config->dbh, "pzDownloadImfile", config->where, code)) {
+    if (!pxSetFaultCode(config->dbh, "pzDownloadImfile", where, code)) {
         psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
-        return false;
-    }
+	psFree (where);
+	return false;
+    }
+    psFree(where);
 
     return true;
@@ -734,4 +769,11 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_STR(config->args, where,  "-exp_name", "exp_name", "==");
+    PXOPT_COPY_STR(config->args, where, "-inst", "inst", "==");
+    PXOPT_COPY_STR(config->args, where, "-telescope", "telescope", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class", "class", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class_id", "class_id", "==");
 
     psString query = pxDataGet("pztool_revertcopied.sql");
@@ -741,9 +783,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "pzDownloadImfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "pzDownloadImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -803,4 +846,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // NOTE : the command-line args are parsed in copydoneCompleteExp
 
     // start a transaction so it's all rows or nothing
Index: trunk/ippTools/src/pztoolConfig.c
===================================================================
--- trunk/ippTools/src/pztoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/pztoolConfig.c	(revision 18561)
@@ -45,138 +45,83 @@
     // -adddatastore
     psMetadata *adddatastoreArgs = psMetadataAlloc();
-    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID", NULL); 
-    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID", NULL); 
-    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-uri", 0,
-            "define storage uri", NULL);
+    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID", NULL); 
+    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID", NULL); 
+    psMetadataAddStr(adddatastoreArgs, PS_LIST_TAIL, "-uri", 0,            "define storage uri", NULL);
     
     // -datastore
     psMetadata *datastoreArgs = psMetadataAlloc();
-    psMetadataAddBool(datastoreArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddBool(datastoreArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -seen
     psMetadata *seenArgs = psMetadataAlloc();
-    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID", NULL); 
-    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID", NULL); 
-    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID", NULL); 
-    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-exp_type", 0,
-            "define exposure type", NULL); 
-    psMetadataAddBool(seenArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-exp_name", 0,            "define exposure ID", NULL); 
+    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID", NULL); 
+    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID", NULL); 
+    psMetadataAddStr(seenArgs, PS_LIST_TAIL, "-exp_type", 0,            "define exposure type", NULL); 
+    psMetadataAddBool(seenArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
     
     // -pendingexp
     psMetadata *pendingexpArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID", NULL); 
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID", NULL); 
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID", NULL); 
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-exp_type", 0,
-            "define exposure type", NULL); 
-    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-desc", 0,
-            "sort ouput in descending format", false);
-    psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-exp_name", 0,            "define exposure ID", NULL); 
+    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID", NULL); 
+    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID", NULL); 
+    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-exp_type", 0,            "define exposure type", NULL); 
+    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-desc", 0,            "sort ouput in descending format", false);
+    psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -pendingimfile
     psMetadata *pendingimfileArgs = psMetadataAlloc();
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID", NULL); 
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID", NULL); 
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID", NULL); 
-    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-exp_type", 0,
-            "define exposure type", NULL); 
-    psMetadataAddBool(pendingimfileArgs, PS_LIST_TAIL, "-desc", 0,
-            "sort ouput in descending format", false);
-    psMetadataAddU64(pendingimfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(pendingimfileArgs, PS_LIST_TAIL, "-simple", 0,
-            "use the simple output format", false);
+    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-exp_name", 0,            "define exposure ID", NULL); 
+    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID", NULL); 
+    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID", NULL); 
+    psMetadataAddStr(pendingimfileArgs, PS_LIST_TAIL, "-exp_type", 0,            "define exposure type", NULL); 
+    psMetadataAddBool(pendingimfileArgs, PS_LIST_TAIL, "-desc", 0,            "sort ouput in descending format", false);
+    psMetadataAddU64(pendingimfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(pendingimfileArgs, PS_LIST_TAIL, "-simple", 0,            "use the simple output format", false);
 
     // -copydone
     psMetadata *copydoneArgs = psMetadataAlloc();
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID (required)", NULL); 
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID (required)", NULL); 
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID (required)", NULL); 
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-class", 0,
-            "define class", NULL);
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-class_id", 0,
-            "define class_id", NULL);
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-uri", 0,
-            "define storage uri", NULL);
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-workdir",  0,
-        "define the \"default\" workdir for this exposure", NULL);
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-dvodb",  0,
-        "define the dvodb for the next processing step", NULL);
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-tess_id",  0,
-        "define the tess_id for the next processing step", NULL);
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-end_stage",  0,
-        "define the end goal processing step", NULL);
-    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-label",  0,
-        "define the label for the chip stage", NULL);
-    psMetadataAddS16(copydoneArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-exp_name", 0,            "define exposure ID (required)", NULL); 
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID (required)", NULL); 
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID (required)", NULL); 
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-class", 0,            "define class", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-class_id", 0,            "define class_id", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-uri", 0,            "define storage uri", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-workdir",  0,        "define the \"default\" workdir for this exposure", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-dvodb",  0,        "define the dvodb for the next processing step", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-tess_id",  0,        "define the tess_id for the next processing step", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-end_stage",  0,        "define the end goal processing step", NULL);
+    psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-label",  0,        "define the label for the chip stage", NULL);
+    psMetadataAddS16(copydoneArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
 
     // -copied
     psMetadata *copiedArgs = psMetadataAlloc();
-    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID", NULL); 
-    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID", NULL); 
-    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID", NULL); 
-    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-class", 0,
-            "define class", NULL);
-    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-class_id", 0,
-            "define class_id", NULL);
-    psMetadataAddBool(copiedArgs, PS_LIST_TAIL, "-faulted",  0,
-            "only return imfiles with a fault status set", false);
-    psMetadataAddU64(copiedArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(copiedArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-exp_name", 0,            "define exposure ID", NULL); 
+    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID", NULL); 
+    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID", NULL); 
+    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-class", 0,            "define class", NULL);
+    psMetadataAddStr(copiedArgs, PS_LIST_TAIL, "-class_id", 0,            "define class_id", NULL);
+    psMetadataAddBool(copiedArgs, PS_LIST_TAIL, "-faulted",  0,            "only return imfiles with a fault status set", false);
+    psMetadataAddU64(copiedArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(copiedArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -updatecopied
     psMetadata *updatecopiedArgs = psMetadataAlloc();
-    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID (required)", NULL); 
-    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID (required)", NULL); 
-    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID (required)", NULL); 
-    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-class", 0,
-            "define class", NULL);
-    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-class_id", 0,
-            "define class_id", NULL);
-    psMetadataAddS16(updatecopiedArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-exp_name", 0,            "define exposure ID (required)", NULL); 
+    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID (required)", NULL); 
+    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID (required)", NULL); 
+    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-class", 0,            "define class", NULL);
+    psMetadataAddStr(updatecopiedArgs, PS_LIST_TAIL, "-class_id", 0,            "define class_id", NULL);
+    psMetadataAddS16(updatecopiedArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -revertcopied
     psMetadata *revertcopiedArgs = psMetadataAlloc();
-    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-exp_name", 0,
-            "define exposure ID (required)", NULL); 
-    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-inst", 0,
-            "define camera ID (required)", NULL); 
-    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-telescope", 0,
-            "define telescope ID (required)", NULL); 
-    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-class", 0,
-            "define class", NULL);
-    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-class_id", 0,
-            "define class_id", NULL);
-    psMetadataAddS16(revertcopiedArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-exp_name", 0,            "define exposure ID (required)", NULL); 
+    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-inst", 0,            "define camera ID (required)", NULL); 
+    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-telescope", 0,            "define telescope ID (required)", NULL); 
+    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-class", 0,            "define class", NULL);
+    psMetadataAddStr(revertcopiedArgs, PS_LIST_TAIL, "-class_id", 0,            "define class_id", NULL);
+    psMetadataAddS16(revertcopiedArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     // -clearcommonfaults
@@ -185,14 +130,9 @@
     // -advance
     psMetadata *advanceArgs = psMetadataAlloc();
-    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-workdir",  0,
-        "define the \"default\" workdir for this exposure", NULL);
-    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-dvodb",  0,
-        "define the dvodb for the next processing step", NULL);
-    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-tess_id",  0,
-        "define the tess_id for the next processing step", NULL);
-    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-end_stage",  0,
-        "define the end goal processing step", NULL);
-    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-label",  0,
-        "define the label for the chip stage", NULL);
+    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-workdir",  0,        "define the \"default\" workdir for this exposure", NULL);
+    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-dvodb",  0,        "define the dvodb for the next processing step", NULL);
+    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-tess_id",  0,        "define the tess_id for the next processing step", NULL);
+    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-end_stage",  0,        "define the end goal processing step", NULL);
+    psMetadataAddStr(advanceArgs, PS_LIST_TAIL, "-label",  0,        "define the label for the chip stage", NULL);
 
     psMetadata *argSets = psMetadataAlloc();
@@ -222,44 +162,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-    addWhereStr(exp_name); 
-    addWhereStr(telescope); 
-    // convert '-inst' to 'camera'
-    {
-        psString str = NULL;
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
-            if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-    addWhereStr(exp_type); 
-    addWhereStr(class); 
-    addWhereStr(class_id); 
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
Index: trunk/ippTools/src/regtool.c
===================================================================
--- trunk/ippTools/src/regtool.c	(revision 18531)
+++ trunk/ippTools/src/regtool.c	(revision 18561)
@@ -297,8 +297,4 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
-
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where,  "-exp_id", "exp_id", "==");
@@ -306,4 +302,8 @@
     PXOPT_COPY_STR(config->args, where,  "-class_id", "class_id", "==");
 
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
     psString query = pxDataGet("regtool_processedimfile.sql");
     if (!query) {
@@ -313,5 +313,5 @@
     }
 
-    if (where) {
+    if (psListLength(where->list)) {
         psString whereClause = psDBGenerateWhereConditionSQL(where, "rawImfile");
         psStringAppend(&query, " AND %s", whereClause);
@@ -381,15 +381,23 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where,  "-tmp_class_id", "tmp_class_id", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class_id",     "class_id", "==");
+    PXOPT_COPY_S16(config->args, where,  "-code",         "fault", "==");
+
     psString query = pxDataGet("regtool_revertprocessedimfile.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawImfile");
+	psFree(where);
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "rawImfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -413,10 +421,16 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
+    PXOPT_COPY_STR(config->args, where,  "-class_id",     "class_id", "==");
+
     PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
-    if (!pxSetFaultCode(config->dbh, "rawImfile", config->where, code)) {
+    if (!pxSetFaultCode(config->dbh, "rawImfile", where, code)) {
         psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
-        return false;
-    }
+	psFree (where);
+        return false;
+    }
+    psFree (where);
 
     return true;
@@ -511,9 +525,10 @@
 
     // optional
+    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
+    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
     PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", false, false);
     PXOPT_LOOKUP_STR(end_stage, config->args, "-end_stage", false, false);
-    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", false, false);
     PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
     PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
@@ -561,5 +576,4 @@
     PXOPT_LOOKUP_STR(label,  config->args, "-label", false, false);
     PXOPT_LOOKUP_STR(hostname, config->args, "-hostname", false, false);
-    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
 
     // default
@@ -789,8 +803,4 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
-
     psString query = pxDataGet("regtool_processedexp.sql");
     if (!query) {
@@ -812,6 +822,6 @@
     PXOPT_COPY_STR(config->args, where,  "-reduction", "reduction", "==");
     PXOPT_COPY_STR(config->args, where,  "-filter", "filter", "==");
-    PXOPT_COPY_F64(config->args, where,  "-airmass_min", "airmass", ">=");
-    PXOPT_COPY_F64(config->args, where,  "-airmass_max", "airmass", "<");
+    PXOPT_COPY_F32(config->args, where,  "-airmass_min", "airmass", ">=");
+    PXOPT_COPY_F32(config->args, where,  "-airmass_max", "airmass", "<");
     PXOPT_COPY_F64(config->args, where,  "-ra_min", "ra", ">=");
     PXOPT_COPY_F64(config->args, where,  "-ra_max", "ra", "<");
@@ -832,6 +842,6 @@
     PXOPT_COPY_F64(config->args, where,  "-az_min", "az", ">=");
     PXOPT_COPY_F64(config->args, where,  "-az_max", "az", "<");
-    PXOPT_COPY_F32(config->args, where,  "-ccd_temp_min", "ccd_temp", ">=");
-    PXOPT_COPY_F32(config->args, where,  "-ccd_temp_max", "ccd_temp", "<");
+    PXOPT_COPY_F64(config->args, where,  "-ccd_temp_min", "ccd_temp", ">=");
+    PXOPT_COPY_F64(config->args, where,  "-ccd_temp_max", "ccd_temp", "<");
     PXOPT_COPY_F64(config->args, where,  "-posang_min", "posang", ">=");
     PXOPT_COPY_F64(config->args, where,  "-posang_max", "posang", "<");
@@ -839,4 +849,8 @@
     PXOPT_COPY_F32(config->args, where,  "-solang_min", "solang", ">=");
     PXOPT_COPY_F32(config->args, where,  "-solang_max", "solang", "<");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
 
     if (psListLength(where->list)) {
@@ -906,15 +920,22 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
+    PXOPT_COPY_S16(config->args, where,  "-code",         "fault", "==");
+
     psString query = pxDataGet("regtool_revertprocessedexp.sql");
     if (!query) {
         psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
+	psFree(where);
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "rawExp");
         psStringAppend(&query, " AND %s", whereClause);
+	psFree(where);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
@@ -938,10 +959,15 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where,  "-exp_id",       "exp_id", "==");
+
     PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
-    if (!pxSetFaultCode(config->dbh, "rawExp", config->where, code)) {
+    if (!pxSetFaultCode(config->dbh, "rawExp", where, code)) {
         psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
-        return false;
-    }
+	psFree(where);
+        return false;
+    }
+    psFree(where);
 
     return true;
Index: trunk/ippTools/src/regtoolConfig.c
===================================================================
--- trunk/ippTools/src/regtoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/regtoolConfig.c	(revision 18561)
@@ -50,10 +50,4 @@
     // -pendingimfile
     psMetadata *pendingimfileArgs = psMetadataAlloc();
-// support for this options is unimplemented
-#if 0
-    ADD_OPT(Str,  pendingimfileArgs, "-exp_id",    "search by exposure ID", NULL);
-    ADD_OPT(Str,  pendingimfileArgs, "-class",     "search by class",       NULL);
-    ADD_OPT(Str,  pendingimfileArgs, "-class_id",  "search by class ID",    NULL);
-#endif
     ADD_OPT(U64,  pendingimfileArgs, "-limit",     "limit result set to N items",  0);
     ADD_OPT(Bool, pendingimfileArgs, "-simple",    "use the simple output format", false);
@@ -68,8 +62,10 @@
     ADD_OPT(Str,  addprocessedimfileArgs, "-class_id",       "define class ID (required)",         NULL);
     ADD_OPT(Str,  addprocessedimfileArgs, "-uri",            "define URI (required)",             NULL);
+
     ADD_OPT(Str,  addprocessedimfileArgs, "-exp_type",       "define exposure type",             NULL);
     ADD_OPT(Str,  addprocessedimfileArgs, "-filelevel",      "define filelevel",             NULL);
     ADD_OPT(Str,  addprocessedimfileArgs, "-filter",         "define filter ",                 NULL);
     ADD_OPT(Str,  addprocessedimfileArgs, "-comment",        "define comment ",             NULL);
+
     ADD_OPT(F32,  addprocessedimfileArgs, "-airmass",        "define airmass",                 NAN);
     ADD_OPT(F64,  addprocessedimfileArgs, "-ra",             "define RA",                 NAN);
@@ -94,4 +90,5 @@
     ADD_OPT(F32,  addprocessedimfileArgs, "-m2_tip",         "define M2 TIP position",                NAN);
     ADD_OPT(F32,  addprocessedimfileArgs, "-m2_tilt",        "define M2 TILT position",         NAN);
+
     ADD_OPT(F32,  addprocessedimfileArgs, "-env_temperature","define Environmental Temperature",     NAN);
     ADD_OPT(F32,  addprocessedimfileArgs, "-env_humidity",   "define Environmental Humidity",         NAN);
@@ -139,11 +136,4 @@
     // -pendingexp
     psMetadata *pendingexpArgs = psMetadataAlloc();
-// support for these options in unimplemented
-#if 0
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-exp_id",   0,        "search by exposure ID", NULL);
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-inst",     0,        "search by camera", NULL);
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-telescope",0,        "search by telescope", NULL);
-    psMetadataAddStr(pendingexpArgs, PS_LIST_TAIL, "-exp_type", 0,        "search by exposure type", NULL);
-#endif
     psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",    0,        "limit result set to N items", 0);
     psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-simple",  0,        "use the simple output format", false);
@@ -156,7 +146,8 @@
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-telescope",        0,        "define the telescope name (required)", NULL);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_tag",          0,        "define the external exposure tag name (required)", NULL);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-filelevel",        0,        "define the data partitioning level of this file (required)", NULL);
+
     psMetadataAddTime(addprocessedexpArgs, PS_LIST_TAIL, "-dateobs",         0,        "define observation time", NULL);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_type",         0,        "define exposure type", NULL);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-filelevel",        0,        "define the data partitioning level of this file", NULL);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-workdir",          0,        "define the \"default\" workdir for this exposure", NULL);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-dvodb",            0,        "define the dvodb for the next processing step", NULL);
@@ -208,8 +199,4 @@
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-hostname",         0,        "define host name", NULL);
     psMetadataAddS16(addprocessedexpArgs, PS_LIST_TAIL, "-code",             0,        "set fault code", 0);
-    /*
-    psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-recip",  0,        "define URL", NULL);
-    psMetadataAddStr(updateArgs, PS_LIST_TAIL, "-mosiac",  0,        "define URL", NULL);
-    */
 
     // -processedexp
@@ -297,62 +284,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PXTOOLS_ERR_PROG, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-    addWhereStr(exp_id);
-    addWhereStr(exp_name);
-    // convert '-inst' to 'camera'
-    {
-        psString str = NULL;
-        bool status = false;
-        if ((str = psMetadataLookupStr(&status, config->args, "-inst"))) {
-            if (!psMetadataAddStr(config->where, PS_LIST_TAIL, "camera", 0, "==", str)) {
-                psError(PXTOOLS_ERR_PROG, false, "failed to add item camera");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    addWhereStr(telescope);
-    addWhereStr(exp_type);
-    addWhereStr(class);
-    addWhereStr(class_id);
-    addWhereStr(tmp_class_id);
-    addWhereStr(filter);
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
-
     // define Database handle, if used
     config->dbh = psMemIncrRefCounter(pmConfigDB(config->modules));
Index: trunk/ippTools/src/stacktool.c
===================================================================
--- trunk/ippTools/src/stacktool.c	(revision 18531)
+++ trunk/ippTools/src/stacktool.c	(revision 18561)
@@ -524,4 +524,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "stack_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -533,9 +537,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "stackInputSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "stackInputSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -592,4 +597,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "stack_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -601,9 +610,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "stackSumSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "stackSumSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -723,4 +733,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "stack_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -732,9 +746,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "stackSumSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "stackSumSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -790,4 +805,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "stack_id", "==");
+    PXOPT_COPY_S16(config->args, where, "-code", "fault", "==");
+
     psString query = pxDataGet("stacktool_revertsumskyfile.sql");
     if (!query) {
@@ -796,9 +815,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "stackSumSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "stackSumSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     if (!p_psDBRunQuery(config->dbh, query)) {
Index: trunk/ippTools/src/stacktoolConfig.c
===================================================================
--- trunk/ippTools/src/stacktoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/stacktoolConfig.c	(revision 18561)
@@ -47,155 +47,87 @@
     // -definebyquery
     psMetadata *definebyqueryArgs = psMetadataAlloc();
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_skycell_id",  0,
-            "search for skycell_id", NULL);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_good_frac_min",  0,
-            "define min good_frac", 0.0);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_type",  0,
-            "search for exp_type", "object");
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_inst",  0,
-            "search for camera", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_filter",  0,
-            "search for filter", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_uri",  0,
-            "search for uri", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_begin", 0,
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_sat_pixel_frac_max",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_min",  0,
-            "define min exposure time", NAN);
-    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_max",  0,
-            "define max exposure time", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_max",  0,
-            "define max solar angle", NAN);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-random_subset",  0,
-            "use a random subset of elements", false);
-    psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-random_limit",  0,
-            "use this number of random elements", 20);
-
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all",  0,
-            "allow everything to be queued without search terms", false);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_skycell_id",  0,            "search for skycell_id", NULL);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_good_frac_min",  0,            "define min good_frac", 0.0);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_type",  0,            "search for exp_type", "object");
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_inst",  0,            "search for camera", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_telescope",  0,            "search for telescope", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_filter",  0,            "search for filter", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_uri",  0,            "search for uri", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_begin", 0,            "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_end", 0,            "search for exposures by time (<)", NULL);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_sat_pixel_frac_max",  0,            "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_min",  0,            "define min exposure time", NAN);
+    psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_time_max",  0,            "define max exposure time", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_solang_max",  0,            "define max solar angle", NAN);
+    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-random_subset",  0,            "use a random subset of elements", false);
+    psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-random_limit",  0,            "use this number of random elements", 20);
+    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
+    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,
-            "define skycell ID (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "define tessellation ID (required)", NULL);
-    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-warp_id",
-             PS_META_DUPLICATE_OK,
-             "include this warp ID (multiple OK, required)", 0);
-
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,            "define skycell ID (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID (required)", NULL);
+    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-warp_id",             PS_META_DUPLICATE_OK,             "include this warp ID (multiple OK, required)", 0);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID (required)", 0);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
-            "set state (required)", NULL);
-#if 0
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-#endif
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-stack_id", 0,            "define stack ID (required)", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "set state (required)", NULL);
 
     // -addinputskyfile
     psMetadata *addinputskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID (required)", 0);
-    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "define warp ID (required)", 0);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,            "define stack ID (required)", 0);
+    psMetadataAddS64(addinputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,            "define warp ID (required)", 0);
 
     // -inputskyfile
     psMetadata *inputskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID", 0);
-    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", 0);
-    psMetadataAddU64(inputskyfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,            "search by stack ID", 0);
+    psMetadataAddS64(inputskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warp ID", 0);
+    psMetadataAddU64(inputskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(inputskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -tosum
     psMetadata *tosumArgs = psMetadataAlloc();
-    psMetadataAddS64(tosumArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID", 0);
-    psMetadataAddS64(tosumArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", 0);
-    psMetadataAddU64(tosumArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tosumArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(tosumArgs, PS_LIST_TAIL, "-stack_id", 0,            "search by stack ID", 0);
+    psMetadataAddS64(tosumArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warp ID", 0);
+    psMetadataAddU64(tosumArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tosumArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addsumskyfile
     psMetadata *addsumskyfileArgs = psMetadataAlloc();
-    psMetadataAddS64(addsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "define stack ID (required)", 0);
-    psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-uri", 0,
-            "define URI of file", 0);
-    psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-path_base", 0,
-            "define base output location", 0);
-    psMetadataAddF64(addsumskyfileArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposue background", NAN);
-    psMetadataAddF64(addsumskyfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposue background mean stdev", NAN);
-    psMetadataAddF32(addsumskyfileArgs, PS_LIST_TAIL, "-dtime_stack",  0,
-            "define elapsed processing time", NAN);
-    psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-hostname", 0,
-            "define hostname", 0);
-    psMetadataAddF32(addsumskyfileArgs, PS_LIST_TAIL, "-good_frac",  0,
-            "define %% of good pixels", NAN);
-    psMetadataAddS16(addsumskyfileArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddS64(addsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,            "define stack ID (required)", 0);
+    psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-uri", 0,            "define URI of file", 0);
+    psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", 0);
+    psMetadataAddF64(addsumskyfileArgs, PS_LIST_TAIL, "-bg",  0,            "define exposue background", NAN);
+    psMetadataAddF64(addsumskyfileArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposue background mean stdev", NAN);
+    psMetadataAddF32(addsumskyfileArgs, PS_LIST_TAIL, "-dtime_stack",  0,            "define elapsed processing time", NAN);
+    psMetadataAddStr(addsumskyfileArgs, PS_LIST_TAIL, "-hostname", 0,            "define hostname", 0);
+    psMetadataAddF32(addsumskyfileArgs, PS_LIST_TAIL, "-good_frac",  0,            "define %% of good pixels", NAN);
+    psMetadataAddS16(addsumskyfileArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
 
     // -sumskyfile
     psMetadata *sumskyfileArgs= psMetadataAlloc();
-    psMetadataAddS64(sumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID", 0);
-    psMetadataAddS64(sumskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", 0);
-    psMetadataAddU64(sumskyfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(sumskyfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(sumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,            "search by stack ID", 0);
+    psMetadataAddS64(sumskyfileArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warp ID", 0);
+    psMetadataAddU64(sumskyfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(sumskyfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertsumskyfile
     psMetadata *revertsumskyfileArgs= psMetadataAlloc();
-    psMetadataAddS64(revertsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,
-            "search by stack ID (required)", 0);
-    psMetadataAddS16(revertsumskyfileArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
+    psMetadataAddS64(revertsumskyfileArgs, PS_LIST_TAIL, "-stack_id", 0,            "search by stack ID (required)", 0);
+    psMetadataAddS16(revertsumskyfileArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
 
     psFree(now);
@@ -204,6 +136,5 @@
     psMetadata *modes   = psMetadataAlloc();
 
-    PXOPT_ADD_MODE("-definebyquery", "Define a new stackRun by searching for warp IDs",
-        STACKTOOL_MODE_DEFINEBYQUERY,  definebyqueryArgs);
+    PXOPT_ADD_MODE("-definebyquery", "Define a new stackRun by searching for warp IDs", STACKTOOL_MODE_DEFINEBYQUERY,  definebyqueryArgs);
     PXOPT_ADD_MODE("-definerun",       "", STACKTOOL_MODE_DEFINERUN,      definerunArgs);
     PXOPT_ADD_MODE("-updaterun",       "", STACKTOOL_MODE_UPDATERUN,      updaterunArgs);
@@ -226,80 +157,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereS32(name) \
-{ \
-    psS32 s32 = 0; \
-    bool status = false; \
-    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-{
-    psString str = NULL;
-    bool status = false;
-    if ((str = psMetadataLookupStr(&status, config->args, "-warp_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "warp_id", 0, "==", (psS64)atoll(str))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-
-{
-    psString str = NULL;
-    bool status = false;
-    if ((str = psMetadataLookupStr(&status, config->args, "-stack_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "stack_id", 0, "==", (psS64)atoll(str))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item stack_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-
-    addWhereStr(skycell_id);
-    addWhereStr(tess_id);
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
Index: trunk/ippTools/src/warptool.c
===================================================================
--- trunk/ippTools/src/warptool.c	(revision 18531)
+++ trunk/ippTools/src/warptool.c	(revision 18561)
@@ -109,25 +109,21 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required options
-    PXOPT_LOOKUP_S64(fake_id, config->args, "-fake_id", true, false);
-    PXOPT_LOOKUP_STR(mode, config->args, "-mode", true, false);
-    // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
-
-    // optional
+    
+    PXOPT_LOOKUP_S64(fake_id, config->args, "-fake_id", true, false); // required 
+    PXOPT_LOOKUP_STR(mode, config->args, "-mode", true, false); // required 
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false); // required 
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
     PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", false, false);
     PXOPT_LOOKUP_STR(end_stage, config->args, "-end_stage", false, false);
-
-    // default
     PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
     PXOPT_LOOKUP_BOOL(magiced, config->args, "-magiced", false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    // check mode
+    if (mode && !isValidMode(config, mode)) {
+        psError(PS_ERR_UNKNOWN, false, "invalid mode");
+        return false;
+    }
 
     warpRunRow *warpRun = warpRunRowAlloc(
@@ -190,7 +186,6 @@
     PXOPT_COPY_STR(config->args, where, "-reduction", "reduction", "==");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
-
-    PXOPT_COPY_F64(config->args, where, "-airmass_min", "airmass", ">=");
-    PXOPT_COPY_F64(config->args, where, "-airmass_max", "airmass", "<");
+    PXOPT_COPY_F32(config->args, where, "-airmass_min", "airmass", ">=");
+    PXOPT_COPY_F32(config->args, where, "-airmass_max", "airmass", "<");
     PXOPT_COPY_F64(config->args, where, "-ra_min", "ra", ">=");
     PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
@@ -211,6 +206,6 @@
     PXOPT_COPY_F64(config->args, where, "-az_min", "az", ">=");
     PXOPT_COPY_F64(config->args, where, "-az_max", "az", "<");
-    PXOPT_COPY_F32(config->args, where, "-ccd_temp_min", "ccd_temp", ">=");
-    PXOPT_COPY_F32(config->args, where, "-ccd_temp_max", "ccd_temp", "<");
+    PXOPT_COPY_F64(config->args, where, "-ccd_temp_min", "ccd_temp", ">=");
+    PXOPT_COPY_F64(config->args, where, "-ccd_temp_max", "ccd_temp", "<");
     PXOPT_COPY_F64(config->args, where, "-posang_min", "posang", ">=");
     PXOPT_COPY_F64(config->args, where, "-posang_max", "posang", "<");
@@ -262,4 +257,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -272,9 +271,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpRun");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "warpRun");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -331,4 +331,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -341,9 +345,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpRun");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "warpRun");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -400,4 +405,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -410,9 +418,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpRun");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "warpRun");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -571,4 +580,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-tess_id", "tess_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -581,9 +595,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpSkyCellMap");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "warpSkyCellMap");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -635,8 +650,10 @@
 }
 
-
 static bool towarpedMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
 
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
@@ -650,9 +667,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpSkyCellMap");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "warpSkyCellMap");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -891,4 +909,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id",    "warp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-tess_id",    "tess_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id",     "exp_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-fake_id",    "fake_id", "==");
+
     PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -901,9 +926,10 @@
     }
 
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpSkyfile");
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, "warpSkyfile");
         psStringAppend(&query, " AND %s", whereClause);
         psFree(whereClause);
     }
+    psFree(where);
 
     // treat limit == 0 as "no limit"
@@ -962,9 +988,9 @@
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-tess_id", "tess_id", "==");
     PXOPT_COPY_S64(config->args, where, "-fake_id", "fake_id", "==");
     PXOPT_COPY_S64(config->args, where, "-chip_id", "chip_id", "==");
     PXOPT_COPY_S64(config->args, where, "-exp_id", "exp_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-skycell_id", "skycell_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-tess_id", "tess_id", "==");
 
     // XXX These may need to be updated with the table name?
@@ -980,6 +1006,6 @@
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
 
-    PXOPT_COPY_F64(config->args, where, "-airmass_min", "airmass", ">=");
-    PXOPT_COPY_F64(config->args, where, "-airmass_max", "airmass", "<");
+    PXOPT_COPY_F32(config->args, where, "-airmass_min", "airmass", ">=");
+    PXOPT_COPY_F32(config->args, where, "-airmass_max", "airmass", "<");
     PXOPT_COPY_F64(config->args, where, "-ra_min", "ra", ">=");
     PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
@@ -1000,6 +1026,6 @@
     PXOPT_COPY_F64(config->args, where, "-az_min", "az", ">=");
     PXOPT_COPY_F64(config->args, where, "-az_max", "az", "<");
-    PXOPT_COPY_F32(config->args, where, "-ccd_temp_min", "ccd_temp", ">=");
-    PXOPT_COPY_F32(config->args, where, "-ccd_temp_max", "ccd_temp", "<");
+    PXOPT_COPY_F64(config->args, where, "-ccd_temp_min", "ccd_temp", ">=");
+    PXOPT_COPY_F64(config->args, where, "-ccd_temp_max", "ccd_temp", "<");
     PXOPT_COPY_F64(config->args, where, "-posang_min", "posang", ">=");
     PXOPT_COPY_F64(config->args, where, "-posang_max", "posang", "<");
@@ -1007,5 +1033,5 @@
     PXOPT_COPY_F32(config->args, where, "-solang_min", "solang", ">=");
     PXOPT_COPY_F32(config->args, where, "-solang_max", "solang", "<");
-//    PXOPT_COPY_S16(config->args, where, "-code", "fault", "==");
+    PXOPT_COPY_S16(config->args, where, "-code", "fault", "==");
 
     if (!psListLength(where->list)
Index: trunk/ippTools/src/warptoolConfig.c
===================================================================
--- trunk/ippTools/src/warptoolConfig.c	(revision 18531)
+++ trunk/ippTools/src/warptoolConfig.c	(revision 18561)
@@ -49,353 +49,205 @@
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "define camtool ID (required)", 0);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-mode", 0,
-            "define mode (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", 0,
-            "define label", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-dvodb", 0,
-            "define dvodb", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id", 0,
-            "define tess_id", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-end_stage", 0,
-            "define end stage", NULL);
-    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-magiced",  0,
-            "has this exposure been magiced", false);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-fake_id", 0,            "define camtool ID (required)", 0);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-mode", 0,            "define mode (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", 0,            "define label", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-dvodb", 0,            "define dvodb", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id", 0,            "define tess_id", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-end_stage", 0,            "define end stage", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-magiced",  0,            "has this exposure been magiced", false);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -updaterun
+    // XXX need to allow multiple fake_ids
+    // XXX need to allow multiple fake_ids
+    // XXX need to allow multiple chip_ids
+    // XXX need to allow multiple exp_ids
     psMetadata *updaterunArgs = psMetadataAlloc();
-    // XXX need to allow multiple fake_ids
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", 0);
-    // XXX need to allow multiple fake_ids
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "search by fake_id", 0);
-    // XXX need to allow multiple chip_ids
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", 0);
-    // XXX need to allow multiple exp_ids
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", 0);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",  0,
-            "search by exp_name", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-inst",  0,
-            "search for camera", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_begin", 0,
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_tag",  0,
-            "search by exp_tag", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "search by exp_type", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "search by filelevel", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-reduction",  0,
-            "search by reduction class", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filter",  0,
-            "search for filter", NULL);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,
-            "define min fraction of saturated pixels", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-object",  0,
-            "search by exposure object", NULL);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-
-    psMetadataAddBool(updaterunArgs, PS_LIST_TAIL, "-all",  0,
-            "allow everything to be queued without search terms", false);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,
-            "set state", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label", 0,
-            "set label", NULL);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warptool ID", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-fake_id",  0,            "search by fake_id", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chip_id", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_name",  0,            "search by exp_name", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-inst",  0,            "search for camera", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-telescope",  0,            "search for telescope", NULL);
+    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_begin", 0,            "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-dateobs_end", 0,            "search for exposures by time (<)", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_tag",  0,            "search by exp_tag", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-exp_type",  0,            "search by exp_type", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filelevel",  0,            "search by filelevel", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-reduction",  0,            "search by reduction class", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-filter",  0,            "search for filter", NULL);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_min",  0,            "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ra_max",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_min",  0,            "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-decl_max",  0,            "define max", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_min",  0,            "define min", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-exp_time_max",  0,            "define max", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,            "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,            "define min fraction of saturated pixels", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_min",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_max",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_min",  0,            "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-alt_max",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_min",  0,            "define min", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-az_max",  0,            "define max", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(updaterunArgs, PS_LIST_TAIL, "-posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-object",  0,            "search by exposure object", NULL);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF32(updaterunArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
+
+    psMetadataAddBool(updaterunArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "set state", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label", 0,            "set label", NULL);
+
 #if 0
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-workdir", 0,
-            "define workdir (required)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-registered",  0,
-            "time detrend run was registered", now);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
 #endif
 
     // -exp
     psMetadata *expArgs = psMetadataAlloc();
-    psMetadataAddS64(expArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", 0);
-    psMetadataAddS64(expArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "search by camtool ID", 0);
-    psMetadataAddU64(expArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(expArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(expArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warptool ID", 0);
+    psMetadataAddS64(expArgs, PS_LIST_TAIL, "-fake_id", 0,            "search by camtool ID", 0);
+    psMetadataAddU64(expArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(expArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -imfile
     psMetadata *imfileArgs = psMetadataAlloc();
-    psMetadataAddS64(imfileArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", 0);
-    psMetadataAddS64(imfileArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "search by camtool ID", 0);
-    psMetadataAddU64(imfileArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(imfileArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(imfileArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warptool ID", 0);
+    psMetadataAddS64(imfileArgs, PS_LIST_TAIL, "-fake_id", 0,            "search by camtool ID", 0);
+    psMetadataAddU64(imfileArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(imfileArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -tooverlap
     psMetadata *tooverlapArgs = psMetadataAlloc();
-    psMetadataAddS64(tooverlapArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warp ID", 0);
-    psMetadataAddU64(tooverlapArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(tooverlapArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(tooverlapArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warp ID", 0);
+    psMetadataAddU64(tooverlapArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(tooverlapArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addoverlap
     psMetadata *addoverlapArgs = psMetadataAlloc();
-    psMetadataAddStr(addoverlapArgs, PS_LIST_TAIL, "-mapfile", 0,
-            "path to skycell <-> imfile mapping file", NULL);
-    psMetadataAddS64(addoverlapArgs, PS_LIST_TAIL, "-warp_id",  0,
-            "set warp ID", 0);
-    psMetadataAddS16(addoverlapArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddStr(addoverlapArgs, PS_LIST_TAIL, "-mapfile", 0,            "path to skycell <-> imfile mapping file", NULL);
+    psMetadataAddS64(addoverlapArgs, PS_LIST_TAIL, "-warp_id",  0,            "set warp ID", 0);
+    psMetadataAddS16(addoverlapArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
 
     // -scmap
     psMetadata *scmapArgs = psMetadataAlloc();
-    psMetadataAddS64(scmapArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", 0);
-    psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-skycell_id", 0,
-            "search by skycell ID", NULL);
-    psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-tess_id", 0,
-            "search by tess ID", NULL);
-    psMetadataAddU64(scmapArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(scmapArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(scmapArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warptool ID", 0);
+    psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-skycell_id", 0,            "search by skycell ID", NULL);
+    psMetadataAddStr(scmapArgs, PS_LIST_TAIL, "-tess_id", 0,            "search by tess ID", NULL);
+    psMetadataAddU64(scmapArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(scmapArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -towarped
     psMetadata *towarpedArgs = psMetadataAlloc();
-    psMetadataAddS64(towarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", 0);
-    psMetadataAddU64(towarpedArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(towarpedArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(towarpedArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warptool ID", 0);
+    psMetadataAddU64(towarpedArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(towarpedArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -addwarped
     psMetadata *addwarpedArgs = psMetadataAlloc();
-    psMetadataAddS64(addwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "define warptool ID (required)", 0);
-    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-skycell_id",  0,
-            "define skycell ID (required)", NULL);
-    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "define tessellation ID (required)", NULL);
-    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-uri", 0,
-            "define URI of file", 0);
-    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-path_base", 0,
-            "define base output location", 0);
-    psMetadataAddF64(addwarpedArgs, PS_LIST_TAIL, "-bg",  0,
-            "define exposure background", NAN);
-    psMetadataAddF64(addwarpedArgs, PS_LIST_TAIL, "-bg_stdev",  0,
-            "define exposure background stdev", NAN);
-    psMetadataAddF32(addwarpedArgs, PS_LIST_TAIL, "-dtime_warp",  0,
-            "define elapsed processing time", NAN);
-    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-xmin",  0,
-            "define minimum x value", INT_MAX);
-    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-xmax",  0,
-            "define maximum x value", -INT_MAX);
-    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-ymin",  0,
-            "define minimum y value", INT_MAX);
-    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-ymax",  0,
-            "define maximum y value", -INT_MAX);
-    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-hostname", 0,
-            "define hostname", 0);
-    psMetadataAddF32(addwarpedArgs, PS_LIST_TAIL, "-good_frac",  0,
-            "define %% of good pixels", NAN);
-    psMetadataAddBool(addwarpedArgs, PS_LIST_TAIL, "-ignore",  0,
-            "define if this skycell should be ignored", false);
-    psMetadataAddS16(addwarpedArgs, PS_LIST_TAIL, "-code",  0,
-            "set fault code", 0);
+    psMetadataAddS64(addwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,            "define warptool ID (required)", 0);
+    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-skycell_id",  0,            "define skycell ID (required)", NULL);
+    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID (required)", NULL);
+    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-uri", 0,            "define URI of file", 0);
+    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-path_base", 0,            "define base output location", 0);
+    psMetadataAddF64(addwarpedArgs, PS_LIST_TAIL, "-bg",  0,            "define exposure background", NAN);
+    psMetadataAddF64(addwarpedArgs, PS_LIST_TAIL, "-bg_stdev",  0,            "define exposure background stdev", NAN);
+    psMetadataAddF32(addwarpedArgs, PS_LIST_TAIL, "-dtime_warp",  0,            "define elapsed processing time", NAN);
+    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-xmin",  0,            "define minimum x value", INT_MAX);
+    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-xmax",  0,            "define maximum x value", -INT_MAX);
+    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-ymin",  0,            "define minimum y value", INT_MAX);
+    psMetadataAddS32(addwarpedArgs, PS_LIST_TAIL, "-ymax",  0,            "define maximum y value", -INT_MAX);
+    psMetadataAddStr(addwarpedArgs, PS_LIST_TAIL, "-hostname", 0,            "define hostname", 0);
+    psMetadataAddF32(addwarpedArgs, PS_LIST_TAIL, "-good_frac",  0,            "define %% of good pixels", NAN);
+    psMetadataAddBool(addwarpedArgs, PS_LIST_TAIL, "-ignore",  0,            "define if this skycell should be ignored", false);
+    psMetadataAddS16(addwarpedArgs, PS_LIST_TAIL, "-code",  0,            "set fault code", 0);
 
     // -warped
     psMetadata *warpedArgs = psMetadataAlloc();
-    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", 0);
-    psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-skycell_id",  0,
-            "define skycell ID", NULL);
-    psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "define tessellation ID", NULL);
-    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-exp_id", 0,
-            "define exposure tag", 0);
-    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-fake_id", 0,
-            "define phase 3 version of exposure tag", 0);
-    psMetadataAddU64(warpedArgs, PS_LIST_TAIL, "-limit",  0,
-            "limit result set to N items", 0);
-    psMetadataAddBool(warpedArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warptool ID", 0);
+    psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-skycell_id",  0,            "define skycell ID", NULL);
+    psMetadataAddStr(warpedArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID", NULL);
+    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-exp_id", 0,            "define exposure tag", 0);
+    psMetadataAddS64(warpedArgs, PS_LIST_TAIL, "-fake_id", 0,            "define phase 3 version of exposure tag", 0);
+    psMetadataAddU64(warpedArgs, PS_LIST_TAIL, "-limit",  0,            "limit result set to N items", 0);
+    psMetadataAddBool(warpedArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -revertwarped
+    // XXX need to allow multiple fake_ids
+    // XXX need to allow multiple fake_ids
+    // XXX need to allow multiple chip_ids
+    // XXX need to allow multiple exp_ids
     psMetadata *revertwarpedArgs = psMetadataAlloc();
-    // XXX need to allow multiple fake_ids
-    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,
-            "search by warptool ID", 0);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-skycell_id",  0,
-            "search by skycell ID", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-tess_id",  0,
-            "searcy by tessellation ID", NULL);
-    // XXX need to allow multiple fake_ids
-    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-fake_id",  0,
-            "search by fake_id", 0);
-    // XXX need to allow multiple chip_ids
-    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-chip_id",  0,
-            "search by chip_id", 0);
-    // XXX need to allow multiple exp_ids
-    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-exp_id",  0,
-            "search by exp_id", 0);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_name",  0,
-            "search by exp_name", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-inst",  0,
-            "search for camera", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-telescope",  0,
-            "search for telescope", NULL);
-    psMetadataAddTime(revertwarpedArgs, PS_LIST_TAIL, "-dateobs_begin", 0,
-            "search for exposures by time (>=)", NULL);
-    psMetadataAddTime(revertwarpedArgs, PS_LIST_TAIL, "-dateobs_end", 0,
-            "search for exposures by time (<)", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_tag",  0,
-            "search by exp_tag", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_type",  0,
-            "search by exp_type", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-filelevel",  0,
-            "search by filelevel", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-reduction",  0,
-            "search by reduction class", NULL);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-filter",  0,
-            "search for filter", NULL);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-airmass_min",  0,
-            "define min airmass", NAN);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-airmass_max",  0,
-            "define max airmass", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ra_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ra_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-decl_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-decl_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-exp_time_min",  0,
-            "define min", NAN);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-exp_time_max",  0,
-            "define max", NAN);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,
-            "define max fraction of saturated pixels", NAN);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,
-            "define min fraction of saturated pixels", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-alt_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-alt_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-az_min",  0,
-            "define min", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-az_max",  0,
-            "define max", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,
-            "define min ccd tempature", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,
-            "define max ccd tempature", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-posang_min",  0,
-            "define min rotator position angle", NAN);
-    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-posang_max",  0,
-            "define max rotator position angle", NAN);
-    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-object",  0,
-            "search by exposure object", NULL);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-solang_min",  0,
-            "define min solar angle", NAN);
-    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-solang_max",  0,
-            "define max solar angle", NAN);
-
-    psMetadataAddS16(revertwarpedArgs, PS_LIST_TAIL, "-code",  0,
-            "search by fault code", 0);
-    psMetadataAddBool(revertwarpedArgs, PS_LIST_TAIL, "-all",  0,
-            "allow everything to be queued without search terms", false);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-warp_id", 0,            "search by warptool ID", 0);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-skycell_id",  0,            "search by skycell ID", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-tess_id",  0,            "searcy by tessellation ID", NULL);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-fake_id",  0,            "search by fake_id", 0);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-chip_id",  0,            "search by chip_id", 0);
+    psMetadataAddS64(revertwarpedArgs, PS_LIST_TAIL, "-exp_id",  0,            "search by exp_id", 0);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_name",  0,            "search by exp_name", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-inst",  0,            "search for camera", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-telescope",  0,            "search for telescope", NULL);
+    psMetadataAddTime(revertwarpedArgs, PS_LIST_TAIL, "-dateobs_begin", 0,            "search for exposures by time (>=)", NULL);
+    psMetadataAddTime(revertwarpedArgs, PS_LIST_TAIL, "-dateobs_end", 0,            "search for exposures by time (<)", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_tag",  0,            "search by exp_tag", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-exp_type",  0,            "search by exp_type", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-filelevel",  0,            "search by filelevel", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-reduction",  0,            "search by reduction class", NULL);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-filter",  0,            "search for filter", NULL);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-airmass_min",  0,            "define min airmass", NAN);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-airmass_max",  0,            "define max airmass", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ra_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ra_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-decl_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-decl_max",  0,            "define max", NAN);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-exp_time_min",  0,            "define min", NAN);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-exp_time_max",  0,            "define max", NAN);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-sat_pixel_frac_min",  0,            "define max fraction of saturated pixels", NAN);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-sat_pixel_frac_max",  0,            "define min fraction of saturated pixels", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_min",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_mean_stdev_min",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-bg_mean_stdev_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-alt_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-alt_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-az_min",  0,            "define min", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-az_max",  0,            "define max", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ccd_temp_min",  0,            "define min ccd tempature", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-ccd_temp_max",  0,            "define max ccd tempature", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-posang_min",  0,            "define min rotator position angle", NAN);
+    psMetadataAddF64(revertwarpedArgs, PS_LIST_TAIL, "-posang_max",  0,            "define max rotator position angle", NAN);
+    psMetadataAddStr(revertwarpedArgs, PS_LIST_TAIL, "-object",  0,            "search by exposure object", NULL);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-solang_min",  0,            "define min solar angle", NAN);
+    psMetadataAddF32(revertwarpedArgs, PS_LIST_TAIL, "-solang_max",  0,            "define max solar angle", NAN);
+
+    psMetadataAddS16(revertwarpedArgs, PS_LIST_TAIL, "-code",  0,            "search by fault code", 0);
+    psMetadataAddBool(revertwarpedArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
 
     // -block
     psMetadata *blockArgs = psMetadataAlloc();
-    psMetadataAddStr(blockArgs, PS_LIST_TAIL, "-label",  0,
-            "name of a label to mask out (required)", NULL);
+    psMetadataAddStr(blockArgs, PS_LIST_TAIL, "-label",  0,            "name of a label to mask out (required)", NULL);
 
     // -masked
     psMetadata *maskedArgs = psMetadataAlloc();
-    psMetadataAddBool(maskedArgs, PS_LIST_TAIL, "-simple",  0,
-            "use the simple output format", false);
+    psMetadataAddBool(maskedArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
     // -unblock
     psMetadata *unblockArgs = psMetadataAlloc();
-    psMetadataAddStr(unblockArgs, PS_LIST_TAIL, "-label",  0,
-            "name of a label to unmask (required)", NULL);
+    psMetadataAddStr(unblockArgs, PS_LIST_TAIL, "-label",  0,            "name of a label to unmask (required)", NULL);
 
     psFree(now);
@@ -429,68 +281,4 @@
     psFree(modes);
 
-    // setup search criterion
-#define addWhereStr(name) \
-{ \
-    psString str = NULL; \
-    bool status = false; \
-    if ((str = psMetadataLookupStr(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddStr(config->where, PS_LIST_TAIL, #name, 0, "==", str)) {\
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-#define addWhereS32(name) \
-{ \
-    psS32 s32 = 0; \
-    bool status = false; \
-    if ((s32= psMetadataLookupS32(&status, config->args, "-" #name))) { \
-        if (!psMetadataAddS32(config->where, PS_LIST_TAIL, #name, 0, "==", s32)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " #name); \
-            psFree(config); \
-            return NULL; \
-        } \
-    } \
-}
-
-
-    // generate SQL where clause
-    config->where = psMetadataAlloc();
-
-{
-    psS64 warp_id = -1;
-    bool status = false;
-    if ((warp_id = psMetadataLookupS64(&status, config->args, "-warp_id"))) {
-        if (!psMetadataAddS64(config->where, PS_LIST_TAIL, "warp_id", 0, "==", warp_id)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");
-            psFree(config);
-            return NULL;
-        }
-    }
-}
-    addWhereStr(skycell_id);
-    addWhereStr(tess_id);
-    addWhereStr(exp_id);
-
-    // convert '-code' to 'fault'
-    {
-        psS16 fault = 0;
-        bool status = false;
-        if ((fault = psMetadataLookupS16(&status, config->args, "-code"))) {
-            if (!psMetadataAddS16(config->where, PS_LIST_TAIL, "fault", 0, "==", fault)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item fault");
-                psFree(config);
-                return NULL;
-            }
-        }
-    }
-
-    if (config->where->list->n < 1) {
-        psFree(config->where);
-        config->where = NULL;
-    }
-
     // define Database handle, if used
     // do this last so we don't setup a connection before CLI options are
