Index: /trunk/ippTools/scripts/dettest.sh
===================================================================
--- /trunk/ippTools/scripts/dettest.sh	(revision 16169)
+++ /trunk/ippTools/scripts/dettest.sh	(revision 16170)
@@ -14,9 +14,9 @@
 
 for ID in `seq 0 3` ; do
-    dettool -addprocessedimfile -det_id $det_id -exp_id 1 -class_id $ID -uri file://proc-$ID -recip myrecip -bg 1 -bg_stdev 1 -bg_mean_stdev 1 || exit 1
+    dettool -addprocessedimfile -det_id 1 -exp_id 1 -class_id $ID -uri file://proc-$ID -recip myrecip -bg 2 -bg_stdev 3 -bg_mean_stdev 4 || exit 1
 done;
 
 for ID in `seq 0 3` ; do
-    dettool -addprocessedimfile -det_id $det_id -exp_id 2 -class_id $ID -uri file://proc-$ID -recip myrecip -bg 1 -bg_stdev 1 -bg_mean_stdev 1 || exit 1
+    dettool -addprocessedimfile -det_id 1 -exp_id 2 -class_id $ID -uri file://proc-$ID -recip myrecip -bg 2 -bg_stdev 3 -bg_mean_stdev 4 || exit 1
 done;
 
Index: /trunk/ippTools/share/camtool_queue_chip_id.sql
===================================================================
--- /trunk/ippTools/share/camtool_queue_chip_id.sql	(revision 16169)
+++ /trunk/ippTools/share/camtool_queue_chip_id.sql	(revision 16170)
@@ -11,5 +11,7 @@
         '%s',           -- reduction
         '%s',           -- expgroup
-        '%s'            -- dvodb 
+        '%s',           -- dvodb 
+        '%s',           -- tess_id
+        '%s'            -- end_stage
     FROM chipRun
     WHERE
Index: /trunk/ippTools/share/chiptool_completely_processed_exp.sql
===================================================================
--- /trunk/ippTools/share/chiptool_completely_processed_exp.sql	(revision 16169)
+++ /trunk/ippTools/share/chiptool_completely_processed_exp.sql	(revision 16170)
@@ -9,5 +9,7 @@
     reduction,
     expgroup,
-    dvodb
+    dvodb,
+    tess_id,
+    end_stage
 FROM
     (SELECT 
Index: /trunk/ippTools/share/regtool_pendingexp.sql
===================================================================
--- /trunk/ippTools/share/regtool_pendingexp.sql	(revision 16169)
+++ /trunk/ippTools/share/regtool_pendingexp.sql	(revision 16170)
@@ -8,5 +8,8 @@
     workdir,
     workdir_state,
-    reduction
+    reduction,
+    dvodb,
+    tess_id,
+    end_stage
 FROM
     (SELECT
Index: /trunk/ippTools/src/caltool.c
===================================================================
--- /trunk/ippTools/src/caltool.c	(revision 16169)
+++ /trunk/ippTools/src/caltool.c	(revision 16170)
@@ -85,15 +85,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    bool status = false;
-    psString dvodb = psMetadataLookupStr(&status, config->args, "-dvodb");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -dvodb");
-        return false;
-    }
-    if (!dvodb) {
-        psError(PS_ERR_UNKNOWN, true, "-dvodb is required");
-        return false;
-    }
+    // required 
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", true, false);
 
     if (!calDBInsert(config->dbh,
@@ -115,10 +106,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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 = psStringCopy("SELECT * FROM calDB");
@@ -164,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -199,45 +176,9 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    bool status = false;
-    psString cal_id = psMetadataLookupStr(&status, config->args, "-cal_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -cal_id");
-        return false;
-    }
-    if (!cal_id) {
-        psError(PS_ERR_UNKNOWN, true, "-cal_id is required");
-        return false;
-    }
-
-    psString region = psMetadataLookupStr(&status, config->args, "-region");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -region");
-        return false;
-    }
-    if (!region) {
-        psError(PS_ERR_UNKNOWN, true, "-region is required");
-        return false;
-    }
-
-    psString last_step = psMetadataLookupStr(&status, config->args, "-last_step");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -last_step");
-        return false;
-    }
-    if (!last_step) {
-        psError(PS_ERR_UNKNOWN, true, "-last_step 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;
-    }
+    // required
+    PXOPT_LOOKUP_STR(cal_id, config->args, "-cal_id", true, false);
+    PXOPT_LOOKUP_STR(region, config->args, "-region", true, false);
+    PXOPT_LOOKUP_STR(last_step, config->args, "-last_step", true, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
     if (!calRunInsert(config->dbh,
@@ -260,10 +201,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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 = psStringCopy("SELECT * FROM calRun");
@@ -309,14 +246,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
Index: /trunk/ippTools/src/caltoolConfig.c
===================================================================
--- /trunk/ippTools/src/caltoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/caltoolConfig.c	(revision 16170)
@@ -86,11 +86,11 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-adddb",   "add a DVO calibration DB",
+    PXOPT_ADD_MODE("-adddb",   "add a DVO calibration DB",
         CALTOOL_MODE_ADDDB,     adddbArgs);
-    PXTOOL_ADD_MODE("-dbs",     "list DVO calibration DBs",
+    PXOPT_ADD_MODE("-dbs",     "list DVO calibration DBs",
         CALTOOL_MODE_DBS,       dbsArgs);
-    PXTOOL_ADD_MODE("-addrun",  "add the results of a calibration run",
+    PXOPT_ADD_MODE("-addrun",  "add the results of a calibration run",
         CALTOOL_MODE_ADDRUN,    addrunArgs);
-    PXTOOL_ADD_MODE("-runs",    "list the results of calibration runs",
+    PXOPT_ADD_MODE("-runs",    "list the results of calibration runs",
         CALTOOL_MODE_RUNS,      runsArgs);
 
Index: /trunk/ippTools/src/camtool.c
===================================================================
--- /trunk/ippTools/src/camtool.c	(revision 16169)
+++ /trunk/ippTools/src/camtool.c	(revision 16170)
@@ -89,59 +89,16 @@
 }
 
-#define ADDRENAMEPARAMSTR(from, to, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    psString str = psMetadataLookupStr(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (str) { \
-        if (!psMetadataAddStr(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, str)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMSTR(from, to, name) \
-  ADDRENAMEPARAMSTR(from, to, name, name, "==")
-
-#define ADDRENAMEPARAMF(from, to, type, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    ps##type var = psMetadataLookup##type(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (!isnan(var)) { \
-        if (!psMetadataAdd##type(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMF(from, to, type, name) \
-  ADDRENAMEPARAMF(from, to, type, name, name, "==")
 
 static bool queueMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, NULL);
+
+    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", false, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
 
     psMetadata *where = psMetadataAlloc();
     // convert chip_id into a psS64
-{
-    bool status = false;
-    psString var = psMetadataLookupStr(&status, config->args, "-chip_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -chip_id");
-        return false;
-    }
-    if (var) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(var))) {
+    if (chip_id) {
+        if (!psMetadataAddS64(where, PS_LIST_TAIL, "chip_id", 0, "==", (psS64)atoll(chip_id))) {
             psError(PS_ERR_UNKNOWN, false, "failed to add item chip_id");
             psFree(where);
@@ -149,15 +106,8 @@
         }
     }
-}
+ 
     // convert exp_id into a psS64
-{
-    bool status = false;
-    psString var = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (var) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(var))) {
+    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);
@@ -165,42 +115,43 @@
         }
     }
-}
-    ADDPARAMSTR(config->args, where, "exp_name");
-    ADDRENAMEPARAMSTR(config->args, where, "inst", "camera", "==");
-    ADDPARAMSTR(config->args, where, "telescope");
-    ADDPARAMSTR(config->args, where, "dateobs_begin");
-    ADDPARAMSTR(config->args, where, "dateobs_end");
-    ADDPARAMSTR(config->args, where, "exp_tag");
-    ADDPARAMSTR(config->args, where, "exp_type");
-    ADDPARAMSTR(config->args, where, "filelevel");
-    ADDPARAMSTR(config->args, where, "reduction");
-    ADDPARAMSTR(config->args, where, "filter");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_min", "airmass", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_max", "airmass", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_min", "ra", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_max", "ra", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_min", "decl", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_max", "decl", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_min", "exp_time", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_max", "exp_time", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_min", "sat_pixel_frac", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_max", "sat_pixel_frac", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_min", "bt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_max", "bt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_min", "bg_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_max", "bg_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_min", "bg_mean_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_max", "bg_mean_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_min", "alt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_max", "alt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_min", "az", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_max", "az", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_min", "ccd_temp", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_max", "ccd_temp", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_min", "posang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_max", "posang", "<");
-    ADDPARAMSTR(config->args, where, "object");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_min", "solang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_max", "solang", "<");
+
+    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_TIME(config->args, where, "-dateobs_begin", "dateobs", ">=");
+    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", "filelevel", "==");
+    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_F64(config->args, where, "-ra_min", "ra", ">=");
+    PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
+    PXOPT_COPY_F64(config->args, where, "-decl_min", "decl", ">=");
+    PXOPT_COPY_F64(config->args, where, "-decl_max", "decl", "<");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_min", "exp_time", ">=");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_max", "exp_time", "<");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_min", "sat_pixel_frac", ">=");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_max", "sat_pixel_frac", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_min", "bt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_max", "bt", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_min", "bg_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_max", "bg_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_min", "bg_mean_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_max", "bg_mean_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-alt_min", "alt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-alt_max", "alt", "<");
+    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, "-posang_min", "posang", ">=");
+    PXOPT_COPY_F64(config->args, where, "-posang_max", "posang", "<");
+    PXOPT_COPY_STR(config->args, where, "-object", "object", "==");
+    PXOPT_COPY_F32(config->args, where, "-solang_min", "solang", ">=");
+    PXOPT_COPY_F32(config->args, where, "-solang_max", "solang", "<");
 
     if (where->list->n < 1) {
@@ -209,34 +160,11 @@
     }
 
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-set_workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_workdir");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-set_label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_label");
-        return false;
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-set_reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_reduction");
-        return false;
-    }
-
-    psString expgroup = psMetadataLookupStr(&status, config->args, "-set_expgroup");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_expgroup");
-        return false;
-    }
-
-    psString dvodb = psMetadataLookupStr(&status, config->args, "-set_dvodb");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_dvodb");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", true, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", true, false);
+    PXOPT_LOOKUP_STR(expgroup, config->args, "-set_expgroup", true, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", true, false);
+    PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", true, false);
+    PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", true, false);
 
     // find the exp_id of all the exposures that we want to queue up.
@@ -303,5 +231,7 @@
                     reduction      ? reduction    : row->reduction,
                     expgroup    ? expgroup  : row->expgroup,
-                    dvodb       ? dvodb     : row->dvodb
+                    dvodb       ? dvodb     : row->dvodb,
+                    tess_id     ? tess_id   : row->tess_id,
+                    end_stage   ? end_stage : row->end_stage
         )) {
             if (!psDBRollback(config->dbh)) {
@@ -330,10 +260,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("camtool_find_pendingexp.sql");
@@ -374,14 +300,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;
-        }
-    }
-
     if (!convertIdToStr(output)) {
         psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
@@ -405,4 +321,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = pxDataGet("camtool_find_pendingimfile.sql");
@@ -436,14 +354,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;
-        }
-    }
-
     if (!convertIdToStr(output)) {
         psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
@@ -468,138 +376,30 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString cam_id = psMetadataLookupStr(&status, config->args, "-cam_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -cam_id");
-        return false;
-    }
-    if (!cam_id) {
-        psError(PS_ERR_UNKNOWN, true, "-cam_id 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;
-    }
-
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    psF32 sigma_ra = psMetadataLookupF32(&status, config->args, "-sigma_ra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sigma_ra");
-        return false;
-    }
-    //if (isnan(sigma_ra)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-sigma_ra is required");
-    //  return false;
-    //}
-
-    psF32 sigma_dec = psMetadataLookupF32(&status, config->args, "-sigma_dec");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sigma_dec");
-        return false;
-    }
-    //if (isnan(sigma_dec)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-sigma_dec is required");
-    //  return false;
-    //}
-
-    psF32 zp_mean = psMetadataLookupF32(&status, config->args, "-zp_mean");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -zp_mean");
-        return false;
-    }
-    //if (isnan(zp_mean)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-zp_mean is required");
-    //  return false;
-    //}
-
-    psF32 zp_stdev = psMetadataLookupF32(&status, config->args, "-zp_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -zp_stdev");
-        return false;
-    }
-    //if (isnan(zp_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-zp_stdev is required");
-    //  return false;
-    //}
-
-    psF32 fwhm = psMetadataLookupF32(&status, config->args, "-fwhm");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fwhm");
-        return false;
-    }
-    //if (isnan(fwhm)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-fwhm is required");
-    //  return false;
-    //}
-
-    psF32 fwhm_range = psMetadataLookupF32(&status, config->args, "-fwhm_range");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fwhm_range");
-        return false;
-    }
-    //if (isnan(fwhm_range)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-fwhm_range is required");
-    //  return false;
-    //}
-
-    psS32 n_stars = psMetadataLookupS32(&status, config->args, "-n_stars");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_stars");
-        return false;
-    }
-    if (n_stars < 0) {
-        psError(PS_ERR_UNKNOWN, true, "-n_stars is required");
-        return false;
-    }
-
-    psS32 n_extended = psMetadataLookupS32(&status, config->args, "-n_extended");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_extended");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(cam_id, config->args, "-cam_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+
+    // optional
+    PXOPT_LOOKUP_F32(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F32(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F32(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F32(sigma_ra, config->args, "-sigma_ra", false, false);
+    PXOPT_LOOKUP_F32(sigma_dec, config->args, "-sigma_dec", false, false);
+    PXOPT_LOOKUP_F32(zp_mean, config->args, "-zp_mean", false, false);
+    PXOPT_LOOKUP_F32(zp_stdev, config->args, "-zp_stdev", false, false);
+    PXOPT_LOOKUP_F32(fwhm, config->args, "-fwhm", false, false);
+    PXOPT_LOOKUP_F32(fwhm_range, config->args, "-fwhm_range", 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;
     }
-
-    psS32 n_cr = psMetadataLookupS32(&status, config->args, "-n_cr");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_cr");
-        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;
     }
-
-    psS32 n_astrom = psMetadataLookupS32(&status, config->args, "-n_astrom");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_astrom");
-        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");
@@ -607,17 +407,8 @@
     }
 
-    // optional
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
     // default
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     psString query = pxDataGet("camtool_find_pendingexp.sql");
@@ -674,5 +465,4 @@
     camRunRow *pendingRow = camRunObjectFromMetadata(output->data[0]);
     psFree(output);
-    // create a new camProcessedImfile object
     camProcessedExpRow *row = camProcessedExpRowAlloc(
         pendingRow->cam_id,
@@ -697,5 +487,4 @@
     psFree(pendingRow);
 
-    // insert the new row into the camProcessedImfile table
     if (!camProcessedExpInsertObject(config->dbh, row)) {
         // rollback
@@ -730,16 +519,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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("camtool_find_processedexp.sql");
@@ -788,14 +568,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;
-        }
-    }
-
     if (!convertIdToStr(output)) {
         psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
@@ -853,14 +623,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-    if (code == INT16_MAX) {
-        psError(PS_ERR_UNKNOWN, true, "-code is required");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
     if (!pxSetFaultCode(config->dbh, "camProcessedExp", config->where, code)) {
@@ -877,14 +638,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-    if (!label) {
-        psError(PS_ERR_UNKNOWN, true, "-label is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
 
     if (!camMaskInsert(config->dbh, label)) {
@@ -900,4 +652,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = psStringCopy("SELECT * FROM camMask");
@@ -919,14 +673,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;
-        }
     }
 
@@ -954,14 +698,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-    if (!label) {
-        psError(PS_ERR_UNKNOWN, true, "-label is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
 
     char *query = "DELETE FROM camMask WHERE label = '%s'";
@@ -969,8 +704,7 @@
     if (!p_psDBRunQuery(config->dbh, query, label)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
-
-    return true;
-}
+        return false;
+    }
+
+    return true;
+}
Index: /trunk/ippTools/src/camtoolConfig.c
===================================================================
--- /trunk/ippTools/src/camtoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/camtoolConfig.c	(revision 16170)
@@ -60,7 +60,7 @@
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-telescope",  0,
             "search for telescope", NULL);
-    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-dateobs_begin", 0,
+    psMetadataAddTime(queueArgs, PS_LIST_TAIL, "-dateobs_begin", 0,
             "search for exposures by time (>=)", NULL);
-    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-dateobs_end", 0,
+    psMetadataAddTime(queueArgs, PS_LIST_TAIL, "-dateobs_end", 0,
             "search for exposures by time (<)", NULL);
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-exp_tag",  0,
@@ -138,4 +138,8 @@
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_dvodb",  0,
             "define DVO db", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_tess_id",  0,
+            "define tess ID", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_end_stage",  0,
+            "define end stage", NULL);
 
     // -pendingexp
@@ -257,14 +261,14 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-queue",               "", CAMTOOL_MODE_QUEUE,         queueArgs);
-    PXTOOL_ADD_MODE("-pendingexp",          "", CAMTOOL_MODE_PENDINGEXP,    pendingexpArgs);
-    PXTOOL_ADD_MODE("-pendingimfile",       "", CAMTOOL_MODE_PENDINGIMFILE, pendingimfileArgs);
-    PXTOOL_ADD_MODE("-addprocessedexp",     "", CAMTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
-    PXTOOL_ADD_MODE("-processedexp",        "", CAMTOOL_MODE_PROCESSEDEXP,  processedexpArgs);
-    PXTOOL_ADD_MODE("-revertprocessedexp",  "", CAMTOOL_MODE_REVERTPROCESSEDEXP,  revertprocessedexpArgs);
-    PXTOOL_ADD_MODE("-updateprocessedexp",  "", CAMTOOL_MODE_UPDATEPROCESSEDEXP,updateprocessedexpArgs);
-    PXTOOL_ADD_MODE("-block",               "", CAMTOOL_MODE_BLOCK,         blockArgs);
-    PXTOOL_ADD_MODE("-masked",              "", CAMTOOL_MODE_MASKED,        maskedArgs);
-    PXTOOL_ADD_MODE("-unblock",             "", CAMTOOL_MODE_UNBLOCK,       unblockArgs);
+    PXOPT_ADD_MODE("-queue",               "", CAMTOOL_MODE_QUEUE,         queueArgs);
+    PXOPT_ADD_MODE("-pendingexp",          "", CAMTOOL_MODE_PENDINGEXP,    pendingexpArgs);
+    PXOPT_ADD_MODE("-pendingimfile",       "", CAMTOOL_MODE_PENDINGIMFILE, pendingimfileArgs);
+    PXOPT_ADD_MODE("-addprocessedexp",     "", CAMTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
+    PXOPT_ADD_MODE("-processedexp",        "", CAMTOOL_MODE_PROCESSEDEXP,  processedexpArgs);
+    PXOPT_ADD_MODE("-revertprocessedexp",  "", CAMTOOL_MODE_REVERTPROCESSEDEXP,  revertprocessedexpArgs);
+    PXOPT_ADD_MODE("-updateprocessedexp",  "", CAMTOOL_MODE_UPDATEPROCESSEDEXP,updateprocessedexpArgs);
+    PXOPT_ADD_MODE("-block",               "", CAMTOOL_MODE_BLOCK,         blockArgs);
+    PXOPT_ADD_MODE("-masked",              "", CAMTOOL_MODE_MASKED,        maskedArgs);
+    PXOPT_ADD_MODE("-unblock",             "", CAMTOOL_MODE_UNBLOCK,       unblockArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/chiptool.c
===================================================================
--- /trunk/ippTools/src/chiptool.c	(revision 16169)
+++ /trunk/ippTools/src/chiptool.c	(revision 16170)
@@ -93,59 +93,15 @@
 }
 
-#define ADDRENAMEPARAMSTR(from, to, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    psString str = psMetadataLookupStr(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (str) { \
-        if (!psMetadataAddStr(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, str)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMSTR(from, to, name) \
-  ADDRENAMEPARAMSTR(from, to, name, name, "==")
-
-#define ADDRENAMEPARAMF(from, to, type, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    ps##type var = psMetadataLookup##type(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (!isnan(var)) { \
-        if (!psMetadataAdd##type(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMF(from, to, type, name) \
-  ADDRENAMEPARAMF(from, to, type, name, name, "==")
 
 static bool queueMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, NULL);
+
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", false, false);
 
     psMetadata *where = psMetadataAlloc();
     // convert exp_id into a psS64
-{
-    bool status = false;
-    psString var = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (var) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(var))) {
+    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);
@@ -153,42 +109,42 @@
         }
     }
-}
-    ADDPARAMSTR(config->args, where, "exp_name");
-    ADDRENAMEPARAMSTR(config->args, where, "inst", "camera", "==");
-    ADDPARAMSTR(config->args, where, "telescope");
-    ADDPARAMSTR(config->args, where, "dateobs_begin");
-    ADDPARAMSTR(config->args, where, "dateobs_end");
-    ADDPARAMSTR(config->args, where, "exp_tag");
-    ADDPARAMSTR(config->args, where, "exp_type");
-    ADDPARAMSTR(config->args, where, "filelevel");
-    ADDPARAMSTR(config->args, where, "reduction");
-    ADDPARAMSTR(config->args, where, "filter");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_min", "airmass", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_max", "airmass", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_min", "ra", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_max", "ra", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_min", "decl", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_max", "decl", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_min", "exp_time", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_max", "exp_time", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_min", "sat_pixel_frac", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_max", "sat_pixel_frac", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_min", "bt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_max", "bt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_min", "bg_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_max", "bg_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_min", "bg_mean_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_max", "bg_mean_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_min", "alt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_max", "alt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_min", "az", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_max", "az", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_min", "ccd_temp", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_max", "ccd_temp", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_min", "posang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_max", "posang", "<");
-    ADDPARAMSTR(config->args, where, "object");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_min", "solang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_max", "solang", "<");
+
+    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, "-dateobs_begin", "dateobs", ">=");
+    PXOPT_COPY_STR(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", "filelevel", "==");
+    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_F64(config->args, where, "-ra_min", "ra", ">=");
+    PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
+    PXOPT_COPY_F64(config->args, where, "-decl_min", "decl", ">=");
+    PXOPT_COPY_F64(config->args, where, "-decl_max", "decl", "<");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_min", "exp_time", ">=");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_max", "exp_time", "<");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_min", "sat_pixel_frac", ">=");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_max", "sat_pixel_frac", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_min", "bt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_max", "bt", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_min", "bg_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_max", "bg_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_min", "bg_mean_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_max", "bg_mean_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-alt_min", "alt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-alt_max", "alt", "<");
+    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, "-posang_min", "posang", ">=");
+    PXOPT_COPY_F64(config->args, where, "-posang_max", "posang", "<");
+    PXOPT_COPY_STR(config->args, where, "-object", "object", "==");
+    PXOPT_COPY_F32(config->args, where, "-solang_min", "solang", ">=");
+    PXOPT_COPY_F32(config->args, where, "-solang_max", "solang", "<");
 
     if (where->list->n < 1) {
@@ -197,34 +153,11 @@
     }
 
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-set_workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_workdir");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-set_label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_label");
-        return false;
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-set_reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_reduction");
-        return false;
-    }
-
-    psString expgroup = psMetadataLookupStr(&status, config->args, "-set_expgroup");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_expgroup");
-        return false;
-    }
-
-    psString dvodb = psMetadataLookupStr(&status, config->args, "-set_dvodb");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_dvodb");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+    PXOPT_LOOKUP_STR(expgroup, config->args, "-set_expgroup", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", false, false);
+    PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
+    PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
 
     // find the exp_id of all the exposures that we want to queue up.
@@ -272,4 +205,5 @@
         psMetadata *md = output->data[i];
 
