Index: /branches/end_stage/ippTools/src/difftool.c
===================================================================
--- /branches/end_stage/ippTools/src/difftool.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/difftool.c	(revision 16118)
@@ -101,22 +101,7 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false);
 
-    // optional
+    // default
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-
-    psTime *registered = NULL;
-    {
-        bool status;
-        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_TIME(registered, config->args, "-registered", false, false);
 
     diffRunRow *run = diffRunRowAlloc(
@@ -129,5 +114,4 @@
             tess_id
     );
-    psFree(registered);
     if (!run) {
         psError(PS_ERR_UNKNOWN, false, "failed to alloc diffRun object");
@@ -676,21 +660,7 @@
     }
 
-    psTime *registered = NULL;
-    {
-        bool status;
-        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;
-        }
-    }
-
+    // default
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
 
     diffRunRow *run = diffRunRowAlloc(
@@ -703,5 +673,4 @@
             tess_id
     );
-    psFree(registered);
 
     if (!run) {
Index: /branches/end_stage/ippTools/src/flatcorr.c
===================================================================
--- /branches/end_stage/ippTools/src/flatcorr.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/flatcorr.c	(revision 16118)
@@ -124,4 +124,24 @@
   ADDRENAMEPARAMF(from, to, type, name, name, "==")
 
+#define ADDRENAMEPARAMTIME(from, to, oldname, newname, comment) \
+{ \
+    bool status = false; \
+    psTime *time = psMetadataLookupTime(&status, from, "-" oldname); \
+    if (!status) { \
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -" oldname); \
+        return false; \
+    } \
+    if (time) { \
+        if (!psMetadataAddTime(to, PS_LIST_TAIL, newname, PS_META_DUPLICATE_OK, comment, time)) { \
+            psError(PS_ERR_UNKNOWN, false, "failed to add item " newname); \
+            psFree(to); \
+            return false; \
+        } \
+    } \
+}
+
+#define ADDPARAMTIME(from, to, name) \
+  ADDRENAMEPARAMTIME(from, to, name, name, "==")
+
 static bool newrunMode(pxConfig *config)
 {
@@ -143,6 +163,6 @@
     ADDRENAMEPARAMSTR(config->args, where, "inst", "camera", "==");
     ADDPARAMSTR(config->args, where, "telescope");
-    ADDPARAMSTR(config->args, where, "dateobs_begin");
-    ADDPARAMSTR(config->args, where, "dateobs_end");
+    ADDPARAMTIME(config->args, where, "dateobs_begin");
+    ADDPARAMTIME(config->args, where, "dateobs_end");
     ADDPARAMSTR(config->args, where, "exp_tag");
     ADDPARAMSTR(config->args, where, "exp_type");
Index: /branches/end_stage/ippTools/src/flatcorrConfig.c
===================================================================
--- /branches/end_stage/ippTools/src/flatcorrConfig.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/flatcorrConfig.c	(revision 16118)
@@ -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,
Index: /branches/end_stage/ippTools/src/magictool.c
===================================================================
--- /branches/end_stage/ippTools/src/magictool.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/magictool.c	(revision 16118)
@@ -269,22 +269,7 @@
     PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-
-    psTime *registered = NULL;
-    {
-        bool status;
-        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(
+    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+
+    magicRunRow *run = magicRunRowAlloc(
             0,          // ID
             "reg",      // state
Index: /branches/end_stage/ippTools/src/magictoolConfig.c
===================================================================
--- /branches/end_stage/ippTools/src/magictoolConfig.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/magictoolConfig.c	(revision 16118)
@@ -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,
Index: /branches/end_stage/ippTools/src/pxconfig.c
===================================================================
--- /branches/end_stage/ippTools/src/pxconfig.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/pxconfig.c	(revision 16118)
@@ -197,4 +197,5 @@
                 goto ARG_REQUIRED;
             case PS_DATA_STRING:
+            case PS_DATA_TIME:
             case PS_DATA_METADATA:
                 if (item->data.V) {
Index: /branches/end_stage/ippTools/src/regtool.c
===================================================================
--- /branches/end_stage/ippTools/src/regtool.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/regtool.c	(revision 16118)
@@ -222,21 +222,5 @@
     PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
     PXOPT_LOOKUP_STR(object, config->args, "-object", false, false);
-
-    psTime *dateobs = NULL;
-    {
-        bool status;
-        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;
-        }
-    }
-
+    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
     PXOPT_LOOKUP_S16(code, config->args, "-code", false, false);
 
@@ -297,9 +281,6 @@
     )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(dateobs);
-        return false;
-    }
-
-    psFree(dateobs);
+        return false;
+    }
 
     return true;
@@ -563,20 +544,5 @@
     PXOPT_LOOKUP_F64(user_5, config->args, "-user_5", false, false);
     PXOPT_LOOKUP_STR(object, config->args, "-object", false, false);
-
-    psTime *dateobs = NULL;
-    {
-        bool status;
-        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;
-        }
-    }
+    PXOPT_LOOKUP_TIME(dateobs, config->args, "-dateobs", false, false);
 
     // default
Index: /branches/end_stage/ippTools/src/regtoolConfig.c
===================================================================
--- /branches/end_stage/ippTools/src/regtoolConfig.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/regtoolConfig.c	(revision 16118)
@@ -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,
Index: /branches/end_stage/ippTools/src/stacktool.c
===================================================================
--- /branches/end_stage/ippTools/src/stacktool.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/stacktool.c	(revision 16118)
@@ -99,6 +99,7 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false);
 
-    // optional
+    // 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
@@ -108,20 +109,4 @@
         psError(PS_ERR_UNKNOWN, true, "-warp_id is required");
         return false;
-    }
-
-    psTime *registered = NULL;
-    {
-        bool status;
-        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;
-        }
     }
 
@@ -135,5 +120,4 @@
             tess_id
     );
-    psFree(registered);
     if (!run) {
         psError(PS_ERR_UNKNOWN, false, "failed to alloc stackRun object");
Index: /branches/end_stage/ippTools/src/stacktoolConfig.c
===================================================================
--- /branches/end_stage/ippTools/src/stacktoolConfig.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/stacktoolConfig.c	(revision 16118)
@@ -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,
Index: /branches/end_stage/ippTools/src/warptool.c
===================================================================
--- /branches/end_stage/ippTools/src/warptool.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/warptool.c	(revision 16118)
@@ -120,21 +120,8 @@
     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);
-
-    psTime *registered = NULL;
-    {
-        bool status;
-        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_TIME(registered, config->args, "-registered", false, false);
 
     warpRunRow *warpRun = warpRunRowAlloc(
@@ -149,5 +136,4 @@
             registered
     );
-    psFree(registered);
     if (!warpRun) {
         psError(PS_ERR_UNKNOWN, false, "failed to alloc warpRun object");
Index: /branches/end_stage/ippTools/src/warptoolConfig.c
===================================================================
--- /branches/end_stage/ippTools/src/warptoolConfig.c	(revision 16117)
+++ /branches/end_stage/ippTools/src/warptoolConfig.c	(revision 16118)
@@ -45,7 +45,5 @@
     }
 
-    psTime *time = psTimeGetNow(PS_TIME_TAI);
-    psString now = psTimeToISO(time);
-    psFree(time);
+    psTime *now = psTimeGetNow(PS_TIME_TAI);
 
     // -definerun
@@ -61,5 +59,5 @@
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-end_stage", 0,
             "define end stage", 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,
@@ -72,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,