+        bool status;
         psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
         if (!status) {
@@ -280,5 +214,5 @@
 
         // queue the exp
-        if (!pxchipQueueByExpTag(config, exp_id, workdir, label, reduction, expgroup, dvodb)) {
+        if (!pxchipQueueByExpTag(config, exp_id, workdir, label, reduction, expgroup, dvodb, tess_id, end_stage)) {
             if (!psDBRollback(config->dbh)) {
                 psError(PS_ERR_UNKNOWN, false, "database error");
@@ -304,10 +238,6 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    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);
 
     // XXX does this need to be constrained so that it won't return any results
@@ -350,14 +280,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;
-        }
-    }
-
     if (!convertIdToStr(output)) {
         psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
@@ -383,163 +303,33 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
     // chip_id, ext_tag, class_id are required
-    psString chip_id = psMetadataLookupStr(&status, config->args, "-chip_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -chip_id");
-        return false;
-    }
-    if (!chip_id) {
-        psError(PS_ERR_UNKNOWN, true, "-chip_id is required");
-        return false;
-    }
-
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
-        return false;
-    }
-
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id 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;
-    }
-
-    psF32 bg = psMetadataLookupF32(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF32 bg_stdev = psMetadataLookupF32(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF32 bg_mean_stdev = psMetadataLookupF32(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    psF32 bias = psMetadataLookupF32(&status, config->args, "-bias");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bias");
-        return false;
-    }
-
-    psF32 bias_stdev = psMetadataLookupF32(&status, config->args, "-bias_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bias_stdev");
-        return false;
-    }
-
-    psF32 fringe_0 = psMetadataLookupF32(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-
-    psF32 fringe_1 = psMetadataLookupF32(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-
-    psF32 fringe_2 = psMetadataLookupF32(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF32 sigma_ra = psMetadataLookupF32(&status, config->args, "-sigma_ra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sigma_ra");
-        return false;
-    }
-
-    psF32 sigma_dec = psMetadataLookupF32(&status, config->args, "-sigma_dec");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sigma_dec");
-        return false;
-    }
-
-    psF32 ap_resid = psMetadataLookupF32(&status, config->args, "-ap_resid");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ap_resid");
-        return false;
-    }
-
-    psF32 ap_resid_stdev = psMetadataLookupF32(&status, config->args, "-ap_resid_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ap_resid_stdev");
-        return false;
-    }
-
-    psF32 fwhm = psMetadataLookupF32(&status, config->args, "-fwhm");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fwhm");
-        return false;
-    }
-
-    psF32 fwhm_range = psMetadataLookupF32(&status, config->args, "-fwhm_range");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fwhm_range");
-        return false;
-    }
-
-    psS32 n_stars = psMetadataLookupS32(&status, config->args, "-n_stars");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_stars");
-        return false;
-    }
-
-    psS32 n_extended = psMetadataLookupS32(&status, config->args, "-n_extended");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_extended");
-        return false;
-    }
-
-    psS32 n_cr = psMetadataLookupS32(&status, config->args, "-n_cr");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_cr");
-        return false;
-    }
-
-    psS32 n_astrom = psMetadataLookupS32(&status, config->args, "-n_astrom");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -n_astrom");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(chip_id, config->args, "-chip_id", true, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
 
     // optional
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
+    PXOPT_LOOKUP_F32(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F32(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F32(bg_mean_stdev, config->args, "-bg_mean_stdev", false, false);
+    PXOPT_LOOKUP_F32(bias, config->args, "-bias", false, false);
+    PXOPT_LOOKUP_F32(bias_stdev, config->args, "-bias_stdev", false, false);
+    PXOPT_LOOKUP_F32(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F32(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F32(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F32(sigma_ra, config->args, "-sigma_ra", false, false);
+    PXOPT_LOOKUP_F32(sigma_dec, config->args, "-sigma_dec", false, false);
+    PXOPT_LOOKUP_F32(ap_resid, config->args, "-ap_resid", false, false);
+    PXOPT_LOOKUP_F32(ap_resid_stdev, config->args, "-ap_resid_stdev", false, false);
+    PXOPT_LOOKUP_F32(fwhm, config->args, "-fwhm", false, false);
+    PXOPT_LOOKUP_F32(fwhm_range, config->args, "-fwhm_range", false, false);
+    PXOPT_LOOKUP_F32(n_stars, config->args, "-n_stars", false, false);
+    PXOPT_LOOKUP_F32(n_extended, config->args, "-n_extended", false, false);
+    PXOPT_LOOKUP_F32(n_cr, config->args, "-n_cr", false, false);
+    PXOPT_LOOKUP_F32(n_astrom, config->args, "-n_astrom", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
     // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     if (!psDBTransaction(config->dbh)) {
@@ -548,5 +338,5 @@
     }
 
-    chipProcessedImfileRow *imfile = chipProcessedImfileRowAlloc(
+    if (!chipProcessedImfileInsert(config->dbh,
         (psS64)atoll(chip_id),
         (psS64)atoll(exp_id),
@@ -573,24 +363,12 @@
         path_base,
         code
-    );
-    if (!imfile) {
+    )) {
         // rollback
         if (!psDBRollback(config->dbh)) {
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psError(PS_ERR_UNKNOWN, false, "failed to alloc chipProcessedImfileRow object");
-        return false;
-    }
-    if (!chipProcessedImfileInsertObject(config->dbh, imfile)) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(imfile);
-        return false;
-    }
-
-
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
 
     // XXX I've decided to make the transaction cover the Exp migration as
@@ -621,16 +399,7 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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);
 
     // XXX does this need to be constrained so that it won't return any results
@@ -681,14 +450,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;
-        }
-    }
-
     if (!convertIdToStr(output)) {
         psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
@@ -744,14 +503,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-    if (code == INT16_MAX) {
-        psError(PS_ERR_UNKNOWN, true, "-code is required");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
     if (!pxSetFaultCode(config->dbh, "chipProcessedImfile", config->where, code)) {
@@ -768,14 +518,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-    if (!label) {
-        psError(PS_ERR_UNKNOWN, true, "-label is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
 
     if (!chipMaskInsert(config->dbh, label)) {
@@ -791,4 +532,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = psStringCopy("SELECT * FROM chipMask");
@@ -810,14 +553,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;
-        }
     }
 
@@ -845,14 +578,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-    if (!label) {
-        psError(PS_ERR_UNKNOWN, true, "-label is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
 
     char *query = "DELETE FROM chipMask WHERE label = '%s'";
@@ -860,5 +584,4 @@
     if (!p_psDBRunQuery(config->dbh, query, label)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
         return false;
     }
@@ -909,4 +632,11 @@
             return false;
         }
+
+        // should we stop here or proceed on to the cam stage?
+        if (psStrcasestr(chipRun->end_stage, "chip")) {
+            psFree(chipRun);
+            continue;
+        }
+        // else continue on...
 
         // camQueueChipID() can only be run after chipRun.state has been set to
@@ -918,5 +648,7 @@
                     chipRun->reduction,
                     chipRun->expgroup,
-                    chipRun->dvodb
+                    chipRun->dvodb,
+                    chipRun->tess_id,
+                    chipRun->end_stage
         )) {
             // rollback
Index: /trunk/ippTools/src/chiptoolConfig.c
===================================================================
--- /trunk/ippTools/src/chiptoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/chiptoolConfig.c	(revision 16170)
@@ -55,7 +55,7 @@
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-telescope",  0,
             "search for telescope", NULL);
-    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-dateobs_begin", 0,   
+    psMetadataAddTime(queueArgs, PS_LIST_TAIL, "-dateobs_begin", 0,   
             "search for exposures by time (>=)", NULL);
-    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-dateobs_end", 0,
+    psMetadataAddTime(queueArgs, PS_LIST_TAIL, "-dateobs_end", 0,
             "search for exposures by time (<)", NULL);
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-exp_tag",  0,
@@ -269,13 +269,13 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-queue",               "", CHIPTOOL_MODE_QUEUE,          queueArgs);
-    PXTOOL_ADD_MODE("-pendingimfile",       "", CHIPTOOL_MODE_PENDINGIMFILE,  pendingimfileArgs);
-    PXTOOL_ADD_MODE("-addprocessedimfile",  "", CHIPTOOL_MODE_ADDPROCESSEDIMFILE,addprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-processedimfile",     "", CHIPTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
-    PXTOOL_ADD_MODE("-updateprocessedimfile", "", CHIPTOOL_MODE_UPDATEPROCESSEDIMFILE,    updateprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-revertprocessedimfile", "", CHIPTOOL_MODE_REVERTPROCESSEDIMFILE,    revertprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-block",               "", CHIPTOOL_MODE_BLOCK,          blockArgs);
-    PXTOOL_ADD_MODE("-masked",              "", CHIPTOOL_MODE_MASKED,         maskedArgs);
-    PXTOOL_ADD_MODE("-unblock",             "",  CHIPTOOL_MODE_UNBLOCK,        unblockArgs);
+    PXOPT_ADD_MODE("-queue",               "", CHIPTOOL_MODE_QUEUE,          queueArgs);
+    PXOPT_ADD_MODE("-pendingimfile",       "", CHIPTOOL_MODE_PENDINGIMFILE,  pendingimfileArgs);
+    PXOPT_ADD_MODE("-addprocessedimfile",  "", CHIPTOOL_MODE_ADDPROCESSEDIMFILE,addprocessedimfileArgs);
+    PXOPT_ADD_MODE("-processedimfile",     "", CHIPTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
+    PXOPT_ADD_MODE("-updateprocessedimfile", "", CHIPTOOL_MODE_UPDATEPROCESSEDIMFILE,    updateprocessedimfileArgs);
+    PXOPT_ADD_MODE("-revertprocessedimfile", "", CHIPTOOL_MODE_REVERTPROCESSEDIMFILE,    revertprocessedimfileArgs);
+    PXOPT_ADD_MODE("-block",               "", CHIPTOOL_MODE_BLOCK,          blockArgs);
+    PXOPT_ADD_MODE("-masked",              "", CHIPTOOL_MODE_MASKED,         maskedArgs);
+    PXOPT_ADD_MODE("-unblock",             "",  CHIPTOOL_MODE_UNBLOCK,        unblockArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/detselect.c
===================================================================
--- /trunk/ippTools/src/detselect.c	(revision 16169)
+++ /trunk/ippTools/src/detselect.c	(revision 16170)
@@ -75,96 +75,33 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_BOOL(unlimit, config->args, "-unlimit", false);
+
+    PXOPT_LOOKUP_TIME(time, config->args, "-time", false, false);
+
     psMetadata *where = psMetadataAlloc();
 
     // airmass_min  < airmass  < airmass_max
-    {
-        bool status = false;
-        psF32 airmass = psMetadataLookupF32(&status, config->args, "-airmass");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass");
-            psFree(where);
-            return false;
-        }
-
-        if (!isnan(airmass)) {
-            psMetadataAddF32(where, PS_LIST_TAIL, "airmass_min", 0, "<=", airmass);
-            psMetadataAddF32(where, PS_LIST_TAIL, "airmass_max", 0, ">=", airmass);
-        }
-    }
+    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
-    {
-        bool status = false;
-        psF32 exp_time = psMetadataLookupF32(&status, config->args, "-exp_time");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time");
-            psFree(where);
-            return false;
-        }
-
-        if (!isnan(exp_time)) {
-            psMetadataAddF32(where, PS_LIST_TAIL, "exp_time_min", 0, "<=", exp_time);
-            psMetadataAddF32(where, PS_LIST_TAIL, "exp_time_max", 0, ">=", exp_time);
-        }
-    }
+    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
-    {
-        bool status = false;
-        psF32 ccd_temp = psMetadataLookupF32(&status, config->args, "-ccd_temp");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp");
-            psFree(where);
-            return false;
-        }
-
-        if (!isnan(ccd_temp)) {
-            psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp_min", 0, "<=", ccd_temp);
-            psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp_max", 0, ">=", ccd_temp);
-        }
-    }
-
-    {
-        bool status = false;
-        psF64 posang = psMetadataLookupF64(&status, config->args, "-posang");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang");
-            psFree(where);
-            return false;
-        }
-
-        if (!isnan(posang)) {
-            psMetadataAddF32(where, PS_LIST_TAIL, "posang_min", 0, "<=", posang);
-            psMetadataAddF32(where, PS_LIST_TAIL, "posang_max", 0, ">=", posang);
-        }
-    }
+    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", ">=");
 
     // time_begin    < time     < time_end
-    {
-        bool status = false;
-        psString timeStr = psMetadataLookupStr(&status, config->args, "-time");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time");
-            psFree(where);
-            return false;
-        }
-
-        if (timeStr) {
-            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
-            if (!time) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", timeStr);
-                psFree(where);
-                return false;
-            }
-
-            // the == NULL tests invokes some psDB magic to make an OR
-            // conditional query
-            psMetadataAddTime(where, PS_LIST_TAIL, "time_begin", 0, "<=", time);
-            psMetadataAddTime(where, PS_LIST_TAIL, "time_begin", PS_META_DUPLICATE_OK, "==", NULL);
-            psMetadataAddTime(where, PS_LIST_TAIL, "time_end", 0, ">=", time);
-            psMetadataAddTime(where, PS_LIST_TAIL, "time_end", PS_META_DUPLICATE_OK, "==", NULL);
-            psFree(time);
-        }
-    }
+    // the == NULL tests invokes some psDB magic to make an OR
+    // conditional query
+    psMetadataAddTime(where, PS_LIST_TAIL, "time_begin", 0, "<=", time);
+    psMetadataAddTime(where, PS_LIST_TAIL, "time_begin", PS_META_DUPLICATE_OK, "==", NULL);
+    psMetadataAddTime(where, PS_LIST_TAIL, "time_end", 0, ">=", time);
+    psMetadataAddTime(where, PS_LIST_TAIL, "time_end", PS_META_DUPLICATE_OK, "==", NULL);
 
     psString query = pxDataGet("detselect_search.sql");
@@ -189,10 +126,10 @@
     }
 
-    // we choose the single detrend image which matches all criteria and has the latest
-    // insertion date
+    // we choose the single detrend image which matches all criteria and has
+    // the latest insertion date
 
     // unless explicitly specified by the user, list all possible matches
-    if (!psMetadataLookupBool(NULL, config->args, "-unlimit")) {
-	psStringAppend(&query, " ORDER BY registered DESC LIMIT 1");
+    if (!unlimit) {
+        psStringAppend(&query, " ORDER BY registered DESC LIMIT 1");
     }
 
@@ -216,14 +153,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;
-        }
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "detExp", !simple)) {
@@ -241,4 +168,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = pxDataGet("detselect_select.sql");
@@ -274,14 +203,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, "detNormalizedImfile", !simple)) {
Index: /trunk/ippTools/src/detselectConfig.c
===================================================================
--- /trunk/ippTools/src/detselectConfig.c	(revision 16169)
+++ /trunk/ippTools/src/detselectConfig.c	(revision 16170)
@@ -62,5 +62,5 @@
     psMetadataAddF64(searchArgs, PS_LIST_TAIL, "-posang", 0,
             "search by rotator position angle", NAN);
-    psMetadataAddStr(searchArgs, PS_LIST_TAIL, "-time", 0,
+    psMetadataAddTime(searchArgs, PS_LIST_TAIL, "-time", 0,
             "define time for desired detrend data", NULL);
     psMetadataAddBool(searchArgs, PS_LIST_TAIL, "-simple",  0,
@@ -83,6 +83,6 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-search",  "search for an appropriate detrend", DETSELECT_MODE_SEARCH, searchArgs);
-    PXTOOL_ADD_MODE("-select",  "retreive detrend information", DETSELECT_MODE_SELECT, selectArgs);
+    PXOPT_ADD_MODE("-search",  "search for an appropriate detrend", DETSELECT_MODE_SEARCH, searchArgs);
+    PXOPT_ADD_MODE("-select",  "retreive detrend information", DETSELECT_MODE_SELECT, selectArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/dettool.c
===================================================================
--- /trunk/ippTools/src/dettool.c	(revision 16169)
+++ /trunk/ippTools/src/dettool.c	(revision 16170)
@@ -92,7 +92,4 @@
 static bool register_detrendMode(pxConfig *config);
 
-static detNormalizedStatImfileRow *detStackedToDetNormalizedStatImfile(pxConfig *config, detStackedImfileRow *stackedImfile);
-static  detNormalizedImfileRow *detNormalizedStatToDetNormalizedmfile(pxConfig *config, detNormalizedStatImfileRow *statImfile);
-static detResidExpRow *mdToDetResidExp(pxConfig *config, psMetadata *row);
 static detRunSummaryRow *mdToDetRunSummary(pxConfig *config, psMetadata *row);
 //static psArray *validDetInputClassIds(pxConfig *config, const char *det_id);
@@ -212,5 +209,7 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-     psString query = psStringCopy(
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    psString query = psStringCopy(
         "SELECT"
         "   rawExp.*"
@@ -247,14 +246,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, "rawExp", !simple)) {
@@ -271,43 +260,14 @@
 static bool definebytagMode(pxConfig *config)
 {
-    bool status     = false;
-
     PS_ASSERT_PTR_NON_NULL(config, false);
 
     // what type of detRun is this?
-    // det_type is required
-    psString det_type = psMetadataLookupStr(&status, config->args, "-det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_type");
-        return false;
-    }
-    if (!det_type) {
-        psError(PS_ERR_UNKNOWN, true, "-det_type is required");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
 
     // optional
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    // optional
-    psString mode = psMetadataLookupStr(&status, config->args, "-mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -mode");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
+    PXOPT_LOOKUP_STR(mode, config->args, "-mode", false, false);
     // check mode
     if (mode && !isValidMode(config, mode)) {
@@ -315,193 +275,29 @@
         return false;
     }
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_min");
-        return false;
-    }
-
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_max");
-        return false;
-    }
-
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_min");
-        return false;
-    }
-
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_max");
-        return false;
-    }
-
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_min");
-        return false;
-    }
-
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_max");
-        return false;
-    }
-
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_min");
-        return false;
-    }
-
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_max");
-        return false;
-    }
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_min");
-        return false;
-    }
-
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_max");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-            if (!registered) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", registeredStr);
-                return false;
-            }
-        } else {
-            registered = NULL;
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-            if (!time_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_beginStr);
-                return false;
-            }
-        } else {
-            time_begin = NULL;
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-            if (!time_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_endStr);
-                return false;
-            }
-        } else {
-            time_end = NULL;
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-            if (!use_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_beginStr);
-                return false;
-            }
-        } else {
-            use_begin = NULL;
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-            if (!use_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_endStr);
-                return false;
-            }
-        } else {
-            use_end = NULL;
-        }
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reduction");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", false, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
+    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
+
+    PXOPT_LOOKUP_F32(airmass_min, config->args, "-airmass_min", false, false);
+    PXOPT_LOOKUP_F32(airmass_max, config->args, "-airmass_max", false, false);
+    PXOPT_LOOKUP_F32(exp_time_min, config->args, "-exp_time_min", false, false);
+    PXOPT_LOOKUP_F32(exp_time_max, config->args, "-exp_time_max", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F64(posang_min, config->args, "-posang_min", false, false);
+    PXOPT_LOOKUP_F64(posang_max, config->args, "-posang_max", false, false);
+    PXOPT_LOOKUP_F64(solang_min, config->args, "-solang_min", false, false);
+    PXOPT_LOOKUP_F64(solang_max, config->args, "-solang_max", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-time_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+
+    // default
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     // we have to support multipe exp_ids
@@ -608,9 +404,4 @@
                  0       // parent
         );
-    psFree(registered);
-    psFree(time_begin);
-    psFree(time_end);
-    psFree(use_begin);
-    psFree(use_end);
     psS64 det_id = psDBLastInsertID(config->dbh);
 
@@ -645,14 +436,4 @@
         psError(PS_ERR_UNKNOWN, false, "database error");
         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;
-        }
     }
 
@@ -721,316 +502,63 @@
 static bool definebyqueryMode(pxConfig *config)
 {
-    bool status     = false;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // what type of detRun is this?
-    // det_type is required
-    psString det_type = psMetadataLookupStr(&status, config->args, "-det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_type");
-        return false;
-    }
-    if (!det_type) {
-        psError(PS_ERR_UNKNOWN, true, "-det_type is required");
-        return false;
-    }
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // required
+    PXOPT_LOOKUP_STR(det_type, config->args, "-det_type", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
 
     // optional
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, false, "-inst is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(mode, config->args, "-mode", false, false);
+    // check mode
+    if (mode && !isValidMode(config, mode)) {
+        psError(PS_ERR_UNKNOWN, false, "invalud mode");
+        return false;
+    }
+    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
+    PXOPT_LOOKUP_F32(airmass_min, config->args, "-airmass_min", false, false);
+    PXOPT_LOOKUP_F32(airmass_max, config->args, "-airmass_max", false, false);
+    PXOPT_LOOKUP_F32(exp_time_min, config->args, "-exp_time_min", false, false);
+    PXOPT_LOOKUP_F32(exp_time_max, config->args, "-exp_time_max", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F64(posang_min, config->args, "-posang_min", false, false);
+    PXOPT_LOOKUP_F64(posang_max, config->args, "-posang_max", false, false);
+    PXOPT_LOOKUP_F64(solang_min, config->args, "-solang_min", false, false);
+    PXOPT_LOOKUP_F64(solang_max, config->args, "-solang_max", false, false);
+
+    PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-time_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
 
     psMetadata *where = psMetadataAlloc();
-    {
-        bool status = false;
-        psString exp_type = psMetadataLookupStr(&status, config->args, "-select_exp_type");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_exp_type");
-            return false;
-        }
-        if (exp_type) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_type", 0, "==", exp_type)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_type");
-                psFree(where);
-                return false;
-            }
-        }
-
-        // map -inst -> camera
-        psString camera = psMetadataLookupStr(&status, config->args, "-select_inst");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_inst");
-            return false;
-        }
-        if (camera) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "camera", 0, "==", camera)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item inst");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psString telescope = psMetadataLookupStr(&status, config->args, "-select_telescope");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_telescope");
-            return false;
-        }
-        if (telescope) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "telescope", 0, "==", telescope)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item telescope");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psString filter = psMetadataLookupStr(&status, config->args, "-select_filter");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_filter");
-            return false;
-        }
-        if (filter) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "filter", 0, "==", filter)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item filter");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psString uri = psMetadataLookupStr(&status, config->args, "-select_uri");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_uri");
-            return false;
-        }
-        if (uri) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "uri", 0, "==", uri)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item uri");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psString dateobs_begin = psMetadataLookupStr(&status, config->args, "-select_dateobs_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_dateobs_begin");
-            psFree(where);
-            return false;
-        }
-        if (dateobs_begin) {
-            psTime *time = psTimeFromISO(dateobs_begin, PS_TIME_UTC);
-            if (!time) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", dateobs_begin);
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            if (!psMetadataAddTime(where, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, ">=", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            psFree(time);
-        }
-
-        psString dateobs_end = psMetadataLookupStr(&status, config->args, "-select_dateobs_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_dateobs_end");
-            psFree(where);
-            return false;
-        }
-        if (dateobs_end) {
-            psTime *time = psTimeFromISO(dateobs_end, PS_TIME_UTC);
-            if (!time) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", dateobs_end);
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            if (!psMetadataAddTime(where, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, "<", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(where);
-                return false;
-            }
-            psFree(time);
-        }
-
-        /** selection based on airmass range **/
-        psF32 select_airmass_min = psMetadataLookupF32(&status, config->args, "-select_airmass_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_airmass_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_airmass_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "airmass", PS_META_DUPLICATE_OK, ">=", select_airmass_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_airmass_max = psMetadataLookupF32(&status, config->args, "-select_airmass_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_airmass_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_airmass_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "airmass", PS_META_DUPLICATE_OK, "<=", select_airmass_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item airmass");
-                psFree(where);
-                return false;
-            }
-        }
-
-        psF32 select_sat_pixel_frac_max = psMetadataLookupF32(&status, config->args, "-select_sat_pixel_frac_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_sat_pixel_frac_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_sat_pixel_frac_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "sat_pixel_frac", PS_META_DUPLICATE_OK, "<=", select_sat_pixel_frac_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item sat_pixel_frac");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on exp_time range **/
-        psF32 select_exp_time_min = psMetadataLookupF32(&status, config->args, "-select_exp_time_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_exp_time_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_exp_time_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "exp_time", PS_META_DUPLICATE_OK, ">=", select_exp_time_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_time");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_exp_time_max = psMetadataLookupF32(&status, config->args, "-select_exp_time_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_exp_time_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_exp_time_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "exp_time", PS_META_DUPLICATE_OK, "<=", select_exp_time_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_time");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on ccd_temp range **/
-        psF32 select_ccd_temp_min = psMetadataLookupF32(&status, config->args, "-select_ccd_temp_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_ccd_temp_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_ccd_temp_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp", PS_META_DUPLICATE_OK, ">=", select_ccd_temp_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item ccd_temp");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_ccd_temp_max = psMetadataLookupF32(&status, config->args, "-select_ccd_temp_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_ccd_temp_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_ccd_temp_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "ccd_temp", PS_META_DUPLICATE_OK, "<=", select_ccd_temp_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item ccd_temp");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on posang **/
-        psF32 select_posang_min = psMetadataLookupF32(&status, config->args, "-select_posang_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_posang_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_posang_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "posang", PS_META_DUPLICATE_OK, ">=", select_posang_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item posang");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_posang_max = psMetadataLookupF32(&status, config->args, "-select_posang_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_posang_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_posang_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "posang", PS_META_DUPLICATE_OK, "<=", select_posang_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item posang");
-                psFree(where);
-                return false;
-            }
-        }
-
-        /** selection based on solang **/
-        psF32 select_solang_min = psMetadataLookupF32(&status, config->args, "-select_solang_min");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_solang_min");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_solang_min)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "solang", PS_META_DUPLICATE_OK, ">=", select_solang_min)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
-                psFree(where);
-                return false;
-            }
-        }
-        psF32 select_solang_max = psMetadataLookupF32(&status, config->args, "-select_solang_max");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -select_solang_max");
-            psFree(where);
-            return false;
-        }
-        if (isfinite(select_solang_max)) {
-            if (!psMetadataAddF32(where, PS_LIST_TAIL, "solang", PS_META_DUPLICATE_OK, "<=", select_solang_max)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item solang");
-                psFree(where);
-                return false;
-            }
-        }
-
-    }
+    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", "==");
+    PXOPT_COPY_STR(config->args, where, "-select_filter", "filter", "==");
+    PXOPT_COPY_STR(config->args, where, "-select_uri", "uri", "==");
+    PXOPT_COPY_TIME(config->args, where, "-select_dateobs_begin", "dateobs", ">=");
+    PXOPT_COPY_TIME(config->args, where, "-select_dateobs_end", "dateobs", "<");
+    PXOPT_COPY_F32(config->args, where, "-select_airmass_min", "airmass", ">=");
+    PXOPT_COPY_F32(config->args, where, "-select_airmass_max", "airmass", "<=");
+    PXOPT_COPY_F32(config->args, where, "-select_sat_pixel_frac_max", "sat_pixel_frac", "<=");
+    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_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", "<=");
 
     if (!psListLength(where->list)) {
@@ -1043,213 +571,4 @@
     // like to assign values to so I've seperated them but prepending set- to
     // the assigned values
-
-    // optional
-    psString mode = psMetadataLookupStr(&status, config->args, "-mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -mode");
-        return false;
-    }
-    // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_min");
-        return false;
-    }
-
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_max");
-        return false;
-    }
-
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_min");
-        return false;
-    }
-
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_max");
-        return false;
-    }
-
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_min");
-        return false;
-    }
-
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_max");
-        return false;
-    }
-
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_min");
-        return false;
-    }
-
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_max");
-        return false;
-    }
-
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_min");
-        return false;
-    }
-
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_max");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-            if (!registered) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", registeredStr);
-                return false;
-            }
-        } else {
-            registered = NULL;
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-            if (!time_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_beginStr);
-                return false;
-            }
-        } else {
-            time_begin = NULL;
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-            if (!time_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", time_endStr);
-                return false;
-            }
-        } else {
-            time_end = NULL;
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-            if (!use_begin) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_beginStr);
-                return false;
-            }
-        } else {
-            use_begin = NULL;
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-            if (!use_end) {
-                psError(PS_ERR_UNKNOWN, false, "error in time format %s", use_endStr);
-                return false;
-            }
-        } else {
-            use_end = NULL;
-        }
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reduction");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-
-    bool simple = psMetadataLookupBool(&status, config->args, "-simple");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -simple");
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
-        return false;
-    }
-
-    bool pretend = psMetadataLookupBool(&status, config->args, "-pretend");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -pretend");
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
-        return false;
-    }
 
     // search for rawExps with the specified options
@@ -1259,7 +578,4 @@
     if (!detrendExps) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return false;
     }
@@ -1267,7 +583,4 @@
         psTrace("dettool", PS_LOG_INFO, "no rows found");
         psFree(detrendExps);
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return true;
     }
@@ -1283,13 +596,7 @@
             psError(PS_ERR_UNKNOWN, false, "failed to print array");
             psFree(detrendExps);
-            psFree(registered);
-            psFree(use_begin);
-            psFree(use_end);
             return false;
         }
         psFree(detrendExps);
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return true;
     }
@@ -1299,7 +606,4 @@
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(detrendExps);
-        psFree(registered);
-        psFree(use_begin);
-        psFree(use_end);
         return false;
     }
@@ -1338,10 +642,4 @@
                  0       // parent
         );
-    psFree(registered);
-    psFree(time_begin);
-    psFree(time_end);
-    psFree(use_end);
-    psFree(use_begin);
-    psFree(use_end);
     psS64 det_id = psDBLastInsertID(config->dbh);
 
@@ -1417,18 +715,43 @@
 static bool definebydetrunMode(pxConfig *config)
 {
-    bool status     = false;
-
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // det_id is the only required input
-    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;
-    }
+    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(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_TIME(registered, config->args, "-set_registered", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-set_time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-set_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+
 
     // lookup the detRun that we will be basing this one on
@@ -1467,9 +790,4 @@
 
     // walk through the optional values and update the detRun as required
-    psString det_type = psMetadataLookupStr(&status, config->args, "-set_det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_det_type");
-        return false;
-    }
     if (det_type) {
         psFree(detRun->det_type);
@@ -1477,14 +795,4 @@
     }
 
-    psString mode = psMetadataLookupStr(&status, config->args, "-set_mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_mode");
-        return false;
-    }
-    // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
     if (mode) {
         psFree(detRun->mode);
@@ -1492,9 +800,4 @@
     }
 
-    psString camera = psMetadataLookupStr(&status, config->args, "-set_inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_inst");
-        return false;
-    }
     if (camera) {
         psFree(detRun->camera);
@@ -1502,9 +805,4 @@
     }
 
-    psString telescope = psMetadataLookupStr(&status, config->args, "-set_telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_telescope");
-        return false;
-    }
     if (telescope) {
         psFree(detRun->telescope);
@@ -1512,9 +810,4 @@
     }
 
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-set_exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_exp_type");
-        return false;
-    }
     if (exp_type) {
         psFree(detRun->exp_type);
@@ -1522,9 +815,4 @@
     }
 
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-set_filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_filelevel");
-        return false;
-    }
     if (filelevel) {
         psFree(detRun->filelevel);
@@ -1532,9 +820,4 @@
     }
 
-    psString workdir = psMetadataLookupStr(&status, config->args, "-set_workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_workdir");
-        return false;
-    }
     if (workdir) {
         psFree(detRun->workdir);
@@ -1542,9 +825,4 @@
     }
 
-    psString filter = psMetadataLookupStr(&status, config->args, "-set_filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_filter");
-        return false;
-    }
     if (filter) {
         psFree(detRun->filter);
@@ -1552,188 +830,74 @@
     }
 
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-set_airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_airmass_min");
-        return false;
-    }
     if (!isnan(airmass_min)) {
         detRun->airmass_min = airmass_min;
     }
 
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-set_airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_airmass_max");
-        return false;
-    }
     if (!isnan(airmass_max)) {
         detRun->airmass_max = airmass_max;
     }
 
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-set_exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_exp_time_min");
-        return false;
-    }
     if (!isnan(exp_time_min)) {
         detRun->exp_time_min = exp_time_min;
     }
 
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-set_exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_exp_time_max");
-        return false;
-    }
     if (!isnan(exp_time_max)) {
         detRun->exp_time_max = exp_time_max;
     }
 
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-set_ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_ccd_temp_min");
-        return false;
-    }
     if (!isnan(ccd_temp_min)) {
         detRun->ccd_temp_min = ccd_temp_min;
     }
 
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-set_ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_ccd_temp_max");
-        return false;
-    }
     if (!isnan(ccd_temp_max)) {
         detRun->ccd_temp_max = ccd_temp_max;
     }
 
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-set_posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_posang_min");
-        return false;
-    }
     if (!isnan(posang_min)) {
         detRun->posang_min = posang_min;
     }
 
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-set_posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_posang_max");
-        return false;
-    }
     if (!isnan(posang_max)) {
         detRun->posang_max = posang_max;
     }
 
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-set_solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_solang_min");
-        return false;
-    }
     if (!isnan(solang_min)) {
         detRun->solang_min = solang_min;
     }
 
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-set_solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_solang_max");
-        return false;
-    }
     if (!isnan(solang_max)) {
         detRun->solang_max = solang_max;
     }
 
-    psString label = psMetadataLookupStr(&status, config->args, "-set_label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_label");
-        return false;
-    }
     if (label) {
+        psFree(detRun->label);
         detRun->label = label;
     }
 
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-set_registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            psFree(detRun->registered);
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-            detRun->registered = psMemIncrRefCounter(registered);
-            psFree(registered);
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-set_time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            psFree(detRun->time_begin);
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-            detRun->time_begin = psMemIncrRefCounter(time_begin);
-            psFree(time_begin);
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-set_time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            psFree(detRun->time_end);
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-            detRun->time_end = psMemIncrRefCounter(time_end);
-            psFree(time_end);
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-set_use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            psFree(detRun->use_begin);
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-            detRun->use_begin = psMemIncrRefCounter(use_begin);
-            psFree(use_begin);
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-set_use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            psFree(detRun->use_end);
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-            detRun->use_end = psMemIncrRefCounter(use_end);
-            psFree(use_end);
-        }
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-set_reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_reduction");
-        return false;
-    }
+    if (registered) {
+        psFree(detRun->registered);
+        detRun->registered = psMemIncrRefCounter(registered);
+    }
+
+    if (time_begin) {
+        psFree(detRun->time_begin);
+        detRun->time_begin = psMemIncrRefCounter(time_begin);
+    }
+
+    if (time_end) {
+        psFree(detRun->time_end);
+        detRun->time_end = psMemIncrRefCounter(time_end);
+    }
+
+    if (use_begin) {
+        psFree(detRun->use_begin);
+        detRun->use_begin = psMemIncrRefCounter(use_begin);
+    }
+
+    if (use_end) {
+        psFree(detRun->use_end);
+        detRun->use_end = psMemIncrRefCounter(use_end);
+    }
+
     if (reduction) {
         psFree(detRun->reduction);
@@ -1745,42 +909,8 @@
     psMetadata *time_filter = psMetadataAlloc();
 
-    {
-        psString timeStr = psMetadataLookupStr(&status, config->args, "-filter_input_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter_input_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (timeStr) {
-            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
-            if (!psMetadataAddTime(time_filter, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, ">=", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(time_filter);
-                return false;
-            }
-            psFree(time);
-        }
-    }
-
-    {
-        psString timeStr = psMetadataLookupStr(&status, config->args, "-filter_input_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter_input_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (timeStr) {
-            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
-            if (!psMetadataAddTime(time_filter, PS_LIST_TAIL, "dateobs", PS_META_DUPLICATE_OK, "<", time)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
-                psFree(time);
-                psFree(time_filter);
-                return false;
-            }
-            psFree(time);
-        }
-    }
-
+    // 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", "<");
 
     // start a transaction so we don't end up with childlessed det_ids
@@ -1840,14 +970,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;
-        }
-    }
-
     // print the new det_id
     psArray *newDetRuns = NULL;
@@ -1890,4 +1010,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
     // XXX fix the hard coding of the table name
     psArray *runs = psDBSelectRows(config->dbh, "detRun", config->where, 0);
@@ -1910,14 +1032,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, runs, "detRun", !simple)) {
@@ -1936,10 +1048,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 = psStringCopy(
@@ -1993,15 +1101,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, "detRun", !simple)) {
@@ -2032,4 +1129,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
     // select detInputExp.*
     // select rawExp.*
@@ -2068,14 +1167,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, "detInputExp", !simple)) {
@@ -2093,4 +1182,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = pxDataGet("dettool_raw.sql");
@@ -2124,14 +1215,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, "rawImfile", !simple)) {
@@ -2150,10 +1231,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_toprocessedimfile.sql");
@@ -2192,14 +1269,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;
-        }
     }
 
@@ -2267,122 +1334,26 @@
     // det_id, exp_id, class_id, uri, recipe, -bg, -bg_stdev
     // are required
-    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;
-    }
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
-        return false;
-    }
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id 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 recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
+ 
     // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    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);
+    PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_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);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    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_S16(code, config->args, "-code", false, false);
 
     // find the matching rawImfile by exp_id/class_id
@@ -2396,11 +1367,4 @@
         psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
         psFree(where);
-        return false;
-    }
-
-    // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
         return false;
     }
@@ -2453,10 +1417,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_toprocessedexp.sql");
@@ -2500,14 +1460,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, "detPendingProcessedExp", !simple)) {
@@ -2528,110 +1478,24 @@
     // det_id, exp_id, recip, -bg, -bg_stdev
     // are required
-    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;
-    }
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
-        return false;
-    }
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
+
     // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
-
+    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);
+    PXOPT_LOOKUP_F64(fringe_0, config->args, "-fringe_0", false, false);
+    PXOPT_LOOKUP_F64(fringe_1, config->args, "-fringe_1", false, false);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_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);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", true, false);
+ 
     // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     psString query = psStringCopy(
@@ -2727,16 +1591,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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 = psStringCopy("SELECT * FROM detProcessedExp");
@@ -2781,14 +1636,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, "detProcessedExp", !simple)) {
@@ -2840,10 +1685,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_tostacked.sql");
@@ -2887,14 +1728,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, "detPendingStackedImfile", !simple)) {
@@ -2914,17 +1745,8 @@
 
     char *value = NULL;
-    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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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 = psStringCopy(
@@ -2947,13 +1769,16 @@
 
     // add the two required restrictions: detRun.state and detRun.mode
-    if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
-        psStringAppend(&query, " detRun.state = '%s'", value);
-    } else {
-        psStringAppend(&query, " 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'");
+    {
+        bool status;
+        if ((value = psMetadataLookupStr(&status, config->args, "-select_state"))) {
+            psStringAppend(&query, " detRun.state = '%s'", value);
+        } else {
+            psStringAppend(&query, " 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'");
+        }
     }
 
@@ -3010,14 +1835,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, "rawImfile", !simple)) {
@@ -3070,104 +1885,22 @@
 
     // det_id, class_id, uri, & recipe are required
-    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;
-    }
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id 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 recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    // optional values
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
+    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);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, 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);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
 
     // default values
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     // correlate the class_id against the input exposure(s)
@@ -3246,16 +1979,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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);
 
     // select detStackedImfile.*
@@ -3313,15 +2037,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, "rawImfile", !simple)) {
@@ -3372,10 +2085,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_tonormalizedstat.sql");
@@ -3419,14 +2128,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, "detPendingNormStatImfile", !simple)) {
@@ -3445,117 +2144,27 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    // select * from detStackedImfile
-    // by det_id, iteration, class_id
-    // where det_id, iteration, class_id is not in detNormalizedStatImfile
-    psString query = psStringCopy(
-        "SELECT DISTINCT"
-        "   detStackedImfile.*"
-        " FROM detStackedImfile"
-        " LEFT JOIN detNormalizedStatImfile"
-        "   USING(det_id, iteration, class_id)"
-        " WHERE"
-        "  detNormalizedStatImfile.det_id IS NULL"
-        "  AND detNormalizedStatImfile.iteration IS NULL"
-        "  AND detNormalizedStatImfile.class_id IS NULL"
-        );
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "detStackedImfile");
-        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);
-
-    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;
-    }
-
-    // start a transaction so it's all rows or nothing
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-    for (long i = 0; i < psArrayLength(output); i++) {
-        psMetadata *row = output->data[i];
-        // convert metadata into a detStackedImfile object
-        detStackedImfileRow *stackedImfile = detStackedImfileObjectFromMetadata(row);
-        // convert detStackedImfile object into a detNormalizedStat object
-        detNormalizedStatImfileRow *stat = detStackedToDetNormalizedStatImfile(config, stackedImfile);
-        psFree(stackedImfile);
-        if (!stat) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert detStackedImfile to detNormalizedStatImfile");
-            psFree(output);
-            return false;
-        }
-        // insert detNormlized Stat object into the database
-        if (!detNormalizedStatImfileInsertObject(config->dbh, stat)) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(stat);
-            psFree(output);
-        }
-        psFree(stat);
-    }
-
-    psFree(output);
-
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-static detNormalizedStatImfileRow *detStackedToDetNormalizedStatImfile(pxConfig *config, detStackedImfileRow *stackedImfile)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(stackedImfile, NULL);
-
-    bool status = false;
-    psF32 norm = psMetadataLookupF32(&status, config->args, "-norm");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -norm");
-        return false;
-    }
-    //if (isnan(norm)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-norm is required");
-    //  return false;
-    //}
-
-    // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    return detNormalizedStatImfileRowAlloc(
-        stackedImfile->det_id,
-        stackedImfile->iteration,
-        stackedImfile->class_id,
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+
+    // optional
+    PXOPT_LOOKUP_F32(norm, config->args, "-norm", false, false);
+
+    // default
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    if (!detNormalizedStatImfileInsert(config->dbh,
+        (psS64)atoll(det_id),
+        iteration,
+        class_id,
         norm,
         code
-    );
+    )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
 }
 
@@ -3565,16 +2174,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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("dettool_normalizedstat.sql");
@@ -3623,15 +2223,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, "detNormalizedStatImfile", !simple)) {
@@ -3681,10 +2270,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);
 
     // select detNormalizedStatImfile.*
@@ -3755,15 +2340,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, "detPendingNormImfile", !simple)) {
@@ -3873,133 +2447,40 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // make sure that there is a respondoing entry in detNormalizedStatImfile
-    // select * from detNormalizedStatImfile
-    // by det_id, iteration, class_id
-    // where det_id, iteration, class_id is not in detNormalizedImfile
-    psString query = psStringCopy(
-        "SELECT"
-        "   detNormalizedStatImfile.*"
-        " FROM detNormalizedStatImfile"
-        " LEFT JOIN detNormalizedImfile"
-        "   USING(det_id, iteration, class_id)"
-        " WHERE"
-        "  detNormalizedImfile.det_id IS NULL"
-        "  AND detNormalizedImfile.iteration IS NULL"
-        "  AND detNormalizedImfile.class_id IS NULL"
-        );
-
-    {
-        // build a query to search by det_id, iteration, class_id
-        psMetadata *where = psMetadataAlloc();
-        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");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        if (det_id) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "det_id", 0, "==", det_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-        psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        // always set iteration
-        if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        if (class_id) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "class_id", 0, "==", class_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item class_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-
-        // there's not
-        psString whereClause = psDBGenerateWhereConditionSQL(where, "detNormalizedStatImfile");
-        psFree(where);
-        if (whereClause) {
-            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);
-
-    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;
-    }
-
-    // start a transaction so it's all rows or nothing
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-    for (long i = 0; i < psArrayLength(output); i++) {
-        psMetadata *row = output->data[i];
-        // convert metadata into a detNormalizedStatImfile object
-        detNormalizedStatImfileRow *statImfile = detNormalizedStatImfileObjectFromMetadata(row);
-        // convert detNormalizedStatImfile object into a detNormalizedImfile
-        detNormalizedImfileRow *normalizedImfile  = detNormalizedStatToDetNormalizedmfile(config, statImfile);
-        psFree(statImfile);
-        if (!normalizedImfile) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert detStackedImfile to detNormalizedStatImfile");
-            psFree(output);
-            return false;
-        }
-        // insert detNormlized Stat object into the database
-        if (!detNormalizedImfileInsertObject(config->dbh, normalizedImfile)) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(normalizedImfile);
-            psFree(output);
-        }
-        psFree(normalizedImfile);
-    }
-
-    psFree(output);
-
-    if (!psDBCommit(config->dbh)) {
+    // 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_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);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    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_S16(code, config->args, "-code", false, false);
+
+    if (!detNormalizedImfileInsert(config->dbh,
+        (psS64)atoll(det_id),
+        iteration,
+        class_id,
+        uri,
+        bg,
+        bg_stdev,
+        bg_mean_stdev,
+        user_1,
+        user_2,
+        user_3,
+        user_4,
+        user_5,
+        path_base,
+        code
+    )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
@@ -4014,16 +2495,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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 = psStringCopy(
@@ -4083,14 +2555,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, "detNormalizedImfile", !simple)) {
@@ -4142,10 +2604,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_tonormalizedexp.sql");
@@ -4189,14 +2647,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, "detPendingNormExp", !simple)) {
@@ -4215,94 +2663,22 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // det_id, recip, -bg, -bg_stdev
-    // are required
-    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;
-    }
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
 
     // optional
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    // iteration has a default value
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");        return false;
-    }
-
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    // optional
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    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);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    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_S16(code, config->args, "-code", false, false);
 
     psString query = pxDataGet("dettool_tonormalizedexp.sql");
@@ -4336,7 +2712,7 @@
     psFree(output);
 
-    // create a new detProcessedImfile object
-    detNormalizedExpRow *detRow = detNormalizedExpRowAlloc(
-        (psS32)atoll(det_id),
+    // insert the new row into the detProcessedImfile table
+    if (!detNormalizedExpInsert(config->dbh,
+        (psS64)atoll(det_id),
         iteration,
         recipe,
@@ -4351,14 +2727,8 @@
         path_base,
         code
-    );
-
-    // insert the new row into the detProcessedImfile table
-    if (!detNormalizedExpInsertObject(config->dbh, detRow)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(detRow);
-        return false;
-    }
-
-    psFree(detRow);
+    )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
 
     return true;
@@ -4370,16 +2740,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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 = psStringCopy(
@@ -4433,14 +2794,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, "detNormalizedExp", !simple)) {
@@ -4455,101 +2806,4 @@
 }
 
-
-static  detNormalizedImfileRow *detNormalizedStatToDetNormalizedmfile(pxConfig *config, detNormalizedStatImfileRow *statImfile)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(statImfile, NULL);
-
-    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;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-    // optional
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    // optional
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
-
-    // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    return detNormalizedImfileRowAlloc(
-        statImfile->det_id,
-        statImfile->iteration,
-        statImfile->class_id,
-        uri,
-        bg,
-        bg_stdev,
-        bg_mean_stdev,
-        user_1,
-        user_2,
-        user_3,
-        user_4,
-        user_5,
-        path_base,
-        code
-    );
-}
 
 
@@ -4590,10 +2844,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_toresidimfile.sql");
@@ -4637,15 +2887,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, "detPendingResidImfile", !simple)) {
@@ -4665,174 +2904,38 @@
     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;
-    }
-
-    // defaults to 0
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        return false;
-    }
-
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, false, "-class_id is required");
-        return false;
-    }
-
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id 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 recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-    psF64 bg_skewness = psMetadataLookupF64(&status, config->args, "-bg_skewness");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_skewness");
-        return false;
-    }
-    psF64 bg_kurtosis = psMetadataLookupF64(&status, config->args, "-bg_kurtosis");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_kurtosis");
-        return false;
-    }
-    psF64 bin_stdev = psMetadataLookupF64(&status, config->args, "-bin_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bin_stdev");
-        return 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(uri, config->args, "-uri", true, false);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, false);
 
     // optional
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
-
-    // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 fringe_resid_0 = psMetadataLookupF64(&status, config->args, "-fringe_resid_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_0");
-        return false;
-    }
-    psF64 fringe_resid_1 = psMetadataLookupF64(&status, config->args, "-fringe_resid_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_1");
-        return false;
-    }
-    psF64 fringe_resid_2 = psMetadataLookupF64(&status, config->args, "-fringe_resid_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
+    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);
+    PXOPT_LOOKUP_F64(bg_skewness, config->args, "-bg_skewness", false, false);
+    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);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_0, config->args, "-fringe_resid_0", false, false);
+    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);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
     // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    // create a new detResidImfileRow and insert it
-    if (!detResidImfileInsert(
-            config->dbh,
+    PXOPT_LOOKUP_S32(iteration, config->args, "-iteration", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    if (!detResidImfileInsert(config->dbh,
             (psS64)atoll(det_id),
             iteration,
@@ -4868,21 +2971,12 @@
 }
 
+
 static bool residimfileMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    char *value = NULL;
-    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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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);
 
     // select detResidImfile.*
@@ -4905,5 +2999,8 @@
     // NOTE the above WHERE is completed with the following line:
 
+    char *value = NULL;
+
     // 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);
@@ -4951,15 +3048,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, "rawResidImfile", !simple)) {
@@ -5018,11 +3104,6 @@
     */
 
-
-    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_toresidexp.sql");
@@ -5066,14 +3147,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, "detPendingResidExp", !simple)) {
@@ -5091,4 +3162,36 @@
 {
     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);
+    PXOPT_LOOKUP_STR(recipe, config->args, "-recip", true, 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);
+    PXOPT_LOOKUP_F64(bg_skewness, config->args, "-bg_skewness", false, false);
+    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);
+    PXOPT_LOOKUP_F64(fringe_2, config->args, "-fringe_2", false, false);
+    PXOPT_LOOKUP_F64(fringe_resid_0, config->args, "-fringe_resid_0", false, false);
+    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);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    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_S16(code, config->args, "-code", false, false);
+    PXOPT_LOOKUP_BOOL(reject, config->args, "-reject", false);
 
     /*
@@ -5099,17 +3202,4 @@
     */
 
-
-    // select detRun.det_id
-    // select detRun.iteration
-    // select detRun.det_type
-    // select detInputExp.exp_id
-    // select detInputExp.include
-    // by:
-    // find the current iteration bassed on det_id
-    // find all exp_ids in the current det_id/iteration from detInputExp
-    // compare to detInputExp.imfiles to derResidImfile by class_id
-    // and:
-    // detResidImfile.{det_id, iteration, exp_id} is not in detResidExp
-
     psString query = pxDataGet("dettool_toresidexp.sql");
     if (!query) {
@@ -5121,50 +3211,9 @@
         // build a query to search by det_id, iteration, exp_id
         psMetadata *where = psMetadataAlloc();
-        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;
-        }
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", (psS64)atoll(det_id))) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-
-        psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        // always set iteration
-        if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        if (exp_id) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
+
+        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
@@ -5195,212 +3244,10 @@
         return false;
     }
-
-    // start a transaction so it's all rows or nothing
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(output);
-        return false;
-    }
-
-    for (long i = 0; i < psArrayLength(output); i++) {
-        psMetadata *row = output->data[i];
-        // convert metadata into a detResidExp object
-        detResidExpRow *residExp = mdToDetResidExp(config, row);
-        if (!residExp) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert metadata to detResidExp");
-            psFree(output);
-            return false;
-        }
-        // insert detResidExp object into the database
-        if (!detResidExpInsertObject(config->dbh, residExp)) {
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(residExp);
-            psFree(output);
-        }
-        psFree(residExp);
-    }
-
     psFree(output);
 
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-static detResidExpRow *mdToDetResidExp(pxConfig *config, psMetadata *row)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(row, NULL);
-
-    bool status = false;
-    // values 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;
-    }
-    //if (isnan(det_id)) {
-    //  psError(PS_ERR_UNKNOWN, true, "det_id is required");
-    //  return false;
-    //}
-    psS32 iteration = psMetadataLookupS32(&status, row, "iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for iteration");
-        return false;
-    }
-    psS64 exp_id = psMetadataLookupS64(&status, row, "exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "exp_id is required");
-        return false;
-    }
-
-    // values from config
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        return false;
-    }
-    if (!recipe) {
-        psError(PS_ERR_UNKNOWN, true, "-recip is required");
-        return false;
-    }
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return false;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return false;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-    psF64 bg_skewness = psMetadataLookupF64(&status, config->args, "-bg_skewness");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_skewness");
-        return false;
-    }
-    psF64 bg_kurtosis = psMetadataLookupF64(&status, config->args, "-bg_kurtosis");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_kurtosis");
-        return false;
-    }
-    psF64 bin_stdev = psMetadataLookupF64(&status, config->args, "-bin_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bin_stdev");
-        return false;
-    }
-    // optional
-    psF64 fringe_0 = psMetadataLookupF64(&status, config->args, "-fringe_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_0");
-        return false;
-    }
-    psF64 fringe_1 = psMetadataLookupF64(&status, config->args, "-fringe_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_1");
-        return false;
-    }
-    psF64 fringe_2 = psMetadataLookupF64(&status, config->args, "-fringe_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_2");
-        return false;
-    }
-
-    psF64 fringe_resid_0 = psMetadataLookupF64(&status, config->args, "-fringe_resid_0");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_0");
-        return false;
-    }
-    psF64 fringe_resid_1 = psMetadataLookupF64(&status, config->args, "-fringe_resid_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_1");
-        return false;
-    }
-    psF64 fringe_resid_2 = psMetadataLookupF64(&status, config->args, "-fringe_resid_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -fringe_resid_2");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    // optional
-    bool reject = psMetadataLookupBool(&status, config->args, "-reject");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reject");
-        return false;
-    }
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
-    if (!path_base) {
-        psError(PS_ERR_UNKNOWN, true, "-path_base is required");
-        return false;
-    }
-
-    // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    // create a new detResidImfileRow and insert it
-    return detResidExpRowAlloc(
-            det_id,
+    if (!detResidExpInsert(config->dbh,
+            (psS64)atoll(det_id),
             iteration,
-            exp_id,
+            (psS64)atoll(exp_id),
             recipe,
             bg,
@@ -5424,5 +3271,10 @@
             !reject,
             code
-        );
+        )) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
 }
 
@@ -5431,16 +3283,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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 = psStringCopy(
@@ -5497,14 +3340,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, "detResidExp", !simple)) {
@@ -5556,10 +3389,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);
 
     /* which returns a list of detrend runs (with detrend id, iteration and
@@ -5607,14 +3436,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, "detRejectExp", !simple)) {
@@ -5633,45 +3452,11 @@
     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();
-    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");
-        psFree(where);
-        return false;
-    }
-    if (det_id) {
-        if (!psMetadataAddStr(where, PS_LIST_TAIL, "det_id", 0, "==", det_id)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-            psFree(where);
-            return false;
-        }
-    }
-    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-        psFree(where);
-        return false;
-    }
-    // always where iteration
-    if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-        psFree(where);
-        return false;
-    }
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        psFree(where);
-        return false;
-    }
-    if (exp_id) {
-        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;
-        }
-    }
+    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
@@ -5679,91 +3464,12 @@
     // remove the '-' prefix
     psMetadata *set = psMetadataAlloc();
-    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (recipe) {
-        if (!psMetadataAddStr(set, PS_LIST_TAIL, "recipe", 0, "==", recipe)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (!isnan(bg)) {
-        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg", 0, "==", bg)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (!isnan(bg_stdev)) {
-        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg_stdev", 0, "==", bg_stdev)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (!isnan(bg_mean_stdev)) {
-        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg_mean_stdev", 0, "==", bg_mean_stdev)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
-    if (path_base) {
-        if (!psMetadataAddStr(set, PS_LIST_TAIL, "path_base", 0, "==", path_base)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item path_base");
-            psFree(set);
-            psFree(where);
-            return false;
-        }
-    }
-
-    bool reject = psMetadataLookupBool(&status, config->args, "-reject");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reject");
-        psFree(set);
-        psFree(where);
-        return false;
-    }
+    // 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");
@@ -5790,21 +3496,8 @@
 
     // required
-    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;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
 
     // optional
-    bool again = psMetadataLookupBool(&status, config->args, "-again");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -again");
-        return false;
-    }
+    PXOPT_LOOKUP_BOOL(again, config->args, "-again", false);
 
     psString query = pxDataGet("dettool_find_completed_runs.sql");
@@ -5814,31 +3507,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", "==");
+
     {
-        // build a query to search by det_id, iteration, exp_id
-        psMetadata *where = psMetadataAlloc();
-        bool status = false;
-        if (det_id) {
-            if (!psMetadataAddS64(where, PS_LIST_TAIL, "det_id", 0, "==", (psS64)atoll(det_id))) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-        psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-        // always set iteration
-        if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
-            psFree(where);
-            psFree(query);
-            return false;
-        }
-
         // there's not
         psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
@@ -5946,40 +3618,11 @@
     }
 
-    // from config->args
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return NULL;
-    }
-    //if (isnan(bg)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg is required");
-    //  return NULL;
-    //}
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return NULL;
-    }
-    //if (isnan(bg_stdev)) {
-    //  psError(PS_ERR_UNKNOWN, true, "-bg_stdev is required");
-    //  return NULL;
-    //}
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return NULL;
-    }
     // optional
-    bool accept = psMetadataLookupBool(&status, config->args, "-accept");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -accept");
-        return NULL;
-    }
+    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
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_BOOL(accept, config->args, "-accept", false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     return detRunSummaryRowAlloc(
@@ -5998,16 +3641,7 @@
     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;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
-        return 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 = psStringCopy(
@@ -6062,14 +3696,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, "rawDetrendImfile", !simple)) {
@@ -6124,25 +3748,9 @@
     // XXX this isn't strictly nessicary but not having the det_id complicates
     // incrementing the iteration number
-    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;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
+
+    PXOPT_LOOKUP_BOOL(again, config->args, "-again", false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", false, false);
     // either -rerun or -state must be specified
-    bool again = psMetadataLookupBool(&status, config->args, "-again");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -again");
-        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 (!(again || state)) {
         psError(PS_ERR_UNKNOWN, true, "either -again or -state must be specified");
@@ -6283,14 +3891,5 @@
 
     // det_id is required
-    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;
-    }
+    PXOPT_LOOKUP_STR(det_id, config->args, "-det_id", true, false);
 
     // we have to support multipe exp_ids
@@ -6443,202 +4042,34 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    bool status = false;
-    psString det_type = psMetadataLookupStr(&status, config->args, "-det_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_type");
-        return false;
-    }
-    if (!det_type) {
-        psError(PS_ERR_UNKNOWN, true, "-det_type is required");
-        return false;
-    }
-
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-    if (!filelevel) {
-        psError(PS_ERR_UNKNOWN, true, "-filelevel is required");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psF32 airmass_min = psMetadataLookupF32(&status, config->args, "-airmass_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_min");
-        return false;
-    }
-
-    psF32 airmass_max = psMetadataLookupF32(&status, config->args, "-airmass_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass_max");
-        return false;
-    }
-
-    psF32 exp_time_min = psMetadataLookupF32(&status, config->args, "-exp_time_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_min");
-        return false;
-    }
-
-    psF32 exp_time_max = psMetadataLookupF32(&status, config->args, "-exp_time_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time_max");
-        return false;
-    }
-
-    psF32 ccd_temp_min = psMetadataLookupF32(&status, config->args, "-ccd_temp_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_min");
-        return false;
-    }
-
-    psF32 ccd_temp_max = psMetadataLookupF32(&status, config->args, "-ccd_temp_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp_max");
-        return false;
-    }
-
-    psF64 posang_min = psMetadataLookupF32(&status, config->args, "-posang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_min");
-        return false;
-    }
-
-    psF64 posang_max = psMetadataLookupF32(&status, config->args, "-posang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang_max");
-        return false;
-    }
-
-    psF64 solang_min = psMetadataLookupF32(&status, config->args, "-solang_min");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_min");
-        return false;
-    }
-
-    psF64 solang_max = psMetadataLookupF32(&status, config->args, "-solang_max");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -solang_max");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
-    }
-
-    psTime *time_begin = NULL;
-    {
-        psString time_beginStr = psMetadataLookupStr(&status, config->args, "-time_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_beginStr) {
-            time_begin = psTimeFromISO(time_beginStr, PS_TIME_UTC);
-        } else {
-            time_begin = NULL;
-        }
-    }
-
-    psTime *time_end = NULL;
-    {
-        psString time_endStr = psMetadataLookupStr(&status, config->args, "-time_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -time_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (time_endStr) {
-            time_end = psTimeFromISO(time_endStr, PS_TIME_UTC);
-        } else {
-            time_end = NULL;
-        }
-    }
-
-    psTime *use_begin = NULL;
-    {
-        psString use_beginStr = psMetadataLookupStr(&status, config->args, "-use_begin");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_begin");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_beginStr) {
-            use_begin = psTimeFromISO(use_beginStr, PS_TIME_UTC);
-        } else {
-            use_begin = NULL;
-        }
-    }
-
-    psTime *use_end = NULL;
-    {
-        psString use_endStr = psMetadataLookupStr(&status, config->args, "-use_end");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -use_end");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (use_endStr) {
-            use_end = psTimeFromISO(use_endStr, PS_TIME_UTC);
-        } else {
-            use_end = NULL;
-        }
-    }
-
-    psString parent = psMetadataLookupStr(&status, config->args, "-parent");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -parent");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return 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(workdir, config->args, "-workdir", false, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", false, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", false, false);
+    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
+    PXOPT_LOOKUP_F32(airmass_min, config->args, "-airmass_min", false, false);
+    PXOPT_LOOKUP_F32(airmass_max, config->args, "-airmass_max", false, false);
+    PXOPT_LOOKUP_F32(exp_time_min, config->args, "-exp_time_min", false, false);
+    PXOPT_LOOKUP_F32(exp_time_max, config->args, "-exp_time_max", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_min, config->args, "-ccd_temp_min", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp_max, config->args, "-ccd_temp_max", false, false);
+    PXOPT_LOOKUP_F64(posang_min, config->args, "-posang_min", false, false);
+    PXOPT_LOOKUP_F64(posang_max, config->args, "-posang_max", false, false);
+    PXOPT_LOOKUP_F64(solang_min, config->args, "-solang_min", false, false);
+    PXOPT_LOOKUP_F64(solang_max, config->args, "-solang_max", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_TIME(time_begin, config->args, "-time_begin", false, false);
+    PXOPT_LOOKUP_TIME(time_end, config->args, "-time_end", false, false);
+    PXOPT_LOOKUP_TIME(use_begin, config->args, "-use_begin", false, false);
+    PXOPT_LOOKUP_TIME(use_end, config->args, "-use_end", false, false);
+    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);
 
     if (!psDBTransaction(config->dbh)) {
@@ -6683,8 +4114,6 @@
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
-        psFree(registered);
-        return false;
-    }
-    psFree(registered);
+        return false;
+    }
 
     // print the new detRun
@@ -6719,14 +4148,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, detRuns, "detRun", !simple)) {
@@ -6744,103 +4163,36 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    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;
-    }
-
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id 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;
-    }
-
-    // everything else is optional
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return 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_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);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
 
     if (!detRegisteredImfileInsert(config->dbh,
-                                   (psS64)atoll(det_id),
-                                   0,  // the iteration is fixed at 0
-                                   class_id,
-                                   uri,
-                                   bg,
-                                   bg_stdev,
-                                   bg_mean_stdev,
-                                   user_1,
-                                   user_2,
-                                   user_3,
-                                   user_4,
-                                   user_5,
-                                   path_base,
-                                   0       // fault code
-            )) {
+        (psS64)atoll(det_id),
+        0,  // the iteration is fixed at 0
+        class_id,
+        uri,
+        bg,
+        bg_stdev,
+        bg_mean_stdev,
+        user_1,
+        user_2,
+        user_3,
+        user_4,
+        user_5,
+        path_base,
+        0       // fault code
+    )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         return false;
Index: /trunk/ippTools/src/dettoolConfig.c
===================================================================
--- /trunk/ippTools/src/dettoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/dettoolConfig.c	(revision 16170)
@@ -43,7 +43,5 @@
     }
 
-    psTime *time = psTimeGetNow(PS_TIME_TAI);
-    psString now = psTimeToISO(time);
-    psFree(time);
+    psTime *now = psTimeGetNow(PS_TIME_TAI);
 
     // -pending
@@ -105,13 +103,13 @@
     psMetadataAddF64(definebytagArgs, PS_LIST_TAIL, "-solang_max",  0,
             "define max solar angle", NAN);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-time_begin",  0,
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-time_begin",  0,
             "detrend applyes to exposures taken during this peroid", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-time_end",  0,
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-time_end",  0,
             "detrend applyes to exposures taken during this peroid", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-use_begin",  0,
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-use_begin",  0,
             "start of detrend run applicable peroid", NULL);
-    psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-use_end",  0,
+    psMetadataAddTime(definebytagArgs, PS_LIST_TAIL, "-use_end",  0,
             "end of detrend run applicable peroid", NULL);
     psMetadataAddStr(definebytagArgs, PS_LIST_TAIL, "-reduction",  0,
@@ -158,13 +156,13 @@
     psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-solang_max",  0,
             "define max solar angle", NAN);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-time_begin",  0,
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-time_begin",  0,
             "detrend applyes to exposures taken during this peroid", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-time_end",  0,
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-time_end",  0,
             "detrend applyes to exposures taken during this peroid", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-use_begin",  0,
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-use_begin",  0,
             "start of detrend run applicable peroid", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-use_end",  0,
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-use_end",  0,
             "end of detrend run applicable peroid", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_exp_type",  0,
@@ -178,7 +176,7 @@
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_uri",  0,
             "search for uri", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_begin", 0,
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_begin", 0,
             "search for exposures by time (>=)", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_end", 0,
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-select_dateobs_end", 0,
             "search for exposures by time (<)", NULL);
     psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_airmass_min",  0,
@@ -245,13 +243,13 @@
     psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_posang_max",  0,
             "define rotator position angle", NAN);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_registered",  0,
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_registered",  0,
             "time detrend run was registered", now);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_time_begin",  0,
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_time_begin",  0,
             "start of peroid to apply detrend too", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_time_end",  0,
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_time_end",  0,
             "end of peroid to apply detrend too", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_use_begin",  0,
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_use_begin",  0,
             "start of detrend run applicable peroid", NULL);
-    psMetadataAddStr(definebydetrunArgs, PS_LIST_TAIL, "-set_use_end",  0,
+    psMetadataAddTime(definebydetrunArgs, PS_LIST_TAIL, "-set_use_end",  0,
             "end of detrend run applicable peroid", NULL);
     psMetadataAddF64(definebydetrunArgs, PS_LIST_TAIL, "-set_solang_min",  0,
@@ -1061,13 +1059,13 @@
     psMetadataAddF64(register_detrendArgs, PS_LIST_TAIL, "-solang_max",  0,
             "define max solar angle", NAN);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-time_begin",  0,
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-time_begin",  0,
             "detrend applyes to exposures taken during this peroid", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-time_end",  0,
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-time_end",  0,
             "detrend applyes to exposures taken during this peroid", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-use_begin",  0,
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_begin",  0,
             "start of detrend run applicable peroid", NULL);
-    psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-use_end",  0,
+    psMetadataAddTime(register_detrendArgs, PS_LIST_TAIL, "-use_end",  0,
             "end of detrend run applicable peroid", NULL);
     psMetadataAddStr(register_detrendArgs, PS_LIST_TAIL, "-parent",  0,
@@ -1110,58 +1108,58 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-pending",         "list active detruns", DETTOOL_MODE_PENDING,       pendingArgs);
-    PXTOOL_ADD_MODE("-definebytag",     "", DETTOOL_MODE_DEFINEBYTAG,   definebytagArgs);
-    PXTOOL_ADD_MODE("-definebyquery",   "", DETTOOL_MODE_DEFINEBYQUERY, definebyqueryArgs);
-    PXTOOL_ADD_MODE("-definebydetrun",  "", DETTOOL_MODE_DEFINEBYDETRUN, definebydetrunArgs);
-    PXTOOL_ADD_MODE("-makecorrection",  "", DETTOOL_MODE_MAKECORRECTION, makecorrectionArgs);
-    PXTOOL_ADD_MODE("-tocorrectexp",    "", DETTOOL_MODE_TOCORRECTEXP, tocorrectexpArgs);
-    PXTOOL_ADD_MODE("-tocorrectimfile", "", DETTOOL_MODE_TOCORRECTIMFILE, tocorrectimfileArgs);
-    PXTOOL_ADD_MODE("-addcorrectimfile", "", DETTOOL_MODE_ADDCORRECTIMFILE, addcorrectimfileArgs);
-    PXTOOL_ADD_MODE("-raw",             "", DETTOOL_MODE_RAW,           rawArgs);
-    PXTOOL_ADD_MODE("-runs",            "", DETTOOL_MODE_RUNS,          runsArgs);
-    PXTOOL_ADD_MODE("-childlessrun",    "", DETTOOL_MODE_CHILDLESSRUN,  childlessrunArgs);
-    PXTOOL_ADD_MODE("-input",           "", DETTOOL_MODE_INPUT,         inputArgs);
-    PXTOOL_ADD_MODE("-toprocessedimfile", "", DETTOOL_MODE_TOPROCESSEDIMFILE, toprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-addprocessedimfile", "", DETTOOL_MODE_ADDPROCESSEDIMFILE,  addprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-processedimfile", "", DETTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
-    PXTOOL_ADD_MODE("-revertprocessedimfile", "", DETTOOL_MODE_REVERTPROCESSEDIMFILE, revertprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-toprocessedexp",  "", DETTOOL_MODE_TOPROCESSEDEXP,  toprocessedexpArgs);
-    PXTOOL_ADD_MODE("-addprocessedexp", "", DETTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
-    PXTOOL_ADD_MODE("-revertprocessedexp", "", DETTOOL_MODE_REVERTPROCESSEDEXP, revertprocessedexpArgs);
-    PXTOOL_ADD_MODE("-processedexp",    "", DETTOOL_MODE_PROCESSEDEXP, processedexpArgs);
-    PXTOOL_ADD_MODE("-tostacked",       "", DETTOOL_MODE_TOSTACKED,     tostackedArgs);
-    PXTOOL_ADD_MODE("-addstacked",      "", DETTOOL_MODE_ADDSTACKED,    addstackedArgs);
-    PXTOOL_ADD_MODE("-stacked",         "", DETTOOL_MODE_STACKED,       stackedArgs);
-    PXTOOL_ADD_MODE("-revertstacked",   "", DETTOOL_MODE_REVERTSTACKED,  revertstackedArgs);
-    PXTOOL_ADD_MODE("-tonormalize",     "", DETTOOL_MODE_TONORMALIZE,   tonormalizeArgs);
-    PXTOOL_ADD_MODE("-addnormalizedstat",     "", DETTOOL_MODE_ADDNORMALIZEDSTAT,   addnormstatArgs);
-    PXTOOL_ADD_MODE("-normalizedstat",  "", DETTOOL_MODE_NORMALIZEDSTAT,   normalizedstatArgs);
-    PXTOOL_ADD_MODE("-revertnormalizedstat",  "", DETTOOL_MODE_REVERTNORMALIZEDSTAT,   revertnormalizedstatArgs);
-
-    PXTOOL_ADD_MODE("-tonormalizedstat",      "", DETTOOL_MODE_TONORMALIZEDSTAT,    tonormstatArgs);
-    PXTOOL_ADD_MODE("-addnormalizedimfile", "", DETTOOL_MODE_ADDNORMALIZEDIMFILE,addnormalizedimfileArgs);
-    PXTOOL_ADD_MODE("-normalizedimfile","", DETTOOL_MODE_NORMALIZEDIMFILE, normalizedimfileArgs);
-    PXTOOL_ADD_MODE("-revertnormalizedimfile","", DETTOOL_MODE_REVERTNORMALIZEDIMFILE, revertnormalizedimfileArgs);
-    PXTOOL_ADD_MODE("-tonormalizedexp", "", DETTOOL_MODE_TONORMALIZEDEXP, tonormalizedexpArgs);
-    PXTOOL_ADD_MODE("-addnormalizedexp", "", DETTOOL_MODE_ADDNORMALIZEDEXP, addnormalizedexpArgs);
-    PXTOOL_ADD_MODE("-normalizedexp",   "", DETTOOL_MODE_NORMALIZEDEXP, normalizedexpArgs);
-    PXTOOL_ADD_MODE("-revertnormalizedexp","", DETTOOL_MODE_REVERTNORMALIZEDEXP, revertnormalizedexpArgs);
-    PXTOOL_ADD_MODE("-toresidimfile",   "", DETTOOL_MODE_TORESIDIMFILE, toresidimfileArgs);
-    PXTOOL_ADD_MODE("-addresidimfile",  "", DETTOOL_MODE_ADDRESIDIMFILE, addresidimfileArgs);
-    PXTOOL_ADD_MODE("-residimfile",     "", DETTOOL_MODE_RESIDIMFILE, residimfileArgs);
-    PXTOOL_ADD_MODE("-revertresidimfile", "", DETTOOL_MODE_REVERTRESIDIMFILE, revertresidimfileArgs);
-    PXTOOL_ADD_MODE("-toresidexp",      "", DETTOOL_MODE_TORESIDEXP,    toresidexpArgs);
-    PXTOOL_ADD_MODE("-addresidexp",     "", DETTOOL_MODE_ADDRESIDEXP,  addresidexpArgs);
-    PXTOOL_ADD_MODE("-residexp",        "", DETTOOL_MODE_RESIDEXP,     residexpArgs);
-    PXTOOL_ADD_MODE("-revertresidexp",  "", DETTOOL_MODE_REVERTRESIDEXP, revertresidexpArgs);
-    PXTOOL_ADD_MODE("-todetrunsummary",  "", DETTOOL_MODE_TODETRUNSUMMARY,  todetrunsummaryArgs);
-    PXTOOL_ADD_MODE("-updateresidexp", "", DETTOOL_MODE_UPDATERESIDEXP,updateresidexpArgs);
-    PXTOOL_ADD_MODE("-adddetrunsummary", "", DETTOOL_MODE_ADDDETRUNSUMMARY,adddetrunsummaryArgs);
-    PXTOOL_ADD_MODE("-detrunsummary", "", DETTOOL_MODE_DETRUNSUMMARY,detrunsummaryArgs);
-    PXTOOL_ADD_MODE("-revertdetrunsummary", "", DETTOOL_MODE_REVERTDETRUNSUMMARY, revertdetrunsummaryArgs);
-    PXTOOL_ADD_MODE("-updatedetrun", "", DETTOOL_MODE_UPDATEDETRUN, updatedetrunArgs);
-    PXTOOL_ADD_MODE("-rerun",           "", DETTOOL_MODE_RERUN,         rerunArgs);
-    PXTOOL_ADD_MODE("-register_detrend", "", DETTOOL_MODE_REGISTER_DETREND, register_detrendArgs);
-    PXTOOL_ADD_MODE("-register_detrend_imfile", "", DETTOOL_MODE_REGISTER_DETREND_IMFILE, register_detrend_imfileArgs);
+    PXOPT_ADD_MODE("-pending",         "list active detruns", DETTOOL_MODE_PENDING,       pendingArgs);
+    PXOPT_ADD_MODE("-definebytag",     "", DETTOOL_MODE_DEFINEBYTAG,   definebytagArgs);
+    PXOPT_ADD_MODE("-definebyquery",   "", DETTOOL_MODE_DEFINEBYQUERY, definebyqueryArgs);
+    PXOPT_ADD_MODE("-definebydetrun",  "", DETTOOL_MODE_DEFINEBYDETRUN, definebydetrunArgs);
+    PXOPT_ADD_MODE("-makecorrection",  "", DETTOOL_MODE_MAKECORRECTION, makecorrectionArgs);
+    PXOPT_ADD_MODE("-tocorrectexp",    "", DETTOOL_MODE_TOCORRECTEXP, tocorrectexpArgs);
+    PXOPT_ADD_MODE("-tocorrectimfile", "", DETTOOL_MODE_TOCORRECTIMFILE, tocorrectimfileArgs);
+    PXOPT_ADD_MODE("-addcorrectimfile", "", DETTOOL_MODE_ADDCORRECTIMFILE, addcorrectimfileArgs);
+    PXOPT_ADD_MODE("-raw",             "", DETTOOL_MODE_RAW,           rawArgs);
+    PXOPT_ADD_MODE("-runs",            "", DETTOOL_MODE_RUNS,          runsArgs);
+    PXOPT_ADD_MODE("-childlessrun",    "", DETTOOL_MODE_CHILDLESSRUN,  childlessrunArgs);
+    PXOPT_ADD_MODE("-input",           "", DETTOOL_MODE_INPUT,         inputArgs);
+    PXOPT_ADD_MODE("-toprocessedimfile", "", DETTOOL_MODE_TOPROCESSEDIMFILE, toprocessedimfileArgs);
+    PXOPT_ADD_MODE("-addprocessedimfile", "", DETTOOL_MODE_ADDPROCESSEDIMFILE,  addprocessedimfileArgs);
+    PXOPT_ADD_MODE("-processedimfile", "", DETTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
+    PXOPT_ADD_MODE("-revertprocessedimfile", "", DETTOOL_MODE_REVERTPROCESSEDIMFILE, revertprocessedimfileArgs);
+    PXOPT_ADD_MODE("-toprocessedexp",  "", DETTOOL_MODE_TOPROCESSEDEXP,  toprocessedexpArgs);
+    PXOPT_ADD_MODE("-addprocessedexp", "", DETTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
+    PXOPT_ADD_MODE("-revertprocessedexp", "", DETTOOL_MODE_REVERTPROCESSEDEXP, revertprocessedexpArgs);
+    PXOPT_ADD_MODE("-processedexp",    "", DETTOOL_MODE_PROCESSEDEXP, processedexpArgs);
+    PXOPT_ADD_MODE("-tostacked",       "", DETTOOL_MODE_TOSTACKED,     tostackedArgs);
+    PXOPT_ADD_MODE("-addstacked",      "", DETTOOL_MODE_ADDSTACKED,    addstackedArgs);
+    PXOPT_ADD_MODE("-stacked",         "", DETTOOL_MODE_STACKED,       stackedArgs);
+    PXOPT_ADD_MODE("-revertstacked",   "", DETTOOL_MODE_REVERTSTACKED,  revertstackedArgs);
+    PXOPT_ADD_MODE("-tonormalize",     "", DETTOOL_MODE_TONORMALIZE,   tonormalizeArgs);
+    PXOPT_ADD_MODE("-addnormalizedstat",     "", DETTOOL_MODE_ADDNORMALIZEDSTAT,   addnormstatArgs);
+    PXOPT_ADD_MODE("-normalizedstat",  "", DETTOOL_MODE_NORMALIZEDSTAT,   normalizedstatArgs);
+    PXOPT_ADD_MODE("-revertnormalizedstat",  "", DETTOOL_MODE_REVERTNORMALIZEDSTAT,   revertnormalizedstatArgs);
+
+    PXOPT_ADD_MODE("-tonormalizedstat",      "", DETTOOL_MODE_TONORMALIZEDSTAT,    tonormstatArgs);
+    PXOPT_ADD_MODE("-addnormalizedimfile", "", DETTOOL_MODE_ADDNORMALIZEDIMFILE,addnormalizedimfileArgs);
+    PXOPT_ADD_MODE("-normalizedimfile","", DETTOOL_MODE_NORMALIZEDIMFILE, normalizedimfileArgs);
+    PXOPT_ADD_MODE("-revertnormalizedimfile","", DETTOOL_MODE_REVERTNORMALIZEDIMFILE, revertnormalizedimfileArgs);
+    PXOPT_ADD_MODE("-tonormalizedexp", "", DETTOOL_MODE_TONORMALIZEDEXP, tonormalizedexpArgs);
+    PXOPT_ADD_MODE("-addnormalizedexp", "", DETTOOL_MODE_ADDNORMALIZEDEXP, addnormalizedexpArgs);
+    PXOPT_ADD_MODE("-normalizedexp",   "", DETTOOL_MODE_NORMALIZEDEXP, normalizedexpArgs);
+    PXOPT_ADD_MODE("-revertnormalizedexp","", DETTOOL_MODE_REVERTNORMALIZEDEXP, revertnormalizedexpArgs);
+    PXOPT_ADD_MODE("-toresidimfile",   "", DETTOOL_MODE_TORESIDIMFILE, toresidimfileArgs);
+    PXOPT_ADD_MODE("-addresidimfile",  "", DETTOOL_MODE_ADDRESIDIMFILE, addresidimfileArgs);
+    PXOPT_ADD_MODE("-residimfile",     "", DETTOOL_MODE_RESIDIMFILE, residimfileArgs);
+    PXOPT_ADD_MODE("-revertresidimfile", "", DETTOOL_MODE_REVERTRESIDIMFILE, revertresidimfileArgs);
+    PXOPT_ADD_MODE("-toresidexp",      "", DETTOOL_MODE_TORESIDEXP,    toresidexpArgs);
+    PXOPT_ADD_MODE("-addresidexp",     "", DETTOOL_MODE_ADDRESIDEXP,  addresidexpArgs);
+    PXOPT_ADD_MODE("-residexp",        "", DETTOOL_MODE_RESIDEXP,     residexpArgs);
+    PXOPT_ADD_MODE("-revertresidexp",  "", DETTOOL_MODE_REVERTRESIDEXP, revertresidexpArgs);
+    PXOPT_ADD_MODE("-todetrunsummary",  "", DETTOOL_MODE_TODETRUNSUMMARY,  todetrunsummaryArgs);
+    PXOPT_ADD_MODE("-updateresidexp", "", DETTOOL_MODE_UPDATERESIDEXP,updateresidexpArgs);
+    PXOPT_ADD_MODE("-adddetrunsummary", "", DETTOOL_MODE_ADDDETRUNSUMMARY,adddetrunsummaryArgs);
+    PXOPT_ADD_MODE("-detrunsummary", "", DETTOOL_MODE_DETRUNSUMMARY,detrunsummaryArgs);
+    PXOPT_ADD_MODE("-revertdetrunsummary", "", DETTOOL_MODE_REVERTDETRUNSUMMARY, revertdetrunsummaryArgs);
+    PXOPT_ADD_MODE("-updatedetrun", "", DETTOOL_MODE_UPDATEDETRUN, updatedetrunArgs);
+    PXOPT_ADD_MODE("-rerun",           "", DETTOOL_MODE_RERUN,         rerunArgs);
+    PXOPT_ADD_MODE("-register_detrend", "", DETTOOL_MODE_REGISTER_DETREND, register_detrendArgs);
+    PXOPT_ADD_MODE("-register_detrend_imfile", "", DETTOOL_MODE_REGISTER_DETREND_IMFILE, register_detrend_imfileArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/difftool.c
===================================================================
--- /trunk/ippTools/src/difftool.c	(revision 16169)
+++ /trunk/ippTools/src/difftool.c	(revision 16170)
@@ -97,49 +97,11 @@
 
     // required options
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    psString skycell_id = psMetadataLookupStr(&status, config->args, "-skycell_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -skycell_id");
-        return false;
-    }
-    if (!skycell_id) {
-        psError(PS_ERR_UNKNOWN, true, "-skycell_id is required");
-        return false;
-    }
-
-    psString tess_id = psMetadataLookupStr(&status, config->args, "-tess_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tess_id");
-        return false;
-    }
-    if (!tess_id) {
-        psError(PS_ERR_UNKNOWN, true, "-tess_id is required");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
-    }
+    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);
+
+    // default
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     diffRunRow *run = diffRunRowAlloc(
@@ -152,5 +114,4 @@
             tess_id
     );
-    psFree(registered);
     if (!run) {
         psError(PS_ERR_UNKNOWN, false, "failed to alloc diffRun object");
@@ -166,15 +127,4 @@
     run->diff_id = psDBLastInsertID(config->dbh);
 
-    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(run);
-            return false;
-        }
-    }
-
     if (!diffRunPrintObject(stdout, run, !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print object");
@@ -193,24 +143,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString diff_id = psMetadataLookupStr(&status, config->args, "-diff_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -diff_id");
-        return false;
-    }
-    if (!diff_id) {
-        psError(PS_ERR_UNKNOWN, true, "-diff_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;
-    }
+    // required options
+    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
     if (state) {
@@ -227,39 +160,14 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString diff_id = psMetadataLookupStr(&status, config->args, "-diff_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -diff_id");
-        return false;
-    }
-    if (!diff_id) {
-        psError(PS_ERR_UNKNOWN, true, "-diff_id is required");
-        return false;
-    }
-
-    psString stack_id = psMetadataLookupStr(&status, config->args, "-stack_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -stack_id");
-        return false;
-    }
-
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warp_id");
-        return false;
-    }
-
-    psString kind = psMetadataLookupStr(&status, config->args, "-kind");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -kind");
-        return false;
-    }
+    // required options
+    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
+
+    // optional
+    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", false, false);
+    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", false, false);
+    PXOPT_LOOKUP_STR(kind, config->args, "-kind", false, false);
 
     // defaults to false
-    bool template = psMetadataLookupBool(&status, config->args, "-template");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -template");
-        return false;
-    }
+    PXOPT_LOOKUP_BOOL(template, config->args, "-template", false);
 
     // must provide either stack_id or warp_id but not BOTH
@@ -345,4 +253,5 @@
     }
 
+    bool status;
     psS32 count = psMetadataLookupS32(&status, output->data[0], "count(diff_id)");
 
@@ -371,10 +280,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -425,14 +330,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -460,10 +355,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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("difftool_todiffskyfile.sql");
@@ -513,14 +404,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -548,26 +429,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString diff_id = psMetadataLookupStr(&status, config->args, "-diff_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -diff_id");
-        return false;
-    }
-    if (!diff_id) {
-        psError(PS_ERR_UNKNOWN, true, "-diff_id is required");
-        return false;
-    }
-
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -uri");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(diff_id, config->args, "-diff_id", true, false);
+
+    // default to 0
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
+
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
     if (code == 0 && !uri) {
         psError(PS_ERR_UNKNOWN, true, "-uri is required");
@@ -575,9 +441,5 @@
     }
 
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", true, false);
     if (code == 0 && !path_base) {
         psError(PS_ERR_UNKNOWN, true, "-path_base is required");
@@ -586,21 +448,7 @@
 
     // optional
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 good_frac = psMetadataLookupF64(&status, config->args, "-good_frac");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -good_frac");
-        return false;
-    }
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(good_frac, config->args, "-good_frac", false, false);
 
     if (!psDBTransaction(config->dbh)) {
@@ -647,10 +495,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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("difftool_skyfile.sql");
@@ -700,14 +544,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -791,7 +625,4 @@
 
 
-
-
-
 static bool definepoprunMode(pxConfig *config)
 {
@@ -799,45 +630,12 @@
 
     // required options
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    psString skycell_id = psMetadataLookupStr(&status, config->args, "-skycell_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -skycell_id");
-        return false;
-    }
-    if (!skycell_id) {
-        psError(PS_ERR_UNKNOWN, true, "-skycell_id is required");
-        return false;
-    }
-
-    psString tess_id = psMetadataLookupStr(&status, config->args, "-tess_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tess_id");
-        return false;
-    }
-    if (!tess_id) {
-        psError(PS_ERR_UNKNOWN, true, "-tess_id is required");
-        return false;
-    }
-
-    psString template_stack_id = psMetadataLookupStr(&status, config->args, "-template_stack_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -template_stack_id");
-        return false;
-    }
-    psString template_warp_id = psMetadataLookupStr(&status, config->args, "-template_warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -template_warp_id");
-        return false;
-    }
+    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(template_stack_id, config->args, "-template_stack_id", false, false);
+    PXOPT_LOOKUP_STR(template_warp_id, config->args, "-template_warp_id", false, false);
+
     if (template_stack_id && template_warp_id) {
         psError(PS_ERR_BAD_PARAMETER_VALUE, true, "Only one template can be defined.");
@@ -850,14 +648,6 @@
     }
 
-    psString input_stack_id = psMetadataLookupStr(&status, config->args, "-input_stack_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -input_stack_id");
-        return false;
-    }
-    psString input_warp_id = psMetadataLookupStr(&status, config->args, "-input_warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -input_warp_id");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(input_stack_id, config->args, "-input_stack_id", false, false);
+    PXOPT_LOOKUP_STR(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.");
@@ -870,30 +660,7 @@
     }
 
-    psString kind = NULL;
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
-    }
-
-    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;
-        }
-    }
+    // default
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     diffRunRow *run = diffRunRowAlloc(
@@ -906,5 +673,4 @@
             tess_id
     );
-    psFree(registered);
 
     if (!run) {
@@ -936,5 +702,5 @@
             skycell_id,
             tess_id,
-            kind
+            NULL    // kind
         )) {
         if (!psDBRollback(config->dbh)) {
@@ -953,5 +719,5 @@
             skycell_id,
             tess_id,
-            kind
+            NULL    // kind
         )) {
         if (!psDBRollback(config->dbh)) {
Index: /trunk/ippTools/src/difftoolConfig.c
===================================================================
--- /trunk/ippTools/src/difftoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/difftoolConfig.c	(revision 16170)
@@ -43,7 +43,5 @@
     }
 
-    psTime *time = psTimeGetNow(PS_TIME_TAI);
-    psString now = psTimeToISO(time);
-    psFree(time);
+    psTime *now = psTimeGetNow(PS_TIME_TAI);
 
     // -definerun
@@ -51,5 +49,5 @@
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,
             "define workdir (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,
@@ -155,5 +153,5 @@
     psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-workdir", 0,
             "define workdir (required)", NULL);
-    psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(definepoprunArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
     psMetadataAddStr(definepoprunArgs, PS_LIST_TAIL, "-skycell_id",  0,
@@ -177,13 +175,13 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-definerun",        "", DIFFTOOL_MODE_DEFINERUN,         definerunArgs);
-    PXTOOL_ADD_MODE("-updaterun",        "", DIFFTOOL_MODE_UPDATERUN,         updaterunArgs);
-    PXTOOL_ADD_MODE("-addinputskyfile",  "", DIFFTOOL_MODE_ADDINPUTSKYFILE,   addinputskyfileArgs);
-    PXTOOL_ADD_MODE("-inputskyfile",     "", DIFFTOOL_MODE_INPUTSKYFILE,      inputskyfileArgs);
-    PXTOOL_ADD_MODE("-todiffskyfile",    "", DIFFTOOL_MODE_TODIFFSKYFILE,     todiffskyfileArgs);
-    PXTOOL_ADD_MODE("-adddiffskyfile",   "", DIFFTOOL_MODE_ADDDIFFSKYFILE,    adddiffskyfileArgs);
-    PXTOOL_ADD_MODE("-diffskyfile",      "", DIFFTOOL_MODE_DIFFSKYFILE,       diffskyfileArgs);
-    PXTOOL_ADD_MODE("-revertdiffskyfile","", DIFFTOOL_MODE_REVERTDIFFSKYFILE, revertdiffskyfileArgs);
-    PXTOOL_ADD_MODE("-definepoprun",     "", DIFFTOOL_MODE_DEFINEPOPRUN,      definepoprunArgs);
+    PXOPT_ADD_MODE("-definerun",        "", DIFFTOOL_MODE_DEFINERUN,         definerunArgs);
+    PXOPT_ADD_MODE("-updaterun",        "", DIFFTOOL_MODE_UPDATERUN,         updaterunArgs);
+    PXOPT_ADD_MODE("-addinputskyfile",  "", DIFFTOOL_MODE_ADDINPUTSKYFILE,   addinputskyfileArgs);
+    PXOPT_ADD_MODE("-inputskyfile",     "", DIFFTOOL_MODE_INPUTSKYFILE,      inputskyfileArgs);
+    PXOPT_ADD_MODE("-todiffskyfile",    "", DIFFTOOL_MODE_TODIFFSKYFILE,     todiffskyfileArgs);
+    PXOPT_ADD_MODE("-adddiffskyfile",   "", DIFFTOOL_MODE_ADDDIFFSKYFILE,    adddiffskyfileArgs);
+    PXOPT_ADD_MODE("-diffskyfile",      "", DIFFTOOL_MODE_DIFFSKYFILE,       diffskyfileArgs);
+    PXOPT_ADD_MODE("-revertdiffskyfile","", DIFFTOOL_MODE_REVERTDIFFSKYFILE, revertdiffskyfileArgs);
+    PXOPT_ADD_MODE("-definepoprun",     "", DIFFTOOL_MODE_DEFINEPOPRUN,      definepoprunArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/flatcorr.c
===================================================================
--- /trunk/ippTools/src/flatcorr.c	(revision 16169)
+++ /trunk/ippTools/src/flatcorr.c	(revision 16170)
@@ -84,59 +84,14 @@
 
 
-#define ADDRENAMEPARAMSTR(from, to, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    psString str = psMetadataLookupStr(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (str) { \
-        if (!psMetadataAddStr(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, str)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMSTR(from, to, name) \
-  ADDRENAMEPARAMSTR(from, to, name, name, "==")
-
-#define ADDRENAMEPARAMF(from, to, type, oldname, newname, comment) \
-{ \
-    bool status = false; \
-    ps##type var = psMetadataLookup##type(&status, from, "-" oldname); \
-    if (!status) { \
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
-        return false; \
-    } \
-    if (!isnan(var)) { \
-        if (!psMetadataAdd##type(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
-            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
-            psFree(to); \
-            return false; \
-        } \
-    } \
-}
-
-#define ADDPARAMF(from, to, type, name) \
-  ADDRENAMEPARAMF(from, to, type, name, name, "==")
-
 static bool newrunMode(pxConfig *config)
 {
     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
-{
-    bool status = false;
-    psString var = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (var) {
-        if (!psMetadataAddS64(where, PS_LIST_TAIL, "exp_id", 0, "==", (psS64)atoll(var))) {
+    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);
@@ -144,42 +99,42 @@
         }
     }
-}
-    ADDPARAMSTR(config->args, where, "exp_name");
-    ADDRENAMEPARAMSTR(config->args, where, "inst", "camera", "==");
-    ADDPARAMSTR(config->args, where, "telescope");
-    ADDPARAMSTR(config->args, where, "dateobs_begin");
-    ADDPARAMSTR(config->args, where, "dateobs_end");
-    ADDPARAMSTR(config->args, where, "exp_tag");
-    ADDPARAMSTR(config->args, where, "exp_type");
-    ADDPARAMSTR(config->args, where, "filelevel");
-    ADDPARAMSTR(config->args, where, "reduction");
-    ADDPARAMSTR(config->args, where, "filter");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_min", "airmass", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "airmass_max", "airmass", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_min", "ra", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "ra_max", "ra", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_min", "decl", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "decl_max", "decl", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_min", "exp_time", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "exp_time_max", "exp_time", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_min", "sat_pixel_frac", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "sat_pixel_frac_max", "sat_pixel_frac", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_min", "bt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_max", "bt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_min", "bg_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_stdev_max", "bg_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_min", "bg_mean_stdev", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "bg_mean_stdev_max", "bg_mean_stdev", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_min", "alt", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "alt_max", "alt", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_min", "az", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "az_max", "az", "<");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_min", "ccd_temp", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "ccd_temp_max", "ccd_temp", "<");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_min", "posang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F64, "posang_max", "posang", "<");
-    ADDPARAMSTR(config->args, where, "object");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_min", "solang", ">=");
-    ADDRENAMEPARAMF(config->args, where, F32, "solang_max", "solang", "<");
+
+    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_TIME(config->args, where, "-dateobs_begin", "dateobs", ">=");
+    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_F64(config->args, where, "-ra_min", "ra", ">=");
+    PXOPT_COPY_F64(config->args, where, "-ra_max", "ra", "<");
+    PXOPT_COPY_F64(config->args, where, "-decl_min", "decl", ">=");
+    PXOPT_COPY_F64(config->args, where, "-decl_max", "decl", "<");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_min", "exp_time", ">=");
+    PXOPT_COPY_F32(config->args, where, "-exp_time_max", "exp_time", "<");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_min", "sat_pixel_frac", ">=");
+    PXOPT_COPY_F32(config->args, where, "-sat_pixel_frac_max", "sat_pixel_frac", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_min", "bt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_max", "bt", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_min", "bg_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_stdev_max", "bg_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_min", "bg_mean_stdev", ">=");
+    PXOPT_COPY_F64(config->args, where, "-bg_mean_stdev_max", "bg_mean_stdev", "<");
+    PXOPT_COPY_F64(config->args, where, "-alt_min", "alt", ">=");
+    PXOPT_COPY_F64(config->args, where, "-alt_max", "alt", "<");
+    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, "-posang_min", "posang", ">=");
+    PXOPT_COPY_F64(config->args, where, "-posang_max", "posang", "<");
+    PXOPT_COPY_STR(config->args, where, "-object", "object", "==");
+    PXOPT_COPY_F32(config->args, where, "-solang_min", "solang", ">=");
+    PXOPT_COPY_F32(config->args, where, "-solang_max", "solang", "<");
 
     if (where->list->n < 1) {
@@ -188,34 +143,11 @@
     }
 
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-set_workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_workdir");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-set_label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_label");
-        return false;
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-set_reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_reduction");
-        return false;
-    }
-
-    psString expgroup = psMetadataLookupStr(&status, config->args, "-set_expgroup");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_expgroup");
-        return false;
-    }
-
-    psString dvodb = psMetadataLookupStr(&status, config->args, "-set_dvodb");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -set_dvodb");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+    PXOPT_LOOKUP_STR(expgroup, config->args, "-set_expgroup", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", false, false);
+    PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
+    PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
 
     // find the exp_id of all the exposures that we want to queue up.
@@ -282,4 +214,5 @@
         psMetadata *md = output->data[i];
 
+        bool status;
         psS64 exp_id = psMetadataLookupS64(&status, md, "exp_id");
         if (!status) {
@@ -293,5 +226,5 @@
 
         // queue the exp
-        psS64 chip_id = pxchipQueueByExpTag(config, exp_id, workdir, label, reduction, expgroup, dvodb);
+        psS64 chip_id = pxchipQueueByExpTag(config, exp_id, workdir, label, reduction, expgroup, dvodb, tess_id, end_stage);
         if (!chip_id) {
             if (!psDBRollback(config->dbh)) {
@@ -339,4 +272,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     // create a temp table to hold completely processed chipRuns
@@ -408,14 +343,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         // negative simple so the default is true
@@ -437,11 +362,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -492,13 +412,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -526,16 +437,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString corr_id = psMetadataLookupStr(&status, config->args, "-corr_id");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -corr_id");
-        return false;
-    }
-
-    psString stats = psMetadataLookupStr(&status, config->args, "-stats");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -stats");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(corr_id, config->args, "-corr_id", true, false);
+    PXOPT_LOOKUP_STR(stats, config->args, "-stats", true, false);
 
     if (!psDBTransaction(config->dbh)) {
Index: /trunk/ippTools/src/flatcorrConfig.c
===================================================================
--- /trunk/ippTools/src/flatcorrConfig.c	(revision 16169)
+++ /trunk/ippTools/src/flatcorrConfig.c	(revision 16170)
@@ -43,7 +43,5 @@
     }
 
-    psTime *time = psTimeGetNow(PS_TIME_TAI);
-    psString now = psTimeToISO(time);
-    psFree(time);
+    psTime *now = psTimeGetNow(PS_TIME_TAI);
 
     // -newrun
@@ -58,7 +56,7 @@
     psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-telescope",  0,
             "search for telescope", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-dateobs_begin", 0,   
+    psMetadataAddTime(newrunArgs, PS_LIST_TAIL, "-dateobs_begin", 0,   
             "search for exposures by time (>=)", NULL);
-    psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-dateobs_end", 0,
+    psMetadataAddTime(newrunArgs, PS_LIST_TAIL, "-dateobs_end", 0,
             "search for exposures by time (<)", NULL);
     psMetadataAddStr(newrunArgs, PS_LIST_TAIL, "-exp_tag",  0,
@@ -165,11 +163,11 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-newrun",  "start a new flat correction run",
+    PXOPT_ADD_MODE("-newrun",  "start a new flat correction run",
         FLATCORR_MODE_NEWRUN,       newrunArgs);
-    PXTOOL_ADD_MODE("-pending", "show flat correction runs needing to be processed",
+    PXOPT_ADD_MODE("-pending", "show flat correction runs needing to be processed",
         FLATCORR_MODE_PENDING,      pendingArgs);
-    PXTOOL_ADD_MODE("-flatcorrimfile", "list all the exposures in flat correction runs",
+    PXOPT_ADD_MODE("-flatcorrimfile", "list all the exposures in flat correction runs",
         FLATCORR_MODE_FLATCORRIMFILE, flatcorrimfileArgs);
-    PXTOOL_ADD_MODE("-done",  "change a flat calibration run's state",
+    PXOPT_ADD_MODE("-done",  "change a flat calibration run's state",
         FLATCORR_MODE_DONE,         doneArgs);
 
Index: /trunk/ippTools/src/magictool.c
===================================================================
--- /trunk/ippTools/src/magictool.c	(revision 16169)
+++ /trunk/ippTools/src/magictool.c	(revision 16170)
@@ -262,44 +262,14 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    // required options
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-
-    psString dvodb = psMetadataLookupStr(&status, config->args, "-dvodb");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -dvodb");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
-    }
-
-   magicRunRow *run = magicRunRowAlloc(
+    // 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
@@ -325,15 +295,4 @@
     run->magic_id = magic_id;
 
-    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(run);
-            return false;
-        }
-    }
-
     if (!magicRunPrintObject(stdout, run, !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print object");
@@ -352,24 +311,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
-        return false;
-    }
-    if (!magic_id) {
-        psError(PS_ERR_UNKNOWN, true, "-magic_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;
-    }
+    // required
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
     if (state) {
@@ -386,34 +328,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
-        return false;
-    }
-    if (!magic_id) {
-        psError(PS_ERR_UNKNOWN, true, "-magic_id is required");
-        return false;
-    }
-
-    psString diff_id = psMetadataLookupStr(&status, config->args, "-diff_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -diff_id");
-        return false;
-    }
-    if (!diff_id) {
-        psError(PS_ERR_UNKNOWN, true, "-diff_id is required");
-        return false;
-    }
-
-    psString node = psMetadataLookupStr(&status, config->args, "-node");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -node");
-        return false;
-    }
-    if (!node) {
-        psError(PS_ERR_UNKNOWN, true, "-node is required");
-        return 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(
@@ -432,10 +348,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -486,14 +398,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -521,26 +423,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
-        return false;
-    }
-    if (!magic_id) {
-        psError(PS_ERR_UNKNOWN, true, "-magic_id is required");
-        return false;
-    }
-
-    psString dep_file = psMetadataLookupStr(&status, config->args, "-dep_file");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -dep_file");
-        return false;
-    }
-    if (!dep_file) {
-        psError(PS_ERR_UNKNOWN, true, "-dep_file is required");
-        return 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;
     }
 
@@ -619,10 +506,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", false, false);
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     // look for "inputs" that need to processed
@@ -632,5 +515,4 @@
         return false;
     }
-
 
     if (magic_id) {
@@ -718,4 +600,5 @@
     // convert the array of metadata into a pxTree structure
     for (long i = 0; i < psArrayLength(magicTree); i++) {
+        bool status;
         psString node = psMetadataLookupStr(&status, magicTree->data[i], "node");
         if (!status) {
@@ -743,14 +626,4 @@
     psFree(root);
 
-    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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -778,34 +651,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
-        return false;
-    }
-    if (!magic_id) {
-        psError(PS_ERR_UNKNOWN, true, "-magic_id is required");
-        return false;
-    }
-
-    psString node = psMetadataLookupStr(&status, config->args, "-node");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -node");
-        return false;
-    }
-    if (!node) {
-        psError(PS_ERR_UNKNOWN, true, "-node 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;
-    }
+    // required
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
+    PXOPT_LOOKUP_STR(node, config->args, "-node", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     if (!magicNodeResultInsert(config->dbh,
@@ -826,10 +673,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // look for "inputs" that need to processed
@@ -874,14 +717,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -909,24 +742,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
-        return false;
-    }
-    if (!magic_id) {
-        psError(PS_ERR_UNKNOWN, true, "-magic_id 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;
-    }
+    // required
+    PXOPT_LOOKUP_STR(magic_id, config->args, "-magic_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     if (!magicMaskInsert(config->dbh,
@@ -946,10 +762,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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("magictool_toskyfilemask.sql");
@@ -993,14 +805,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -1028,34 +830,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString magic_id = psMetadataLookupStr(&status, config->args, "-magic_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magic_id");
-        return false;
-    }
-    if (!magic_id) {
-        psError(PS_ERR_UNKNOWN, true, "-magic_id is required");
-        return false;
-    }
-
-    psString diff_id = psMetadataLookupStr(&status, config->args, "-diff_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -diff_id");
-        return false;
-    }
-    if (!diff_id) {
-        psError(PS_ERR_UNKNOWN, true, "-diff_id 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;
-    }
+    // 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(uri, config->args, "uri", true, false);
 
     if (!magicSkyfileMaskInsert(config->dbh,
@@ -1070,1130 +846,4 @@
     return true;
 }
-
-#if 0
-
-static psS64 definerunMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required options
-    bool status = false;
-    psString mode = psMetadataLookupStr(&status, config->args, "-mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -survey_mode");
-        return false;
-    }
-    if (!mode) {
-        psError(PS_ERR_UNKNOWN, true, "-mode is required");
-        return false;
-    }
-    // check mode
-    if (mode && !isValidMode(config, mode)) {
-        psError(PS_ERR_UNKNOWN, false, "invalud mode");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
-    }
-
-    warpRunRow *warpRun = warpRunRowAlloc(
-            0,          // ID
-            mode,
-            "reg",      // state
-            workdir,
-            NULL,       // dvodb
-            registered
-    );
-    psFree(registered);
-    if (!warpRun) {
-        psError(PS_ERR_UNKNOWN, false, "failed to alloc warpRun object");
-        return true;
-    }
-    if (!warpRunInsertObject(config->dbh, warpRun)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(warpRun);
-        return true;
-    }
-
-    // get the assigned warp_id
-    psS64 warp_id = psDBLastInsertID(config->dbh);
-    warpRun->warp_id = warp_id;
-
-    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(warpRun);
-            return false;
-        }
-    }
-
-    if (!warpRunPrintObject(stdout, warpRun, !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print object");
-            psFree(warpRun);
-            return false;
-    }
-
-    psFree(warpRun);
-
-    return warp_id;
-}
-
-static bool runoneMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psS64 warp_id = definerunMode(config);
-    if (!warp_id) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "failed to define warpRun");
-        return false;
-    }
-
-    psString warp_id_str = psDBIntToString(warp_id);
-    if (!psMetadataAddStr(config->args, PS_LIST_TAIL, "-warp_id", 0, NULL, warp_id_str)) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "failed to add item warp_id");
-        psFree(warp_id_str);
-        return false;
-    }
-    psFree(warp_id_str);
-
-    if (!addinputexpMode(config)) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "failed to add cam_id to warpRun");
-        return false;
-    }
-    if (!setwarpRunState(config, warp_id, "run")) {
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "failed to set warpRun.state to run");
-        return false;
-    }
-
-    // point of no return
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-static bool updaterunMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warpt_id");
-        return false;
-    }
-    if (!warp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-warp_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;
-    }
-
-    if (state) {
-        // set detRun.state to state
-        return setwarpRunState(config, (psS64)atoll(warp_id), state);
-    }
-
-    return true;
-}
-
-
-static bool addinputexpMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warp_id");
-        return false;
-    }
-    if (!warp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-warp_id is required");
-        return false;
-    }
-
-    psString cam_id = psMetadataLookupStr(&status, config->args, "-cam_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -cam_id");
-        return false;
-    }
-    if (!cam_id) {
-        psError(PS_ERR_UNKNOWN, true, "-cam_id is required");
-        return false;
-    }
-
-    // defaults to false
-    bool magiced = psMetadataLookupBool(&status, config->args, "-magiced");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magiced");
-        return false;
-    }
-
-    // XXX need to validate the warp_id here
-    // XXX instead of validiting it here we should just use forgein key
-    // constrants
-    if (!warpInputExpInsert(config->dbh,
-            (psS64)atoll(warp_id),
-            (psS64)atoll(cam_id),
-            magiced
-        )) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-
-static bool expMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    // find all rawImfiles matching the default query
-    psString query = pxDataGet("warptool_exp.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpInputExp");
-        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("warptool", 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");
-            return false;
-        }
-    }
-
-    if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "warpInputExp", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool imfileMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    // find all rawImfiles matching the default query
-    psString query = pxDataGet("warptool_imfile.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpInputExp");
-        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("warptool", 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");
-            return false;
-        }
-    }
-
-    if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "warpInputImfile", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool tooverlapMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    // find all rawImfiles matching the default query
-    psString query = pxDataGet("warptool_tooverlap.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpInputExp");
-        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("warptool", 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");
-            return false;
-        }
-    }
-
-    if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "warpInputExp", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool addoverlapMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psString mapfile = psMetadataLookupStr(&status, config->args, "-mapfile");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -mapfile");
-        return false;
-    }
-    if (!mapfile) {
-        psError(PS_ERR_UNKNOWN, true, "-mapfile is required");
-        return false;
-    }
-
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    if (!parseAndInsertSkyCellMap(config, mapfile)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to inject mapfile: %s into the database", mapfile);
-        // rollback
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        return false;
-    }
-
-    // point of no return
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-
-static bool parseAndInsertSkyCellMap(pxConfig *config, const char *mapfile)
-{
-    unsigned int nFail = 0;
-    psMetadata *skycells = psMetadataConfigRead(NULL, &nFail, mapfile, false);
-    if (!skycells) {
-        psError(PS_ERR_UNKNOWN, false, "failed to parse mapfile: %s", mapfile);
-        return false;
-    }
-    if (nFail) {
-        psError(PS_ERR_UNKNOWN, false, "there were %d errors parsing mapfile: %s", nFail, mapfile);
-        psFree(skycells);
-        return false;
-    }
-
-    psMetadataItem *item = NULL;
-    psMetadataIterator *iter = psMetadataIteratorAlloc(skycells, 0, NULL);
-    while ((item = psMetadataGetAndIncrement(iter))) {
-        if (item->type != PS_DATA_METADATA) {
-            psError(PS_ERR_UNKNOWN, false, "mapfile: %s is in the wrong format", mapfile);
-            psFree(iter);
-            psFree(skycells);
-            return false;
-        }
-
-        psMetadata *sc = item->data.md;
-        // this conversion isn't strictly nessicary but it's an easy way of
-        // validating the format
-        warpSkyCellMapRow *row = warpSkyCellMapObjectFromMetadata(sc);
-        if (!row) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert mapfile: %s metdata entry into a warpSkyCellMap object", mapfile);
-            psFree(iter);
-            psFree(skycells);
-            return false;
-        }
-
-        if (!warpSkyCellMapInsertObject(config->dbh, row)) {
-            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");
-            }
-            psFree(row);
-            psFree(iter);
-            psFree(skycells);
-            return false;
-        }
-
-        psFree(row);
-    }
-    psFree(iter);
-    psFree(skycells);
-
-    return true;
-}
-
-
-static bool scmapMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    // find all rawImfiles matching the default query
-    psString query = pxDataGet("warptool_scmap.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpSkyCellMap");
-        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("warptool", 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");
-            return false;
-        }
-    }
-
-    if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "warpSkyCellMap", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool towarpedMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    // find all rawImfiles matching the default query
-    psString query = pxDataGet("warptool_towarped.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpSkyCellMap");
-        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("warptool", 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");
-            return false;
-        }
-    }
-
-    if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "warpPendingSkyCell", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool addwarpedMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warp_id");
-        return false;
-    }
-    if (!warp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-warp_id is required");
-        return false;
-    }
-
-    psString skycell_id = psMetadataLookupStr(&status, config->args, "-skycell_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -skycell_id");
-        return false;
-    }
-    if (!skycell_id) {
-        psError(PS_ERR_UNKNOWN, true, "-skycell_id is required");
-        return false;
-    }
-
-    psString tess_id = psMetadataLookupStr(&status, config->args, "-tess_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tess_id");
-        return false;
-    }
-    if (!tess_id) {
-        psError(PS_ERR_UNKNOWN, true, "-tess_id 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 path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
-    if (!path_base) {
-        psError(PS_ERR_UNKNOWN, true, "-path_base is required");
-        return false;
-    }
-
-    // optional
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 pixel_fill = psMetadataLookupF64(&status, config->args, "-pixel_fill");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -pixel_fill");
-        return false;
-    }
-
-    // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    // we don't want to insert the last skyfile in a run but then not mark the
-    // run as 'stop'
-    if (!psDBTransaction(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    // XXX need to validate that this coresponds to an warpInputImfile
-    if (!warpSkyfileInsert(config->dbh,
-            (psS64)atoll(warp_id),
-            skycell_id,
-            tess_id,
-            uri,
-            path_base,
-            bg,
-            bg_stdev,
-            pixel_fill,
-            code
-        )) {
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    if (!warpCompletedRuns(config)) {
-        if (!psDBRollback(config->dbh)) {
-            psError(PS_ERR_UNKNOWN, false, "database error");
-        }
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    // point of no return
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-bool warpCompletedRuns(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // XXX this SQL has not been broken out to into seperate files as the MYSQL
-    // < 5 & MYSQL 5 versions need to be kept in sync
-#if MYSQL5
-    // XXX at MySQL 4.1.21 (probably all of 4.1.x) chokes and dies on this
-    // statement as it thinks it is trying to select from the table being
-    // updated. The 4.1 manual says that nested sub-queries are explicited
-    // allowed to do this with update statements as a temporary table is
-    // created so that you are not actually selecting from the table you are
-    // modifying.
-    char *query =
-        "UPDATE warpRun\n"
-        "   SET warpRun.state = 'stop'\n"
-        " WHERE\n"
-        "   warpRun.warp_id =\n"
-        "   (SELECT DISTINCT\n"
-        "       warp_id\n"
-        "   FROM\n"
-        "       (SELECT DISTINCT\n"
-        "           warpRun.warp_id,\n"
-        "           warpSkyCellMap.warp_id as foo,\n"
-        "           warpSkyfile.warp_id as bar\n"
-        "       FROM warpRun\n"
-        "       JOIN warpSkyCellMap\n"
-        "           USING(warp_id)\n"
-        "       LEFT JOIN warpSkyfile\n"
-        "           USING(warp_id, skycell_id, tess_id)\n"
-        "       WHERE\n"
-        "           warpRun.state = 'run'\n"
-        "       GROUP BY\n"
-        "           warpRun.warp_id\n"
-        "       HAVING\n"
-        "       COUNT(warpSkyCellMap.warp_id) = COUNT(warpSkyfile.warp_id)\n"
-        "       ) as Foo\n"
-        "   )\n";
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-#else // if MYSQL5
-{
-    char *query =
-        "CREATE TEMPORARY TABLE finished\n"
-        " (warp_id INT, PRIMARY KEY(warp_id)) ENGINE=MEMORY\n";
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-}
-
-{
-    char *query =
-        "INSERT INTO finished\n"
-        " SELECT\n"
-        "   warp_id\n"
-        " FROM\n"
-        "   (SELECT DISTINCT\n"
-        "       warpRun.warp_id,\n"
-        "       warpSkyCellMap.warp_id as foo,\n"
-        "       warpSkyfile.warp_id as bar\n"
-        "   FROM warpRun\n"
-        "   JOIN warpSkyCellMap\n"
-        "       USING(warp_id)\n"
-        "   LEFT JOIN warpSkyfile\n"
-        "       USING(warp_id, skycell_id, tess_id)\n"
-        "   WHERE\n"
-        "       warpRun.state = 'run'\n"
-        "   GROUP BY\n"
-        "       warpRun.warp_id\n"
-        "   HAVING\n"
-        "       COUNT(warpSkyCellMap.warp_id) = COUNT(warpSkyfile.warp_id)\n"
-        " ) as Foo \n";
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-}
-
-{
-    char *query =
-        "UPDATE warpRun\n"
-        "   SET warpRun.state = 'stop'\n"
-        " WHERE\n"
-        "   warpRun.warp_id =\n"
-        "   (SELECT DISTINCT\n"
-        "       warp_id\n"
-        "   FROM finished\n"
-        "   )\n";
-
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-}
-#endif // if MYSQL5
-
-    return true;
-}
-
-static bool warpedMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    // find all rawImfiles matching the default query
-    psString query = pxDataGet("warptool_warped.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpSkyfile");
-        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("warptool", 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");
-            return false;
-        }
-    }
-
-    if (psArrayLength(output)) {
-        if (!convertIdToStr(output)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to convert id fields into a strings");
-            psFree(output);
-            return false;
-        }
-
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "warpSkyfile", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-
-static bool revertwarpedMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    psString query = pxDataGet("warptool_revertwarped.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "warpSkyfile");
-        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;
-}
-#endif
 
 
@@ -2224,28 +874,4 @@
 }
 
-
-#if 0
-static bool isValidMode(pxConfig *config, const char *mode)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(mode, false);
-
-    // check that state is a valid string value
-    if (!(
-            (strncmp(mode, "warp", 5) == 0)
-            || (strncmp(mode, "diff", 5) == 0)
-            || (strncmp(mode, "stack", 6) == 0)
-            || (strncmp(mode, "magic", 6) == 0)
-        )
-    ) {
-        psError(PS_ERR_UNKNOWN, false,
-                "invalid warpRun mode: %s", mode);
-        return false;
-    }
-
-    return true;
-}
-#endif
-
 static bool parseAndInsertNodeDeps(pxConfig *config, psS64 magic_id, const char *filename)
 {
Index: /trunk/ippTools/src/magictoolConfig.c
===================================================================
--- /trunk/ippTools/src/magictoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/magictoolConfig.c	(revision 16170)
@@ -45,7 +45,5 @@
     }
 
-    psTime *time = psTimeGetNow(PS_TIME_TAI);
-    psString now = psTimeToISO(time);
-    psFree(time);
+    psTime *now = psTimeGetNow(PS_TIME_TAI);
 
     // -queue
@@ -60,5 +58,5 @@
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-dvodb", 0,
             "define dvodb", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
     psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,
@@ -162,16 +160,16 @@
     psMetadata *modes   = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-queue",           "", MAGICTOOL_MODE_QUEUE,           queueArgs);
-    PXTOOL_ADD_MODE("-definerun",       "", MAGICTOOL_MODE_DEFINERUN,       definerunArgs);
-    PXTOOL_ADD_MODE("-updaterun",       "", MAGICTOOL_MODE_UPDATERUN,       updaterunArgs);
-    PXTOOL_ADD_MODE("-addinputskyfile", "", MAGICTOOL_MODE_ADDINPUTSKYFILE, addinputskyfileArgs);
-    PXTOOL_ADD_MODE("-inputskyfile",    "", MAGICTOOL_MODE_INPUTSKYFILE,    inputskyfileArgs);
-    PXTOOL_ADD_MODE("-inputtree",       "", MAGICTOOL_MODE_INPUTTREE,       inputtreeArgs);
-    PXTOOL_ADD_MODE("-toprocess",       "", MAGICTOOL_MODE_TOPROCESS,       toprocessArgs);
-    PXTOOL_ADD_MODE("-addresult",       "", MAGICTOOL_MODE_ADDRESULT,       addresultArgs);
-    PXTOOL_ADD_MODE("-tomask",          "", MAGICTOOL_MODE_TOMASK,          tomaskArgs);
-    PXTOOL_ADD_MODE("-addmask",         "", MAGICTOOL_MODE_ADDMASK,         addmaskArgs);
-    PXTOOL_ADD_MODE("-toskyfilemask",   "", MAGICTOOL_MODE_TOSKYFILEMASK,   toskyfilemaskArgs);
-    PXTOOL_ADD_MODE("-addskyfilemask",  "", MAGICTOOL_MODE_ADDSKYFILEMASK,  addskyfilemaskArgs);
+    PXOPT_ADD_MODE("-queue",           "", MAGICTOOL_MODE_QUEUE,           queueArgs);
+    PXOPT_ADD_MODE("-definerun",       "", MAGICTOOL_MODE_DEFINERUN,       definerunArgs);
+    PXOPT_ADD_MODE("-updaterun",       "", MAGICTOOL_MODE_UPDATERUN,       updaterunArgs);
+    PXOPT_ADD_MODE("-addinputskyfile", "", MAGICTOOL_MODE_ADDINPUTSKYFILE, addinputskyfileArgs);
+    PXOPT_ADD_MODE("-inputskyfile",    "", MAGICTOOL_MODE_INPUTSKYFILE,    inputskyfileArgs);
+    PXOPT_ADD_MODE("-inputtree",       "", MAGICTOOL_MODE_INPUTTREE,       inputtreeArgs);
+    PXOPT_ADD_MODE("-toprocess",       "", MAGICTOOL_MODE_TOPROCESS,       toprocessArgs);
+    PXOPT_ADD_MODE("-addresult",       "", MAGICTOOL_MODE_ADDRESULT,       addresultArgs);
+    PXOPT_ADD_MODE("-tomask",          "", MAGICTOOL_MODE_TOMASK,          tomaskArgs);
+    PXOPT_ADD_MODE("-addmask",         "", MAGICTOOL_MODE_ADDMASK,         addmaskArgs);
+    PXOPT_ADD_MODE("-toskyfilemask",   "", MAGICTOOL_MODE_TOSKYFILEMASK,   toskyfilemaskArgs);
+    PXOPT_ADD_MODE("-addskyfilemask",  "", MAGICTOOL_MODE_ADDSKYFILEMASK,  addskyfilemaskArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/pxcam.c
===================================================================
--- /trunk/ippTools/src/pxcam.c	(revision 16169)
+++ /trunk/ippTools/src/pxcam.c	(revision 16170)
@@ -58,9 +58,11 @@
 bool pxcamQueueByChipID(pxConfig *config,
                     psS64 chip_id,
-                    psString workdir,
-                    psString label,
-                    psString recipe,
-                    psString expgroup,
-                    psString dvodb)
+                    char *workdir,
+                    char *label,
+                    char *recipe,
+                    char *expgroup,
+                    char *dvodb,
+                    char *tess_id,
+                    char *end_stage)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -88,4 +90,6 @@
                 expgroup ? expgroup : "NULL",
                 dvodb    ? dvodb    : "NULL",
+                tess_id  ? tess_id  : "NULL",
+                end_stage ? end_stage : "NULL",
                 (long long)chip_id
     )) {
Index: /trunk/ippTools/src/pxcam.h
===================================================================
--- /trunk/ippTools/src/pxcam.h	(revision 16169)
+++ /trunk/ippTools/src/pxcam.h	(revision 16170)
@@ -29,9 +29,11 @@
 bool pxcamQueueByChipID(pxConfig *config,
                         psS64 chip_id,
-                        psString workdir,
-                        psString label,
-                        psString recipe,
-                        psString expgroup,
-                        psString dvodb);
+                        char *workdir,
+                        char *label,
+                        char *recipe,
+                        char *expgroup,
+                        char *dvodb,
+                        char *tess_id,
+                        char *end_stage);
 
 #endif // PXCAM_H
Index: /trunk/ippTools/src/pxchip.c
===================================================================
--- /trunk/ippTools/src/pxchip.c	(revision 16169)
+++ /trunk/ippTools/src/pxchip.c	(revision 16170)
@@ -58,9 +58,11 @@
 psS64 pxchipQueueByExpTag(pxConfig *config,
                          psS64 exp_id,
-                         psString workdir,
-                         psString label,
-                         psString reduction,
-                         psString expgroup,
-                         psString dvodb)
+                         char *workdir,
+                         char *label,
+                         char *reduction,
+                         char *expgroup,
+                         char *dvodb,
+                         char *tess_id,
+                         char *end_stage)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -76,5 +78,7 @@
             reduction,
             expgroup,
-            dvodb)
+            dvodb,
+            tess_id,
+            end_stage)
     ) {
         psError(PS_ERR_UNKNOWN, false, "database error");
Index: /trunk/ippTools/src/pxchip.h
===================================================================
--- /trunk/ippTools/src/pxchip.h	(revision 16169)
+++ /trunk/ippTools/src/pxchip.h	(revision 16170)
@@ -29,9 +29,11 @@
 psS64 pxchipQueueByExpTag(pxConfig *config,
                          psS64 exp_id,
-                         psString workdir,
-                         psString label,
-                         psString reduction,
-                         psString expgroup,
-                         psString dvodb);
+                         char *workdir,
+                         char *label,
+                         char *reduction,
+                         char *expgroup,
+                         char *dvodb,
+                         char *tess_id,
+                         char *end_stage);
 
 #endif // PXCHIP_H
Index: /trunk/ippTools/src/pxconfig.c
===================================================================
--- /trunk/ippTools/src/pxconfig.c	(revision 16169)
+++ /trunk/ippTools/src/pxconfig.c	(revision 16170)
@@ -197,4 +197,5 @@
                 goto ARG_REQUIRED;
             case PS_DATA_STRING:
+            case PS_DATA_TIME:
             case PS_DATA_METADATA:
                 if (item->data.V) {
Index: /trunk/ippTools/src/pxinject.c
===================================================================
--- /trunk/ippTools/src/pxinject.c	(revision 16169)
+++ /trunk/ippTools/src/pxinject.c	(revision 16170)
@@ -79,48 +79,13 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString tmp_exp_name = psMetadataLookupStr(&status, config->args, "-tmp_exp_name");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tmp_exp_name");
-        return false;
-    }
-    if (!tmp_exp_name) {
-        psError(PS_ERR_UNKNOWN, true, "-tmp_exp_name is required");
-        return false;
-    }
-    psString tmp_camera = psMetadataLookupStr(&status, config->args, "-tmp_inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tmp_inst");
-        return false;
-    }
-    if (!tmp_camera) {
-        psError(PS_ERR_UNKNOWN, true, "-tmp_inst is required");
-        return false;
-    }
-    psString tmp_telescope = psMetadataLookupStr(&status, config->args, "-tmp_telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tmp_telescope");
-        return false;
-    }
-    if (!tmp_telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-tmp_telescope is required");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reduction");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(tmp_exp_name, config->args, "-tmp_exp_name", true, false);
+    PXOPT_LOOKUP_STR(tmp_camera, config->args, "-tmp_inst", true, false);
+    PXOPT_LOOKUP_STR(tmp_telescope, config->args, "-tmp_telescope", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", 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_BOOL(simple, config->args, "-simple", false);
 
     if (!newExpInsert(config->dbh,
@@ -132,5 +97,8 @@
                 workdir,
                 "dirty",
-                reduction
+                reduction,
+                dvodb,
+                tess_id,
+                end_stage
             )
         ) {
@@ -150,15 +118,4 @@
     psFree(exp_id);
 
-    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(md);
-            return false;
-        }
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadata(stdout, md, !simple)) {
@@ -177,43 +134,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
-        return false;
-    }
-#if 0
-    psString class = psMetadataLookupStr(&status, config->args, "-class");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class");
-        return false;
-    }
-    if (!class) {
-        psError(PS_ERR_UNKNOWN, true, "-class is required");
-        return false;
-    }
-#endif
-    psString tmp_class_id = psMetadataLookupStr(&status, config->args, "-tmp_class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tmp_class_id");
-        return false;
-    }
-    if (!tmp_class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-tmp_class_id 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;
-    }
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(tmp_class_id, config->args, "-tmp_class_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     // insert with error flag state set to 0 (no errors)
@@ -231,24 +152,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_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;
-    }
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
     if (state) {
Index: /trunk/ippTools/src/pxinjectConfig.c
===================================================================
--- /trunk/ippTools/src/pxinjectConfig.c	(revision 16169)
+++ /trunk/ippTools/src/pxinjectConfig.c	(revision 16170)
@@ -55,4 +55,10 @@
     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);
     psMetadataAddBool(newExpArgs, PS_LIST_TAIL, "-simple",  0,
             "use the simple output format", false);
@@ -78,7 +84,7 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-newExp",      "", PXINJECT_MODE_NEWEXP,       newExpArgs);
-    PXTOOL_ADD_MODE("-newImfile",   "", PXINJECT_MODE_NEWIMFILE,    newImfileArgs);
-    PXTOOL_ADD_MODE("-updatenewExp",   "", PXINJECT_MODE_UPDATENEWEXP,    updatenewExpArgs);
+    PXOPT_ADD_MODE("-newExp",      "", PXINJECT_MODE_NEWEXP,       newExpArgs);
+    PXOPT_ADD_MODE("-newImfile",   "", PXINJECT_MODE_NEWIMFILE,    newImfileArgs);
+    PXOPT_ADD_MODE("-updatenewExp",   "", PXINJECT_MODE_UPDATENEWEXP,    updatenewExpArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/pxtools.h
===================================================================
--- /trunk/ippTools/src/pxtools.h	(revision 16169)
+++ /trunk/ippTools/src/pxtools.h	(revision 16170)
@@ -51,5 +51,5 @@
 bool pxGetOptions(FILE *stream, int argc, char **argv, pxConfig *config, psMetadata *modes, psMetadata *argSets);
 
-#define PXTOOL_ADD_MODE(option, comment, modeval, argset) \
+#define PXOPT_ADD_MODE(option, comment, modeval, argset) \
 { \
     if (!psMetadataAddMetadata(argSets, PS_LIST_TAIL, option, 0, comment, argset)) {;\
@@ -63,3 +63,188 @@
 }
 
+#define PXOPT_LOOKUP_STR(var, md, key, required, ret) \
+psString var; \
+{ \
+    bool status; \
+ \
+    var = psMetadataLookupStr(&status, md, key); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", key); \
+        return ret; \
+    } \
+ \
+    if (required && (!var)) { \
+        psError(PS_ERR_UNKNOWN, true, "%s is required", key); \
+        return ret; \
+    } \
+}
+
+#define PXOPT_LOOKUP_F(var, md, key, type, required, ret) \
+ps##type var; \
+{ \
+    bool status; \
+ \
+    var = psMetadataLookup##type(&status, md, key); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", key); \
+        return ret; \
+    } \
+ \
+    if (required && isnan(var)) { \
+        psError(PS_ERR_UNKNOWN, true, "%s is required", key); \
+        return ret; \
+    } \
+}
+
+#define PXOPT_LOOKUP_F32(var, md, key, required, ret) \
+    PXOPT_LOOKUP_F(var, md, key, F64, required, ret)
+
+#define PXOPT_LOOKUP_F64(var, md, key, required, ret) \
+    PXOPT_LOOKUP_F(var, md, key, F64, required, ret)
+
+#define PXOPT_LOOKUP_PRIMITIVE(var, md, key, type, suffix, max, required, ret) \
+type var; \
+{ \
+    bool status; \
+ \
+    var = psMetadataLookup##suffix(&status, md, key); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", key); \
+        return ret; \
+    } \
+ \
+    if (required && (var == max)) { \
+        psError(PS_ERR_UNKNOWN, true, "%s is required", key); \
+        return ret; \
+    } \
+}
+
+#define PXOPT_LOOKUP_S16(var, md, key, required, ret) \
+    PXOPT_LOOKUP_PRIMITIVE(var, md, key, psS16, S16, INT16_MAX, required, ret)
+
+#define PXOPT_LOOKUP_S32(var, md, key, required, ret) \
+    PXOPT_LOOKUP_PRIMITIVE(var, md, key, psS32, S32, INT32_MAX, required, ret)
+
+#define PXOPT_LOOKUP_S64(var, md, key, required, ret) \
+    PXOPT_LOOKUP_PRIMITIVE(var, md, key, psS64, S64, INT64_MAX, required, ret)
+
+#define PXOPT_LOOKUP_U16(var, md, key, required, ret) \
+    PXOPT_LOOKUP_PRIMITIVE(var, md, key, psU16, U16, UINT16_MAX, required, ret)
+
+#define PXOPT_LOOKUP_U32(var, md, key, required, ret) \
+    PXOPT_LOOKUP_PRIMITIVE(var, md, key, psU32, U32, UINT32_MAX, required, ret)
+
+#define PXOPT_LOOKUP_U64(var, md, key, required, ret) \
+    PXOPT_LOOKUP_PRIMITIVE(var, md, key, psU64, U64, UINT64_MAX, required, ret)
+
+#define PXOPT_LOOKUP_TIME(var, md, key, required, ret) \
+psTime *var; \
+{ \
+    bool status; \
+ \
+    var = psMetadataLookupTime(&status, md, key); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", key); \
+        return ret; \
+    } \
+ \
+    if (required && (!var)) { \
+        psError(PS_ERR_UNKNOWN, true, "%s is required", key); \
+        return ret; \
+    } \
+}
+
+#define PXOPT_LOOKUP_BOOL(var, md, key, ret) \
+bool var; \
+{ \
+    bool status; \
+ \
+    var = psMetadataLookupBool(&status, md, key); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for %s", key); \
+        return ret; \
+    } \
+}
+
+// XXX the PXOPT_COPY_* macros free 'to' on error
+
+#define PXOPT_COPY_PRIMITIVE(from, to, type, suffix, oldname, newname, comment) \
+{ \
+    bool status = false; \
+    type var = psMetadataLookup##suffix(&status, from, oldname); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for " oldname); \
+        return false; \
+    } \
+    if (!psMetadataAdd##suffix(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
+        psFree(to); \
+        return false; \
+    } \
+}
+
+#define PXOPT_COPY_V(from, to, type, suffix, oldname, newname, comment) \
+{ \
+    bool status = false; \
+    type var = psMetadataLookup##suffix(&status, from, oldname); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for " oldname); \
+        return false; \
+    } \
+    if (var) { \
+        if (!psMetadataAdd##suffix(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
+            psFree(to); \
+            return false; \
+        } \
+    }\
+}
+
+#define PXOPT_COPY_F(from, to, type, oldname, newname, comment) \
+{ \
+    bool status = false; \
+    ps##type var = psMetadataLookup##type(&status, from, oldname); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for " oldname); \
+        return false; \
+    } \
+    if (!isnan(var)) { \
+        if (!psMetadataAdd##type(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, var)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
+            psFree(to); \
+            return false; \
+        } \
+    } \
+}
+
+#define PXOPT_COPY_F32(from, to, oldname, newname, comment) \
+  PXOPT_COPY_F(from, to, F32, oldname, newname, comment)
+
+#define PXOPT_COPY_F64(from, to, oldname, newname, comment) \
+  PXOPT_COPY_F(from, to, F64, oldname, newname, comment)
+
+#define PXOPT_COPY_TIME(from, to, oldname, newname, comment) \
+  PXOPT_COPY_V(from, to, psTime *, Time, oldname, newname, comment)
+
+#define PXOPT_COPY_STR(from, to, oldname, newname, comment) \
+  PXOPT_COPY_V(from, to, psString, Str, oldname, newname, comment)
+
+#define PXOPT_COPY_S16(from, to, oldname, newname, comment) \
+  PXOPT_COPY_PRIMITIVE(from, to, psS16, S16, oldname, newname, comment)
+
+#define PXOPT_COPY_S32(from, to, oldname, newname, comment) \
+  PXOPT_COPY_PRIMITIVE(from, to, psS32, S32, oldname, newname, comment)
+
+#define PXOPT_COPY_S64(from, to, oldname, newname, comment) \
+  PXOPT_COPY_PRIMITIVE(from, to, psS64, S64, oldname, newname, comment)
+
+#define PXOPT_COPY_U16(from, to, oldname, newname, comment) \
+  PXOPT_COPY_PRIMITIVE(from, to, psU16, U16, oldname, newname, comment)
+
+#define PXOPT_COPY_U32(from, to, oldname, newname, comment) \
+  PXOPT_COPY_PRIMITIVE(from, to, psU32, U32, oldname, newname, comment)
+
+#define PXOPT_COPY_U64(from, to, oldname, newname, comment) \
+  PXOPT_COPY_PRIMITIVE(from, to, psU64, U64, oldname, newname, comment)
+
 #endif // PXTOOLS_H
Index: /trunk/ippTools/src/pzgetexp.c
===================================================================
--- /trunk/ippTools/src/pzgetexp.c	(revision 16169)
+++ /trunk/ippTools/src/pzgetexp.c	(revision 16170)
@@ -69,24 +69,8 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    bool status = false;
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, true, "-inst is required");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-    if (!telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-telescope is required");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     // find last fileset/exp_name (if we have one)
@@ -119,5 +103,4 @@
     // invoke dsproductls
     // dsproductls --uri <> --last_fileset <>
-    psString uri = psMetadataLookupStr(&status, config->args, "-uri");
     psString cmd = NULL;
     if (haveLastFileSet) {
@@ -275,15 +258,7 @@
     // these are constants for all records parsed -- look them up before we do
     // any work
-    bool status = false;
-    char *camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup item '-inst'");
-        return NULL;
-    }
-    char *telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup item '-telescope'");
-        return NULL;
-    }
+    // required
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
 
     // split the string into lines
Index: /trunk/ippTools/src/pzgetimfiles.c
===================================================================
--- /trunk/ippTools/src/pzgetimfiles.c	(revision 16169)
+++ /trunk/ippTools/src/pzgetimfiles.c	(revision 16170)
@@ -2,5 +2,5 @@
  * pzgetimfiles.c
  *
- * Copyright (C) 2006  Joshua Hoblitt
+ * Copyright (C) 2006-2008  Joshua Hoblitt
  *
  * This program is free software; you can redistribute it and/or modify it
@@ -70,44 +70,9 @@
     PS_ASSERT_PTR_NON_NULL(config, NULL);
 
-    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 filesetid = psMetadataLookupStr(&status, config->args, "-filesetid");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filesetid");
-        return false;
-    }
-    if (!filesetid) {
-        psError(PS_ERR_UNKNOWN, true, "-filesetid is required");
-        return false;
-    }
-
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return NULL;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, true, "-inst is required");
-        return NULL;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return NULL;
-    }
-    if (!telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-telescope is required");
-        return NULL;
-    }
+    // required
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
+    PXOPT_LOOKUP_STR(filesetid, config->args, "-filesetid", true, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
 
     // invoke dsfilesetls
@@ -429,34 +394,7 @@
     // these are constants for all records parsed -- look them up before we do
     // any work
-    bool status = false;
-    psString exp_name = psMetadataLookupStr(&status, config->args, "-filesetid");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for '-filesetid'");
-        return NULL;
-    }
-    if (!exp_name) {
-        psError(PS_ERR_UNKNOWN, true, "-filesetid is required");
-        return NULL;
-    }
-
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return NULL;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, true, "-inst is required");
-        return NULL;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return NULL;
-    }
-    if (!telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-telescope is required");
-        return NULL;
-    }
+    PXOPT_LOOKUP_STR(exp_name, config->args, "-filesetid", true, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
 
     // split the string into lines
Index: /trunk/ippTools/src/pztool.c
===================================================================
--- /trunk/ippTools/src/pztool.c	(revision 16169)
+++ /trunk/ippTools/src/pztool.c	(revision 16170)
@@ -92,34 +92,8 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, true, "-inst is required");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-    if (!telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-telescope 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;
-    }
+    // required
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     if (!pzDataStoreInsert(config->dbh,
@@ -139,4 +113,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+
     if (!p_psDBRunQuery(config->dbh, "SELECT * FROM pzDataStore")) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -153,14 +129,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;
-        }
     }
 
@@ -180,4 +146,6 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
 
     psString query = psStringCopy("SELECT * FROM summitExp");
@@ -207,14 +175,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, "summitExp", !simple)) {
@@ -233,10 +191,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 = psStringCopy(
@@ -279,15 +233,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, "pzPendingExp", !simple)) {
@@ -306,10 +249,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);
 
     psArray *cameras = pzGetPendingCameras(config);
@@ -330,4 +269,5 @@
         }
 
+        bool status;
         psString camera = psMetadataLookupStr(&status, cameras->data[i], "camera");
         psStringAppend(&query, " WHERE camera = \"%s\"", camera);
@@ -380,15 +320,4 @@
     psFree(cameraImfiles);
 
-    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, "pzPendingImfile", !simple)) {
@@ -407,64 +336,11 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString exp_name = psMetadataLookupStr(&status, config->args, "-exp_name");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_name");
-        return false;
-    }
-    if (!exp_name) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_name is required");
-        return false;
-    }
-
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return NULL;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, true, "-inst is required");
-        return NULL;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return NULL;
-    }
-    if (!telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-telescope is required");
-        return NULL;
-    }
-
-    psString class = psMetadataLookupStr(&status, config->args, "-class");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class");
-        return NULL;
-    }
-    if (!class) {
-        psError(PS_ERR_UNKNOWN, true, "-class is required");
-        return NULL;
-    }
-
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return NULL;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id is required");
-        return NULL;
-    }
-
-    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;
-    }
+    // required
+    PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
+    PXOPT_LOOKUP_STR(class, config->args, "-class", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     // need to know exp_name, camera, telescope, class, class_id (to find the
@@ -476,5 +352,4 @@
         return false;
     }
-  
 
     // cp the imfile into pzDoneImfile
@@ -568,4 +443,16 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    // XXX this is an ugly hack!
+    // we are passing exp level info to a imfile level mode (-copydone)
+    // these options are thrown away unless we just -copydone'd the last imfile
+    // in an exp.  
+    // This function MUST NOT be invoked from anywhere but copydoneMode().
+ 
+    // optional
+    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);
+
     // find all exposures that have had all of their imfiles downloaded but do
     // not appear in newExp
@@ -613,7 +500,10 @@
                     doneExp->telescope, // tmp_telescope
                     "run",              // state
-                    NULL,               // workdir
+                    workdir,            // workdir
                     "dirty",            // workdir state
-                    NULL                // reduction class
+                    NULL,               // reduction class
+                    dvodb,              // dvodb
+                    tess_id,            // tess_id
+                    end_stage           // end_stage
                 )
         ) {
Index: /trunk/ippTools/src/pztoolConfig.c
===================================================================
--- /trunk/ippTools/src/pztoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/pztoolConfig.c	(revision 16170)
@@ -114,33 +114,22 @@
     psMetadataAddStr(copydoneArgs, PS_LIST_TAIL, "-uri", 0,
             "define storage uri", 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(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);
 
     psMetadata *argSets = psMetadataAlloc();
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-adddatastore",    "", PZTOOL_MODE_ADDDATASTORE, adddatastoreArgs);
-    PXTOOL_ADD_MODE("-datastore",       "", PZTOOL_MODE_DATASTORE,    datastoreArgs);
-    PXTOOL_ADD_MODE("-seen",            "", PZTOOL_MODE_SEEN,         seenArgs);
-    PXTOOL_ADD_MODE("-pendingexp",      "", PZTOOL_MODE_PENDINGEXP,   pendingexpArgs);
-    PXTOOL_ADD_MODE("-pendingimfile",   "", PZTOOL_MODE_PENDINGIMFILE,pendingimfileArgs);
-    PXTOOL_ADD_MODE("-copydone",        "", PZTOOL_MODE_COPYDONE,     copydoneArgs);
+    PXOPT_ADD_MODE("-adddatastore",    "", PZTOOL_MODE_ADDDATASTORE, adddatastoreArgs);
+    PXOPT_ADD_MODE("-datastore",       "", PZTOOL_MODE_DATASTORE,    datastoreArgs);
+    PXOPT_ADD_MODE("-seen",            "", PZTOOL_MODE_SEEN,         seenArgs);
+    PXOPT_ADD_MODE("-pendingexp",      "", PZTOOL_MODE_PENDINGEXP,   pendingexpArgs);
+    PXOPT_ADD_MODE("-pendingimfile",   "", PZTOOL_MODE_PENDINGIMFILE,pendingimfileArgs);
+    PXOPT_ADD_MODE("-copydone",        "", PZTOOL_MODE_COPYDONE,     copydoneArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/regtool.c
===================================================================
--- /trunk/ippTools/src/regtool.c	(revision 16169)
+++ /trunk/ippTools/src/regtool.c	(revision 16170)
@@ -44,13 +44,4 @@
 static bool updateprocessedexpMode(pxConfig *config);
 
-
-// static guidePendingExpRow *newToP1PendingExp(newExpRow *newExp);
-//static chipPendingExpRow *newTochipPendingExp(pxConfig *config, newExpRow *newExp);
-//static chipInputImfileRow *rawImfileTochipInputImfile(pxConfig *config, psS64 chip_id, rawImfileRow *rawImfile);
-
-static rawExpRow *newToRawExp(pxConfig *config, newExpRow *exp);
-//static psU32 mapCodeStrToInt(const char *codeStr);
-
-
 # define MODECASE(caseName, func) \
     case caseName: \
@@ -109,10 +100,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // select newImfiles that:
@@ -163,11 +150,4 @@
     }
 
-    bool simple = false;
-    simple = psMetadataLookupBool(&status, config->args, "-simple");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -simple");
-        return false;
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "regPendingImfile", !simple)) {
@@ -187,334 +167,61 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
     // required
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
-        return false;
-    }
-
-    psString exp_name = psMetadataLookupStr(&status, config->args, "-exp_name");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_name");
-        return false;
-    }
-    if (!exp_name) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_name is required");
-        return false;
-    }
-
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, true, "-inst is required");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-    if (!telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-telescope is required");
-        return false;
-    }
-
-    psString tmp_class_id = psMetadataLookupStr(&status, config->args, "-tmp_class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tmp_class_id");
-        return false;
-    }
-    if (!tmp_class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-tmp_class_id is required");
-    }
-
-    psString class_id = psMetadataLookupStr(&status, config->args, "-class_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -class_id");
-        return false;
-    }
-    if (!class_id) {
-        psError(PS_ERR_UNKNOWN, true, "-class_id 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;
-    }
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
+    PXOPT_LOOKUP_STR(tmp_class_id, config->args, "-tmp_class_id", true, false);
+    PXOPT_LOOKUP_STR(class_id, config->args, "-class_id", true, false);
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", true, false);
 
     // optional
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
-        return false;
-    }
-
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psString comment = psMetadataLookupStr(&status, config->args, "-comment");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -comment");
-        return false;
-    }
-
-    psF32 airmass = psMetadataLookupF32(&status, config->args, "-airmass");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass");
-        return false;
-    }
-
-    psF64 ra = psMetadataLookupF64(&status, config->args, "-ra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ra");
-        return false;
-    }
-
-    psF64 decl = psMetadataLookupF64(&status, config->args, "-decl");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -decl");
-        return false;
-    }
-
-    psF32 exp_time = psMetadataLookupF32(&status, config->args, "-exp_time");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time");
-        return false;
-    }
-
-    psF32 sat_pixel_frac = psMetadataLookupF32(&status, config->args, "-sat_pixel_frac");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sat_pixel_frac");
-        return false;
-    }
-
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    psF64 alt = psMetadataLookupF64(&status, config->args, "-alt");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -alt");
-        return false;
-    }
-
-    psF64 az = psMetadataLookupF64(&status, config->args, "-az");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -az");
-        return false;
-    }
-
-    psF32 ccd_temp = psMetadataLookupF32(&status, config->args, "-ccd_temp");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp");
-        return false;
-    }
-
-    psF64 posang = psMetadataLookupF32(&status, config->args, "-posang");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang");
-        return false;
-    }
-
-    psF32 m1_x = psMetadataLookupF32(&status, config->args, "-m1_x");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_x");
-        return false;
-    }
-    psF32 m1_y = psMetadataLookupF32(&status, config->args, "-m1_y");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_y");
-        return false;
-    }
-    psF32 m1_z = psMetadataLookupF32(&status, config->args, "-m1_z");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_z");
-        return false;
-    }
-    psF32 m1_tip = psMetadataLookupF32(&status, config->args, "-m1_tip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tip");
-        return false;
-    }
-    psF32 m1_tilt = psMetadataLookupF32(&status, config->args, "-m1_tilt");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tilt");
-        return false;
-    }
-
-    psF32 m2_x = psMetadataLookupF32(&status, config->args, "-m2_x");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_x");
-        return false;
-    }
-    psF32 m2_y = psMetadataLookupF32(&status, config->args, "-m2_y");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_y");
-        return false;
-    }
-    psF32 m2_z = psMetadataLookupF32(&status, config->args, "-m2_z");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_z");
-        return false;
-    }
-    psF32 m2_tip = psMetadataLookupF32(&status, config->args, "-m2_tip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tip");
-        return false;
-    }
-    psF32 m2_tilt = psMetadataLookupF32(&status, config->args, "-m2_tilt");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tilt");
-        return false;
-    }
-
-    psF32 env_temp = psMetadataLookupF32(&status, config->args, "-env_temperature");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_temperature");
-        return false;
-    }
-    psF32 env_humid = psMetadataLookupF32(&status, config->args, "-env_humidity");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_humidity");
-        return false;
-    }
-    psF32 env_wind = psMetadataLookupF32(&status, config->args, "-env_wind_speed");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_speed");
-        return false;
-    }
-    psF32 env_dir = psMetadataLookupF32(&status, config->args, "-env_wind_dir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_dir");
-        return false;
-    }
-
-    psF32 teltemp_m1 = psMetadataLookupF32(&status, config->args, "-teltemp_m1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1");
-        return false;
-    }
-    psF32 teltemp_m1cell = psMetadataLookupF32(&status, config->args, "-teltemp_m1cell");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1cell");
-        return false;
-    }
-    psF32 teltemp_m2 = psMetadataLookupF32(&status, config->args, "-teltemp_m2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m2");
-        return false;
-    }
-    psF32 teltemp_spider = psMetadataLookupF32(&status, config->args, "-teltemp_spider");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_spider");
-        return false;
-    }
-    psF32 teltemp_truss = psMetadataLookupF32(&status, config->args, "-teltemp_truss");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_truss");
-        return false;
-    }
-    psF32 teltemp_extra = psMetadataLookupF32(&status, config->args, "-teltemp_extra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_extra");
-        return false;
-    }
-
-    psF32 pon_time = psMetadataLookupF32(&status, config->args, "-pon_time");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -pon_time");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    psString object = psMetadataLookupStr(&status, config->args, "-object");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -object");
-        return false;
-    }
-
-    psTime *dateobs = NULL;
-    {
-        psString dateobsStr = psMetadataLookupStr(&status, config->args, "-dateobs");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -dateobs");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (dateobsStr) {
-            dateobs = psTimeFromISO(dateobsStr, PS_TIME_UTC);
-        } else {
-            dateobs = NULL;
-        }
-    }
-
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(exp_type, config->args, "-exp_type", false, false);
+    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", false, false);
+    PXOPT_LOOKUP_STR(filter, config->args, "-filter", false, false);
+    PXOPT_LOOKUP_STR(comment, config->args, "-comment", false, false);
+
+    PXOPT_LOOKUP_F32(airmass, config->args, "-airmass", false, false);
+    PXOPT_LOOKUP_F64(ra, config->args, "-ra", false, false);
+    PXOPT_LOOKUP_F64(decl, config->args, "-decl", false, false);
+    PXOPT_LOOKUP_F32(exp_time, config->args, "-exp_time", false, false);
+    PXOPT_LOOKUP_F32(sat_pixel_frac, config->args, "-sat_pixel_frac", false, false);
+    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);
+    PXOPT_LOOKUP_F64(alt, config->args, "-alt", false, false);
+    PXOPT_LOOKUP_F64(az, config->args, "-az", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp, config->args, "-ccd_temp", false, false);
+    PXOPT_LOOKUP_F64(posang, config->args, "-posang", false, false);
+    PXOPT_LOOKUP_F32(m1_x, config->args, "-m1_x", false, false);
+    PXOPT_LOOKUP_F32(m1_y, config->args, "-m1_y", false, false);
+    PXOPT_LOOKUP_F32(m1_z, config->args, "-m1_z", false, false);
+    PXOPT_LOOKUP_F32(m1_tip, config->args, "-m1_tip", false, false);
+    PXOPT_LOOKUP_F32(m1_tilt, config->args, "-m1_tilt", false, false);
+    PXOPT_LOOKUP_F32(m2_x, config->args, "-m2_x", false, false);
+    PXOPT_LOOKUP_F32(m2_y, config->args, "-m2_y", false, false);
+    PXOPT_LOOKUP_F32(m2_z, config->args, "-m2_z", false, false);
+    PXOPT_LOOKUP_F32(m2_tip, config->args, "-m2_tip", false, false);
+    PXOPT_LOOKUP_F32(m2_tilt, config->args, "-m2_tilt", false, false);
+
+    PXOPT_LOOKUP_F32(env_temp, config->args, "-env_temperature", false, false);
+    PXOPT_LOOKUP_F32(env_humid, config->args, "-env_humidity", false, false);
+    PXOPT_LOOKUP_F32(env_wind, config->args, "-env_wind_speed", false, false);
+    PXOPT_LOOKUP_F32(env_dir, config->args, "-env_wind_dir", false, false);
+    PXOPT_LOOKUP_F32(teltemp_m1, config->args, "-teltemp_m1", false, false);
+    PXOPT_LOOKUP_F32(teltemp_m1cell, config->args, "-teltemp_m1cell", false, false);
+    PXOPT_LOOKUP_F32(teltemp_m2, config->args, "-teltemp_m2", false, false);
+    PXOPT_LOOKUP_F32(teltemp_spider, config->args, "-teltemp_spider", false, false);
+    PXOPT_LOOKUP_F32(teltemp_truss, config->args, "-teltemp_truss", false, false);
+    PXOPT_LOOKUP_F32(teltemp_extra, config->args, "-teltemp_extra", false, false);
+    PXOPT_LOOKUP_F32(pon_time, config->args, "-pon_time", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(object, config->args, "-object", false, false);
+    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     if (!rawImfileInsert(
@@ -574,9 +281,6 @@
     )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(dateobs);
-        return false;
-    }
-
-    psFree(dateobs);
+        return false;
+    }
 
     return true;
@@ -588,16 +292,7 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -faulted");
-        return 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_processedimfile.sql");
@@ -655,14 +350,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         // negative simple so the default is true
@@ -716,14 +401,5 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-    if (code == INT16_MAX) {
-        psError(PS_ERR_UNKNOWN, true, "-code is required");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
 
     if (!pxSetFaultCode(config->dbh, "rawImfile", config->where, code)) {
@@ -740,10 +416,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // return only exps that:
@@ -792,11 +464,4 @@
     }
 
-    bool simple = false;
-    simple = psMetadataLookupBool(&status, config->args, "-simple");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -simple");
-        return false;
-    }
-
     // negate simple so the default is true
     if (!ippdbPrintMetadatas(stdout, output, "regPendingExp", !simple)) {
@@ -821,20 +486,65 @@
     // that the correct count of imfiles is in rawImfile
 
-    bool status = false;
-    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
-        return false;
-    }
-    if (!exp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_id is required");
-        return false;
-    }
-
-    bool detrend = psMetadataLookupBool(&status, config->args, "-detrend");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -detrend");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(exp_id, config->args, "-exp_id", true, false);
+    PXOPT_LOOKUP_STR(exp_name, config->args, "-exp_name", true, false);
+    PXOPT_LOOKUP_STR(camera, config->args, "-inst", true, false);
+    PXOPT_LOOKUP_STR(telescope, config->args, "-telescope", true, false);
+    PXOPT_LOOKUP_STR(exp_tag, config->args, "-exp_tag", true, false);
+    PXOPT_LOOKUP_STR(filelevel, config->args, "-filelevel", true, false);
+
+    // optional
+    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);
+    PXOPT_LOOKUP_STR(comment, config->args, "-comment", false, false);
+    PXOPT_LOOKUP_F32(airmass, config->args, "-airmass", false, false);
+    PXOPT_LOOKUP_F64(ra, config->args, "-ra", false, false);
+    PXOPT_LOOKUP_F64(decl, config->args, "-decl", false, false);
+    PXOPT_LOOKUP_F32(exp_time, config->args, "-exp_time", false, false);
+    PXOPT_LOOKUP_F32(sat_pixel_frac, config->args, "-sat_pixel_frac", false, false);
+    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);
+    PXOPT_LOOKUP_F64(alt, config->args, "-alt", false, false);
+    PXOPT_LOOKUP_F64(az, config->args, "-az", false, false);
+    PXOPT_LOOKUP_F32(ccd_temp, config->args, "-ccd_temp", false, false);
+    PXOPT_LOOKUP_F64(posang, config->args, "-posang", false, false);
+    PXOPT_LOOKUP_F32(m1_x, config->args, "-m1_x", false, false);
+    PXOPT_LOOKUP_F32(m1_y, config->args, "-m1_y", false, false);
+    PXOPT_LOOKUP_F32(m1_z, config->args, "-m1_z", false, false);
+    PXOPT_LOOKUP_F32(m1_tip, config->args, "-m1_tip", false, false);
+    PXOPT_LOOKUP_F32(m1_tilt, config->args, "-m1_tilt", false, false);
+    PXOPT_LOOKUP_F32(m2_x, config->args, "-m2_x", false, false);
+    PXOPT_LOOKUP_F32(m2_y, config->args, "-m2_y", false, false);
+    PXOPT_LOOKUP_F32(m2_z, config->args, "-m2_z", false, false);
+    PXOPT_LOOKUP_F32(m2_tip, config->args, "-m2_tip", false, false);
+    PXOPT_LOOKUP_F32(m2_tilt, config->args, "-m2_tilt", false, false);
+
+    PXOPT_LOOKUP_F32(env_temp, config->args, "-env_temperature", false, false);
+    PXOPT_LOOKUP_F32(env_humid, config->args, "-env_humidity", false, false);
+    PXOPT_LOOKUP_F32(env_wind, config->args, "-env_wind_speed", false, false);
+    PXOPT_LOOKUP_F32(env_dir, config->args, "-env_wind_dir", false, false);
+    PXOPT_LOOKUP_F32(teltemp_m1, config->args, "-teltemp_m1", false, false);
+    PXOPT_LOOKUP_F32(teltemp_m1cell, config->args, "-teltemp_m1cell", false, false);
+    PXOPT_LOOKUP_F32(teltemp_m2, config->args, "-teltemp_m2", false, false);
+    PXOPT_LOOKUP_F32(teltemp_spider, config->args, "-teltemp_spider", false, false);
+    PXOPT_LOOKUP_F32(teltemp_truss, config->args, "-teltemp_truss", false, false);
+    PXOPT_LOOKUP_F32(teltemp_extra, config->args, "-teltemp_extra", false, false);
+    PXOPT_LOOKUP_F32(pon_time, config->args, "-pon_time", false, false);
+    PXOPT_LOOKUP_F64(user_1, config->args, "-user_1", false, false);
+    PXOPT_LOOKUP_F64(user_2, config->args, "-user_2", false, false);
+    PXOPT_LOOKUP_F64(user_3, config->args, "-user_3", false, false);
+    PXOPT_LOOKUP_F64(user_4, config->args, "-user_4", false, false);
+    PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
+    PXOPT_LOOKUP_STR(object, config->args, "-object", false, false);
+    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
+
+    // default
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     psString query = pxDataGet("regtool_pendingexp.sql");
@@ -847,20 +557,10 @@
         // build a query to search by exp_id
         psMetadata *where = psMetadataAlloc();
-        bool status = false;
-        psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
+        if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+            psFree(where);
             psFree(query);
             return false;
         }
-        if (exp_id) {
-            if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
-                psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-                psFree(where);
-                psFree(query);
-                return false;
-            }
-        }
-
 
         psString whereClause = psDBGenerateWhereSQL(where, NULL);
@@ -898,4 +598,14 @@
         return false;
     }
+    // sanity check that we only got one row
+    if (psArrayLength(output) != 1) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "should have gotten 1 row but %lu rows were returned", psArrayLength(output));
+        psFree(output);
+        return NULL;
+    }
 
     if (!psDBTransaction(config->dbh)) {
@@ -906,632 +616,21 @@
 
     // insert the exp into rawExp
-    for (long i = 0; psArrayLength(output) > i; i++) {
-        psMetadata *row = output->data[i];
-        // convert metadata into a newExp object
-        newExpRow *newExp = newExpObjectFromMetadata(row);
-        // convert newExp object into a rawExp object
-        rawExpRow *rawExp = newToRawExp(config, newExp);
-        if (!rawExp) {
-            // rollback
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to convert newExp to rawExp");
-            psFree(newExp);
-            psFree(output);
-            return false;
-        }
-        psFree(newExp);
-
-        // insert the rawExp object into the database
-        if (!rawExpInsertObject(config->dbh, rawExp)) {
-            // rollback
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "database error");
-            psFree(rawExp);
-            psFree(output);
-            return false;
-        }
-
-        // if this is a detrend image don't put it in the chip queue (and we're
-        // done)
-        if (detrend) {
-            // set the state for the newExp to stop
-            if (!pxnewExpSetState(config, exp_id, "stop")) {
-                // rollback
-                if (!psDBRollback(config->dbh)) {
-                    psError(PS_ERR_UNKNOWN, false, "database error");
-                }
-                psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %s", exp_id);
-                psFree(rawExp);
-                psFree(output);
-                return false;
-            }
-            psFree(rawExp);
-            continue;
-        }
-
-
-        // set the state for the newExp to stop
-        if (!pxnewExpSetState(config, exp_id, "stop")) {
-            // rollback
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %s", exp_id);
-            psFree(rawExp);
-            psFree(output);
-            return false;
-        }
-
-        // insert an entry into the chipPendingExp table
-        // this can only be run as the newExp's state has been set to stop
-        if (!pxchipQueueByExpTag(config,
-                    rawExp->exp_id,
-                    rawExp->workdir,
-                    NULL, // label
-                    rawExp->reduction,
-                    NULL, // expgroup
-                    NULL  // dvodb
-        )) {
-            // rollback
-            if (!psDBRollback(config->dbh)) {
-                psError(PS_ERR_UNKNOWN, false, "database error");
-            }
-            psError(PS_ERR_UNKNOWN, false, "failed to queue chipPendingExp");
-            psFree(rawExp);
-            psFree(output);
-            return false;
-        }
-        psFree(rawExp);
-    }
+    psMetadata *row = output->data[0];
+    // convert metadata into a newExp object
+    newExpRow *newExp = newExpObjectFromMetadata(row);
     psFree(output);
 
-    if (!psDBCommit(config->dbh)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
-
-
-static bool processedexpMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -limit");
-        return false;
-    }
-
-    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, false, "failed to lookup value for -faulted");
-        return false;
-    }
-
-    psString query = pxDataGet("regtool_processedexp.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (config->where) {
-        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
-        psStringAppend(&query, " AND %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (faulted) {
-        // list only faulted rows
-        psStringAppend(&query, " %s", "AND rawExp.fault != 0");
-    } else {
-        // don't list faulted rows
-        psStringAppend(&query, " %s", "AND rawExp.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");
-        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("regtool", 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");
-            return false;
-        }
-    }
-
-    if (psArrayLength(output)) {
-        // negative simple so the default is true
-        if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print array");
-            psFree(output);
-            return false;
-        }
-    }
-
-    psFree(output);
-
-    return true;
-}
-
-static bool revertprocessedexpMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    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");
-        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;
-}
-
-
-static bool updateprocessedexpMode(pxConfig *config)
-{
-    bool status = false;
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-    if (code == INT16_MAX) {
-        psError(PS_ERR_UNKNOWN, true, "-code is required");
-        return false;
-    }
-
-    if (!pxSetFaultCode(config->dbh, "rawExp", config->where, code)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
-        return false;
-    }
-
-    return true;
-}
-
-
-# if 0
-static guidePendingExpRow *newToP1PendingExp(newExpRow *newExp)
-{
-    return guidePendingExpRowAlloc(
-        newExp->exp_id,
-        newExp->camera,
-        newExp->telescope,
-        newExp->exp_type,
-        newExp->imfiles,
-        "my filter",
-        0.1, // airmass
-        0.2, // ra
-        0.3, // dec
-        0.4, // exp time
-        0.5, // background
-        "my recipe",
-        0xff // XXX calc version number
-    );
-}
-#endif
-
-
-#if 0
-static chipPendingExpRow *newTochipPendingExp(pxConfig *config, newExpRow *exp)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(exp, NULL);
-
-    // optional
-    bool status = false;
-    psString label = psMetadataLookupStr(&status, config->args, "-label");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -label");
-        return false;
-    }
-
-    chipPendingExpRow *chipExp = chipPendingExpRowAlloc(
-            0,              // chip ID, assigned by db
-            exp->exp_id,
-            0xdeadbeef,     // guide version
-            label,
-            "my recipe",    // recipe
-            NULL,           // expgroup
-            NULL            // dvodb
-    );
-
-    return chipExp;
-}
-
-
-static chipInputImfileRow *rawImfileTochipInputImfile(pxConfig *config, psS64 chip_id, rawImfileRow *rawImfile)
-{
-    return chipInputImfileRowAlloc(
-            chip_id,
-            rawImfile->class_id,
-            rawImfile->uri
-    );
-}
-#endif
-
-
-static rawExpRow *newToRawExp(pxConfig *config, newExpRow *exp)
-{
-    PS_ASSERT_PTR_NON_NULL(config, NULL);
-    PS_ASSERT_PTR_NON_NULL(exp, NULL);
-
-    bool status = false;
-    // required
-    psString exp_name = psMetadataLookupStr(&status, config->args, "-exp_name");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_name");
-        return false;
-    }
-    if (!exp_name) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_name is required");
-        return false;
-    }
-
-    psString camera = psMetadataLookupStr(&status, config->args, "-inst");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -inst");
-        return false;
-    }
-    if (!camera) {
-        psError(PS_ERR_UNKNOWN, true, "-inst is required");
-        return false;
-    }
-
-    psString telescope = psMetadataLookupStr(&status, config->args, "-telescope");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -telescope");
-        return false;
-    }
-    if (!telescope) {
-        psError(PS_ERR_UNKNOWN, true, "-telescope is required");
-        return false;
-    }
-
-    psString exp_tag = psMetadataLookupStr(&status, config->args, "-exp_tag");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_tag");
-        return false;
-    }
-    if (!exp_tag) {
-        psError(PS_ERR_UNKNOWN, true, "-exp_tag is required");
-        return false;
-    }
-
-    // optional
-    psString exp_type = psMetadataLookupStr(&status, config->args, "-exp_type");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_type");
-        return false;
-    }
-
-    psString filelevel = psMetadataLookupStr(&status, config->args, "-filelevel");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filelevel");
-        return false;
-    }
-    if (!filelevel) {
-        psError(PS_ERR_UNKNOWN, true, "-filelevel is required");
-        return false;
-    }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-
-    psString reduction = psMetadataLookupStr(&status, config->args, "-reduction");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reduction");
-        return false;
-    }
-
-    psString filter = psMetadataLookupStr(&status, config->args, "-filter");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter");
-        return false;
-    }
-
-    psString comment = psMetadataLookupStr(&status, config->args, "-comment");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -comment");
-        return false;
-    }
-
-    psF32 airmass = psMetadataLookupF32(&status, config->args, "-airmass");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -airmass");
-        return false;
-    }
-
-    psF64 ra = psMetadataLookupF64(&status, config->args, "-ra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ra");
-        return false;
-    }
-
-    psF64 decl = psMetadataLookupF64(&status, config->args, "-decl");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -decl");
-        return false;
-    }
-
-    psF32 exp_time = psMetadataLookupF32(&status, config->args, "-exp_time");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_time");
-        return false;
-    }
-
-    psF32 sat_pixel_frac = psMetadataLookupF32(&status, config->args, "-sat_pixel_frac");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -sat_pixel_frac");
-        return false;
-    }
-
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
-        return false;
-    }
-
-    psF64 alt = psMetadataLookupF64(&status, config->args, "-alt");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -alt");
-        return false;
-    }
-
-    psF64 az = psMetadataLookupF64(&status, config->args, "-az");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -az");
-        return false;
-    }
-
-    psF32 ccd_temp = psMetadataLookupF32(&status, config->args, "-ccd_temp");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ccd_temp");
-        return false;
-    }
-
-    psF64 posang = psMetadataLookupF32(&status, config->args, "-posang");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -posang");
-        return false;
-    }
-
-    psF32 m1_x = psMetadataLookupF32(&status, config->args, "-m1_x");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_x");
-        return false;
-    }
-    psF32 m1_y = psMetadataLookupF32(&status, config->args, "-m1_y");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_y");
-        return false;
-    }
-    psF32 m1_z = psMetadataLookupF32(&status, config->args, "-m1_z");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_z");
-        return false;
-    }
-    psF32 m1_tip = psMetadataLookupF32(&status, config->args, "-m1_tip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tip");
-        return false;
-    }
-    psF32 m1_tilt = psMetadataLookupF32(&status, config->args, "-m1_tilt");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m1_tilt");
-        return false;
-    }
-
-    psF32 m2_x = psMetadataLookupF32(&status, config->args, "-m2_x");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_x");
-        return false;
-    }
-    psF32 m2_y = psMetadataLookupF32(&status, config->args, "-m2_y");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_y");
-        return false;
-    }
-    psF32 m2_z = psMetadataLookupF32(&status, config->args, "-m2_z");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_z");
-        return false;
-    }
-    psF32 m2_tip = psMetadataLookupF32(&status, config->args, "-m2_tip");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tip");
-        return false;
-    }
-    psF32 m2_tilt = psMetadataLookupF32(&status, config->args, "-m2_tilt");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -m2_tilt");
-        return false;
-    }
-
-    psF32 env_temp = psMetadataLookupF32(&status, config->args, "-env_temperature");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_temperature");
-        return false;
-    }
-    psF32 env_humid = psMetadataLookupF32(&status, config->args, "-env_humidity");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_humidity");
-        return false;
-    }
-    psF32 env_wind = psMetadataLookupF32(&status, config->args, "-env_wind_speed");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_speed");
-        return false;
-    }
-    psF32 env_dir = psMetadataLookupF32(&status, config->args, "-env_wind_dir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -env_wind_dir");
-        return false;
-    }
-
-    psF32 teltemp_m1 = psMetadataLookupF32(&status, config->args, "-teltemp_m1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1");
-        return false;
-    }
-    psF32 teltemp_m1cell = psMetadataLookupF32(&status, config->args, "-teltemp_m1cell");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m1cell");
-        return false;
-    }
-    psF32 teltemp_m2 = psMetadataLookupF32(&status, config->args, "-teltemp_m2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_m2");
-        return false;
-    }
-    psF32 teltemp_spider = psMetadataLookupF32(&status, config->args, "-teltemp_spider");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_spider");
-        return false;
-    }
-    psF32 teltemp_truss = psMetadataLookupF32(&status, config->args, "-teltemp_truss");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_truss");
-        return false;
-    }
-    psF32 teltemp_extra = psMetadataLookupF32(&status, config->args, "-teltemp_extra");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -teltemp_extra");
-        return false;
-    }
-
-    psF32 pon_time = psMetadataLookupF32(&status, config->args, "-pon_time");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -pon_time");
-        return false;
-    }
-
-    psF64 user_1 = psMetadataLookupF64(&status, config->args, "-user_1");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_1");
-        return false;
-    }
-    psF64 user_2 = psMetadataLookupF64(&status, config->args, "-user_2");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_2");
-        return false;
-    }
-    psF64 user_3 = psMetadataLookupF64(&status, config->args, "-user_3");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_3");
-        return false;
-    }
-    psF64 user_4 = psMetadataLookupF64(&status, config->args, "-user_4");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_4");
-        return false;
-    }
-    psF64 user_5 = psMetadataLookupF64(&status, config->args, "-user_5");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -user_5");
-        return false;
-    }
-
-    psString object = psMetadataLookupStr(&status, config->args, "-object");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -object");
-        return false;
-    }
-
-    psTime *dateobs = NULL;
-    {
-        psString dateobsStr = psMetadataLookupStr(&status, config->args, "-dateobs");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -dateobs");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (dateobsStr) {
-            dateobs = psTimeFromISO(dateobsStr, PS_TIME_UTC);
-        } else {
-            dateobs = NULL;
-        }
-    }
-
-    // default
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
-
-    rawExpRow *raw = rawExpRowAlloc(
-        exp->exp_id,
+    // carry through these values
+    // new CLI options overwrite existing values
+    workdir   = workdir ? workdir : newExp->workdir;
+    reduction = reduction ? reduction : newExp->reduction;
+    dvodb     = dvodb ? dvodb : newExp->dvodb;
+    tess_id   = tess_id ? tess_id : newExp->tess_id;
+    end_stage = end_stage ? end_stage : newExp->end_stage;
+
+    psFree(newExp);
+
+    if (!rawExpInsert(config->dbh,
+        (psS64)atoll(exp_id),
         exp_name,
         camera,
@@ -1541,8 +640,11 @@
         exp_type,
         filelevel,
-        workdir ? workdir : exp->workdir,
-        reduction ? reduction : exp->reduction,
+        workdir,
+        reduction,
+        dvodb,
+        tess_id,
+        end_stage,
         filter,
-	comment,
+        comment,
         airmass,
         ra,
@@ -1557,25 +659,25 @@
         ccd_temp,
         posang,
-	m1_x,
-	m1_y,
-	m1_z,
-	m1_tip,
-	m1_tilt,
-	m2_x,
-	m2_y,
-	m2_z,
-	m2_tip,
-	m2_tilt,
-	env_temp,
-	env_humid,
-	env_wind,
-	env_dir,
-	teltemp_m1,
-	teltemp_m1cell,
-	teltemp_m2,
-	teltemp_spider,
-	teltemp_truss,
-	teltemp_extra,
-	pon_time,
+        m1_x,
+        m1_y,
+        m1_z,
+        m1_tip,
+        m1_tilt,
+        m2_x,
+        m2_y,
+        m2_z,
+        m2_tip,
+        m2_tilt,
+        env_temp,
+        env_humid,
+        env_wind,
+        env_dir,
+        teltemp_m1,
+        teltemp_m1cell,
+        teltemp_m2,
+        teltemp_spider,
+        teltemp_truss,
+        teltemp_extra,
+        pon_time,
         user_1,
         user_2,
@@ -1586,10 +688,183 @@
         0.0,
         code
-    );
-
-    if (dateobs) {
-        psFree(dateobs);
-    }
-
-    return raw;
-}
+    )) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    // set the state for the newExp to stop
+    if (!pxnewExpSetState(config, exp_id, "stop")) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "failed to change newExp.state for exp_id: %s", exp_id);
+        return false;
+    }
+
+    // should we stop here and proceed on to the chip stage?
+    if (psStrcasestr(end_stage, "reg")) {
+        // then we are done here
+        if (!psDBCommit(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            return false;
+        }
+
+        return true;
+    }
+    // else continue on...
+
+
+    // insert an entry into the chipPendingExp table
+    // this can only be run as the newExp's state has been set to stop
+    if (!pxchipQueueByExpTag(config,
+                (psS64)atoll(exp_id),
+                workdir,
+                NULL, // label
+                reduction,
+                NULL, // expgroup
+                dvodb,
+                tess_id,
+                end_stage
+    )) {
+        // rollback
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        psError(PS_ERR_UNKNOWN, false, "failed to queue chipPendingExp");
+        return false;
+    }
+
+    if (!psDBCommit(config->dbh)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
+}
+
+
+static bool processedexpMode(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);
+    PXOPT_LOOKUP_BOOL(faulted, config->args, "-faulted", false);
+
+    psString query = pxDataGet("regtool_processedexp.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        return false;
+    }
+
+    if (config->where) {
+        psString whereClause = psDBGenerateWhereConditionSQL(config->where, "rawExp");
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+
+    if (faulted) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "AND rawExp.fault != 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "AND rawExp.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");
+        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("regtool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        return true;
+    }
+
+    if (psArrayLength(output)) {
+        // negative simple so the default is true
+        if (!ippdbPrintMetadatas(stdout, output, "rawExp", !simple)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to print array");
+            psFree(output);
+            return false;
+        }
+    }
+
+    psFree(output);
+
+    return true;
+}
+
+static bool revertprocessedexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    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");
+        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;
+}
+
+
+static bool updateprocessedexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_S16(code, config->args, "-code", true, false);
+
+    if (!pxSetFaultCode(config->dbh, "rawExp", config->where, code)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
+        return false;
+    }
+
+    return true;
+}
Index: /trunk/ippTools/src/regtoolConfig.c
===================================================================
--- /trunk/ippTools/src/regtoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/regtoolConfig.c	(revision 16170)
@@ -161,5 +161,5 @@
     psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-object",  0,
         "define exposure object", NULL);
-    psMetadataAddStr(addprocessedimfileArgs, PS_LIST_TAIL, "-dateobs",  0,
+    psMetadataAddTime(addprocessedimfileArgs, PS_LIST_TAIL, "-dateobs",  0,
         "define observation time", NULL);
     psMetadataAddS16(addprocessedimfileArgs, PS_LIST_TAIL, "-code",  0,
@@ -226,5 +226,5 @@
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_tag",  0,
         "define the external exposure tag name (required)", NULL);
-    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-dateobs",  0,
+    psMetadataAddTime(addprocessedexpArgs, PS_LIST_TAIL, "-dateobs",  0,
         "define observation time", NULL);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-exp_type",  0,
@@ -234,4 +234,10 @@
     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);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-tess_id",  0,
+        "define the tess_id for the next processing step", NULL);
+    psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-end_stage",  0,
+        "define the end goal processing step", NULL);
     psMetadataAddStr(addprocessedexpArgs, PS_LIST_TAIL, "-reduction",  0,
         "define the \"default\" reduction class for this exposure", NULL);
@@ -328,6 +334,4 @@
         "define URL", NULL);
     */
-    psMetadataAddBool(addprocessedexpArgs, PS_LIST_TAIL, "-detrend",  0,
-        "declare this as detrend data", false);
 
     // -processedexp
@@ -360,14 +364,14 @@
     psMetadata *modes = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-pendingimfile",           "", REGTOOL_MODE_PENDINGIMFILE, pendingimfileArgs);
-    PXTOOL_ADD_MODE("-addprocessedimfile",      "",  REGTOOL_MODE_ADDPROCESSEDIMFILE, addprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-processedimfile",         "", REGTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
-    PXTOOL_ADD_MODE("-revertprocessedimfile",   "", REGTOOL_MODE_REVERTPROCESSEDIMFILE, revertprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-updateprocessedimfile",   "",   REGTOOL_MODE_UPDATEPROCESSEDIMFILE, updateprocessedimfileArgs);
-    PXTOOL_ADD_MODE("-pendingexp",              "",       REGTOOL_MODE_PENDINGEXP,pendingexpArgs);
-    PXTOOL_ADD_MODE("-addprocessedexp",         "",  REGTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
-    PXTOOL_ADD_MODE("-processedexp",            "",     REGTOOL_MODE_PROCESSEDEXP, processedexpArgs);
-    PXTOOL_ADD_MODE("-revertprocessedexp",      "", REGTOOL_MODE_REVERTPROCESSEDEXP, revertprocessedexpArgs);
-    PXTOOL_ADD_MODE("-updateprocessedexp",      "",  REGTOOL_MODE_UPDATEPROCESSEDEXP,      updatedprocessedexpArgs);
+    PXOPT_ADD_MODE("-pendingimfile",           "", REGTOOL_MODE_PENDINGIMFILE, pendingimfileArgs);
+    PXOPT_ADD_MODE("-addprocessedimfile",      "",  REGTOOL_MODE_ADDPROCESSEDIMFILE, addprocessedimfileArgs);
+    PXOPT_ADD_MODE("-processedimfile",         "", REGTOOL_MODE_PROCESSEDIMFILE, processedimfileArgs);
+    PXOPT_ADD_MODE("-revertprocessedimfile",   "", REGTOOL_MODE_REVERTPROCESSEDIMFILE, revertprocessedimfileArgs);
+    PXOPT_ADD_MODE("-updateprocessedimfile",   "",   REGTOOL_MODE_UPDATEPROCESSEDIMFILE, updateprocessedimfileArgs);
+    PXOPT_ADD_MODE("-pendingexp",              "",       REGTOOL_MODE_PENDINGEXP,pendingexpArgs);
+    PXOPT_ADD_MODE("-addprocessedexp",         "",  REGTOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
+    PXOPT_ADD_MODE("-processedexp",            "",     REGTOOL_MODE_PROCESSEDEXP, processedexpArgs);
+    PXOPT_ADD_MODE("-revertprocessedexp",      "", REGTOOL_MODE_REVERTPROCESSEDEXP, revertprocessedexpArgs);
+    PXOPT_ADD_MODE("-updateprocessedexp",      "",  REGTOOL_MODE_UPDATEPROCESSEDEXP,      updatedprocessedexpArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/stacktool.c
===================================================================
--- /trunk/ippTools/src/stacktool.c	(revision 16169)
+++ /trunk/ippTools/src/stacktool.c	(revision 16170)
@@ -95,34 +95,11 @@
 
     // required options
-    bool status = false;
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    psString skycell_id = psMetadataLookupStr(&status, config->args, "-skycell_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -skycell_id");
-        return false;
-    }
-    if (!skycell_id) {
-        psError(PS_ERR_UNKNOWN, true, "-skycell_id is required");
-        return false;
-    }
-
-    psString tess_id = psMetadataLookupStr(&status, config->args, "-tess_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tess_id");
-        return false;
-    }
-    if (!tess_id) {
-        psError(PS_ERR_UNKNOWN, true, "-tess_id is required");
-        return false;
-    }
+    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);
+
+    // default
+    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     // we have to support multipe exp_ids
@@ -132,19 +109,4 @@
         psError(PS_ERR_UNKNOWN, true, "-warp_id is required");
         return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
     }
 
@@ -158,5 +120,4 @@
             tess_id
     );
-    psFree(registered);
     if (!run) {
         psError(PS_ERR_UNKNOWN, false, "failed to alloc stackRun object");
@@ -210,15 +171,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(run);
-            return false;
-        }
-    }
-
     if (!stackRunPrintObject(stdout, run, !simple)) {
             psError(PS_ERR_UNKNOWN, false, "failed to print object");
@@ -237,24 +187,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString stack_id = psMetadataLookupStr(&status, config->args, "-stack_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -stack_id");
-        return false;
-    }
-    if (!stack_id) {
-        psError(PS_ERR_UNKNOWN, true, "-stack_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;
-    }
+    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", true, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
     if (state) {
@@ -271,26 +203,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString stack_id = psMetadataLookupStr(&status, config->args, "-stack_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -stack_id");
-        return false;
-    }
-    if (!stack_id) {
-        psError(PS_ERR_UNKNOWN, true, "-stack_id is required");
-        return false;
-
-    }
-
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warp_id");
-        return false;
-    }
-    if (!warp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-warp_id is required");
-        return false;
-    }
-
+    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", true, false);
+    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", true, false);
 
     // XXX need to validate the warp_id here
@@ -313,10 +225,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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("stacktool_inputskyfile.sql");
@@ -366,14 +274,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -401,10 +299,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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("stacktool_tosum.sql");
@@ -454,14 +348,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -489,53 +373,16 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString stack_id = psMetadataLookupStr(&status, config->args, "-stack_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -stack_id");
-        return false;
-    }
-    if (!stack_id) {
-        psError(PS_ERR_UNKNOWN, true, "-stack_id 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;
-    }
-
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    // required
+    PXOPT_LOOKUP_STR(stack_id, config->args, "-stack_id", true, false);
 
     // optional
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 good_frac = psMetadataLookupF64(&status, config->args, "-good_frac");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -good_frac");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(good_frac, config->args, "-good_frac", false, false);
 
     // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     if (!psDBTransaction(config->dbh)) {
@@ -585,10 +432,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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("stacktool_sumskyfile.sql");
@@ -638,14 +481,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
Index: /trunk/ippTools/src/stacktoolConfig.c
===================================================================
--- /trunk/ippTools/src/stacktoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/stacktoolConfig.c	(revision 16170)
@@ -43,7 +43,5 @@
     }
 
-    psTime *time = psTimeGetNow(PS_TIME_TAI);
-    psString now = psTimeToISO(time);
-    psFree(time);
+    psTime *now = psTimeGetNow(PS_TIME_TAI);
 
     // -definerun
@@ -51,5 +49,5 @@
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,
             "define workdir (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,
@@ -146,12 +144,12 @@
     psMetadata *modes   = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-definerun",       "", STACKTOOL_MODE_DEFINERUN,      definerunArgs);
-    PXTOOL_ADD_MODE("-updaterun",       "", STACKTOOL_MODE_UPDATERUN,      updaterunArgs);
-    PXTOOL_ADD_MODE("-addinputskyfile", "", STACKTOOL_MODE_ADDINPUTSKYFILE, addinputskyfileArgs);
-    PXTOOL_ADD_MODE("-inputskyfile",    "", STACKTOOL_MODE_INPUTSKYFILE,    inputskyfileArgs);
-    PXTOOL_ADD_MODE("-tosum",           "", STACKTOOL_MODE_TOSUM,          tosumArgs);
-    PXTOOL_ADD_MODE("-addsumskyfile",   "", STACKTOOL_MODE_ADDSUMSKYFILE,   addsumskyfileArgs);
-    PXTOOL_ADD_MODE("-sumskyfile",      "", STACKTOOL_MODE_SUMSKYFILE,      sumskyfileArgs);
-    PXTOOL_ADD_MODE("-revertsumskyfile","", STACKTOOL_MODE_REVERTSUMSKYFILE,      revertsumskyfileArgs);
+    PXOPT_ADD_MODE("-definerun",       "", STACKTOOL_MODE_DEFINERUN,      definerunArgs);
+    PXOPT_ADD_MODE("-updaterun",       "", STACKTOOL_MODE_UPDATERUN,      updaterunArgs);
+    PXOPT_ADD_MODE("-addinputskyfile", "", STACKTOOL_MODE_ADDINPUTSKYFILE, addinputskyfileArgs);
+    PXOPT_ADD_MODE("-inputskyfile",    "", STACKTOOL_MODE_INPUTSKYFILE,    inputskyfileArgs);
+    PXOPT_ADD_MODE("-tosum",           "", STACKTOOL_MODE_TOSUM,          tosumArgs);
+    PXOPT_ADD_MODE("-addsumskyfile",   "", STACKTOOL_MODE_ADDSUMSKYFILE,   addsumskyfileArgs);
+    PXOPT_ADD_MODE("-sumskyfile",      "", STACKTOOL_MODE_SUMSKYFILE,      sumskyfileArgs);
+    PXOPT_ADD_MODE("-revertsumskyfile","", STACKTOOL_MODE_REVERTSUMSKYFILE,      revertsumskyfileArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
Index: /trunk/ippTools/src/warptool.c
===================================================================
--- /trunk/ippTools/src/warptool.c	(revision 16169)
+++ /trunk/ippTools/src/warptool.c	(revision 16170)
@@ -108,14 +108,5 @@
 
     // required options
-    bool status = false;
-    psString mode = psMetadataLookupStr(&status, config->args, "-mode");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -survey_mode");
-        return false;
-    }
-    if (!mode) {
-        psError(PS_ERR_UNKNOWN, true, "-mode is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(mode, config->args, "-mode", true, false);
     // check mode
     if (mode && !isValidMode(config, mode)) {
@@ -123,29 +114,14 @@
         return false;
     }
-
-    psString workdir = psMetadataLookupStr(&status, config->args, "-workdir");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -workdir");
-        return false;
-    }
-    if (!workdir) {
-        psError(PS_ERR_UNKNOWN, true, "-workdir is required");
-        return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        psString registeredStr = psMetadataLookupStr(&status, config->args, "-registered");
-        if (!status) {
-            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -registered");
-            return false;
-        }
-        // pass through NULL as this is an optional field
-        if (registeredStr) {
-            registered = psTimeFromISO(registeredStr, PS_TIME_UTC);
-        } else {
-            registered = NULL;
-        }
-    }
+    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
+
+    // optional
+    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_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     warpRunRow *warpRun = warpRunRowAlloc(
@@ -154,8 +130,10 @@
             "reg",      // state
             workdir,
-            NULL,       // dvodb
+            "dirty",    // workdir_state
+            dvodb,
+            tess_id,
+            end_stage,
             registered
     );
-    psFree(registered);
     if (!warpRun) {
         psError(PS_ERR_UNKNOWN, false, "failed to alloc warpRun object");
@@ -171,15 +149,4 @@
     psS64 warp_id = psDBLastInsertID(config->dbh);
     warpRun->warp_id = warp_id;
-
-    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(warpRun);
-            return false;
-        }
-    }
 
     if (!warpRunPrintObject(stdout, warpRun, !simple)) {
@@ -255,24 +222,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warpt_id");
-        return false;
-    }
-    if (!warp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-warp_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;
-    }
+    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", true, false);
+    PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
 
     if (state) {
@@ -289,35 +238,10 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warp_id");
-        return false;
-    }
-    if (!warp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-warp_id is required");
-        return false;
-    }
-
-    psString cam_id = psMetadataLookupStr(&status, config->args, "-cam_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -cam_id");
-        return false;
-    }
-    if (!cam_id) {
-        psError(PS_ERR_UNKNOWN, true, "-cam_id is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", true, false);
+    PXOPT_LOOKUP_STR(cam_id, config->args, "-cam_id", true, false);
 
     // defaults to false
-    bool magiced = psMetadataLookupBool(&status, config->args, "-magiced");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -magiced");
-        return false;
-    }
-
-    // XXX need to validate the warp_id here
-    // XXX instead of validiting it here we should just use forgein key
-    // constrants
+    PXOPT_LOOKUP_BOOL(magiced, config->args, "-magiced", false);
+
     if (!warpInputExpInsert(config->dbh,
             (psS64)atoll(warp_id),
@@ -337,10 +261,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -391,14 +311,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -426,10 +336,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -480,14 +386,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -515,10 +411,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -569,14 +461,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -599,19 +481,10 @@
 }
 
-
+    
 static bool addoverlapMode(pxConfig *config)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString mapfile = psMetadataLookupStr(&status, config->args, "-mapfile");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -mapfile");
-        return false;
-    }
-    if (!mapfile) {
-        psError(PS_ERR_UNKNOWN, true, "-mapfile is required");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(mapfile, config->args, "-mapfile", false, false);
 
     if (!psDBTransaction(config->dbh)) {
@@ -703,10 +576,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -757,14 +626,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -792,10 +651,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -846,14 +701,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
@@ -881,78 +726,18 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psString warp_id = psMetadataLookupStr(&status, config->args, "-warp_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -warp_id");
-        return false;
-    }
-    if (!warp_id) {
-        psError(PS_ERR_UNKNOWN, true, "-warp_id is required");
-        return false;
-    }
-
-    psString skycell_id = psMetadataLookupStr(&status, config->args, "-skycell_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -skycell_id");
-        return false;
-    }
-    if (!skycell_id) {
-        psError(PS_ERR_UNKNOWN, true, "-skycell_id is required");
-        return false;
-    }
-
-    psString tess_id = psMetadataLookupStr(&status, config->args, "-tess_id");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -tess_id");
-        return false;
-    }
-    if (!tess_id) {
-        psError(PS_ERR_UNKNOWN, true, "-tess_id 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;
-    }
-
-    psString path_base = psMetadataLookupStr(&status, config->args, "-path_base");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -path_base");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(warp_id, config->args, "-warp_id", 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
-    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
-        return false;
-    }
-
-    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
-        return false;
-    }
-
-    psF64 good_frac = psMetadataLookupF64(&status, config->args, "-good_frac");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -good_frac");
-        return false;
-    }
-
-    bool ignore = psMetadataLookupBool(&status, config->args, "-ignore");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -ignore");
-        return false;
-    }
+    PXOPT_LOOKUP_STR(uri, config->args, "-uri", false, false);
+    PXOPT_LOOKUP_STR(path_base, config->args, "-path_base", false, false);
+    PXOPT_LOOKUP_F64(bg, config->args, "-bg", false, false);
+    PXOPT_LOOKUP_F64(bg_stdev, config->args, "-bg_stdev", false, false);
+    PXOPT_LOOKUP_F64(good_frac, config->args, "-good_frac", false, false);
+    PXOPT_LOOKUP_BOOL(ignore, config->args, "-ignore", false);
 
     // default values
-    psS16 code = psMetadataLookupS16(&status, config->args, "-code");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
-        return false;
-    }
+    PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
     // we don't want to insert the last skyfile in a run but then not mark the
@@ -1071,5 +856,5 @@
         "       USING(warp_id)\n"
         "   LEFT JOIN warpSkyfile\n"
-        "       USING(warp_id, skycell_id, tess_id)\n"
+        "       USING(warp_id, skycell_id)\n"
         "   WHERE\n"
         "       warpRun.state = 'run'\n"
@@ -1111,10 +896,6 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
-    bool status = false;
-    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
-    if (!status) {
-        psError(PXTOOLS_ERR_PROG, 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);
 
     // find all rawImfiles matching the default query
@@ -1165,14 +946,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;
-        }
-    }
-
     if (psArrayLength(output)) {
         if (!convertIdToStr(output)) {
Index: /trunk/ippTools/src/warptoolConfig.c
===================================================================
--- /trunk/ippTools/src/warptoolConfig.c	(revision 16169)
+++ /trunk/ippTools/src/warptoolConfig.c	(revision 16170)
@@ -45,7 +45,5 @@
     }
 
-    psTime *time = psTimeGetNow(PS_TIME_TAI);
-    psString now = psTimeToISO(time);
-    psFree(time);
+    psTime *now = psTimeGetNow(PS_TIME_TAI);
 
     // -definerun
@@ -55,5 +53,11 @@
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,
             "define workdir (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-registered",  0,
+    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, "-simple",  0,
@@ -66,5 +70,5 @@
     psMetadataAddStr(runoneArgs, PS_LIST_TAIL, "-workdir", 0,
             "define workdir (required)", NULL);
-    psMetadataAddStr(runoneArgs, PS_LIST_TAIL, "-registered",  0,
+    psMetadataAddTime(runoneArgs, PS_LIST_TAIL, "-registered",  0,
             "time detrend run was registered", now);
     psMetadataAddStr(runoneArgs, PS_LIST_TAIL, "-cam_id", 0,
@@ -212,17 +216,17 @@
     psMetadata *modes   = psMetadataAlloc();
 
-    PXTOOL_ADD_MODE("-definerun",       "", WARPTOOL_MODE_DEFINERUN,      definerunArgs);
-    PXTOOL_ADD_MODE("-runone",          "", WARPTOOL_MODE_RUNONE,         runoneArgs);
-    PXTOOL_ADD_MODE("-updaterun",       "", WARPTOOL_MODE_UPDATERUN,      updaterunArgs);
-    PXTOOL_ADD_MODE("-addinputexp",     "", WARPTOOL_MODE_ADDINPUTEXP,    addinputexpArgs);
-    PXTOOL_ADD_MODE("-exp",             "", WARPTOOL_MODE_EXP,            expArgs);
-    PXTOOL_ADD_MODE("-imfile",          "", WARPTOOL_MODE_IMFILE,         imfileArgs);
-    PXTOOL_ADD_MODE("-tooverlap",       "", WARPTOOL_MODE_TOOVERLAP,      tooverlapArgs);
-    PXTOOL_ADD_MODE("-addoverlap",      "", WARPTOOL_MODE_ADDOVERLAP,     addoverlapArgs);
-    PXTOOL_ADD_MODE("-scmap",           "", WARPTOOL_MODE_SCMAP,          scmapArgs);
-    PXTOOL_ADD_MODE("-towarped",        "", WARPTOOL_MODE_TOWARPED,       towarpedArgs);
-    PXTOOL_ADD_MODE("-addwarped",       "", WARPTOOL_MODE_ADDWARPED,      addwarpedArgs);
-    PXTOOL_ADD_MODE("-warped",          "", WARPTOOL_MODE_WARPED,         warpedArgs);
-    PXTOOL_ADD_MODE("-revertwarped",    "", WARPTOOL_MODE_REVERTWARPED,   revertwarpedArgs);
+    PXOPT_ADD_MODE("-definerun",       "", WARPTOOL_MODE_DEFINERUN,      definerunArgs);
+    PXOPT_ADD_MODE("-runone",          "", WARPTOOL_MODE_RUNONE,         runoneArgs);
+    PXOPT_ADD_MODE("-updaterun",       "", WARPTOOL_MODE_UPDATERUN,      updaterunArgs);
+    PXOPT_ADD_MODE("-addinputexp",     "", WARPTOOL_MODE_ADDINPUTEXP,    addinputexpArgs);
+    PXOPT_ADD_MODE("-exp",             "", WARPTOOL_MODE_EXP,            expArgs);
+    PXOPT_ADD_MODE("-imfile",          "", WARPTOOL_MODE_IMFILE,         imfileArgs);
+    PXOPT_ADD_MODE("-tooverlap",       "", WARPTOOL_MODE_TOOVERLAP,      tooverlapArgs);
+    PXOPT_ADD_MODE("-addoverlap",      "", WARPTOOL_MODE_ADDOVERLAP,     addoverlapArgs);
+    PXOPT_ADD_MODE("-scmap",           "", WARPTOOL_MODE_SCMAP,          scmapArgs);
+    PXOPT_ADD_MODE("-towarped",        "", WARPTOOL_MODE_TOWARPED,       towarpedArgs);
+    PXOPT_ADD_MODE("-addwarped",       "", WARPTOOL_MODE_ADDWARPED,      addwarpedArgs);
+    PXOPT_ADD_MODE("-warped",          "", WARPTOOL_MODE_WARPED,         warpedArgs);
+    PXOPT_ADD_MODE("-revertwarped",    "", WARPTOOL_MODE_REVERTWARPED,   revertwarpedArgs);
 
     if (!pxGetOptions(stderr, argc, argv, config, modes, argSets)) {
