Index: /trunk/ippTools/src/regtool.c
===================================================================
--- /trunk/ippTools/src/regtool.c	(revision 10975)
+++ /trunk/ippTools/src/regtool.c	(revision 10976)
@@ -31,4 +31,5 @@
 static bool updateexpMode(pxConfig *config);
 static bool updateimfileMode(pxConfig *config);
+static bool faultexpMode(pxConfig *config);
 static bool faultimfileMode(pxConfig *config);
 static bool rawimfileMode(pxConfig *config);
@@ -39,5 +40,6 @@
 static rawDetrendExpRow *newToRawDetrendExp(pxConfig *config, newExpRow *exp);
 static rawImfileRow *newToRawImfile(pxConfig *config, newImfileRow *exp);
-static psU32 mapCodeStrToInt(char *codeStr);
+static psU32 mapCodeStrToInt(const char *codeStr);
+static bool setFaultFlags(psDB *dbh, const char *tableName, psMetadata *where, const char *codeStr);
 
 
@@ -56,10 +58,11 @@
 
     switch (config->mode) {
-        MODECASE(P0TOOL_MODE_PENDINGEXP,      pendingexpMode);
-        MODECASE(P0TOOL_MODE_PENDINGIMFILE,   pendingimfileMode);
-        MODECASE(P0TOOL_MODE_UPDATEEXP,       updateexpMode);
-        MODECASE(P0TOOL_MODE_UPDATEIMFILE,    updateimfileMode);
-        MODECASE(P0TOOL_MODE_FAULTIMFILE,     faultimfileMode);
-        MODECASE(P0TOOL_MODE_RAWIMFILE,       rawimfileMode);
+        MODECASE(P0TOOL_MODE_PENDINGEXP,        pendingexpMode);
+        MODECASE(P0TOOL_MODE_PENDINGIMFILE,     pendingimfileMode);
+        MODECASE(P0TOOL_MODE_UPDATEEXP,         updateexpMode);
+        MODECASE(P0TOOL_MODE_FAULTEXP,          faultexpMode);
+        MODECASE(P0TOOL_MODE_UPDATEIMFILE,      updateimfileMode);
+        MODECASE(P0TOOL_MODE_FAULTIMFILE,       faultimfileMode);
+        MODECASE(P0TOOL_MODE_RAWIMFILE,         rawimfileMode);
         default:
             psAbort(argv[0], "invalid option (this should not happen)");
@@ -89,4 +92,10 @@
     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;
     }
@@ -117,4 +126,12 @@
     );
 
+    if (faulted) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "AND newExp.flags > 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "AND newExp.flags = 0");
+    }
+
     // treat limit == 0 as "no limit"
     if (limit) {
@@ -255,8 +272,6 @@
 }
 
-static bool faultimfileMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
+static bool faultexpMode(pxConfig *config)
+{
     bool status = false;
     psString codeStr = psMetadataLookupStr(&status, config->args, "-code");
@@ -269,4 +284,41 @@
         return false;
     }
+
+    if (!setFaultFlags(config->dbh, "newExp", config->where, codeStr)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
+        return false;
+    }
+
+    return true;
+}
+
+static bool faultimfileMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    bool status = false;
+    psString codeStr = psMetadataLookupStr(&status, config->args, "-code");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
+        return false;
+    }
+    if (!codeStr) {
+        psError(PS_ERR_UNKNOWN, true, "-code is required");
+        return false;
+    }
+
+    if (!setFaultFlags(config->dbh, "newImfile", config->where, codeStr)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
+        return false;
+    }
+
+    return true;
+}
+
+static bool setFaultFlags(psDB *dbh, const char *tableName, psMetadata *where, const char *codeStr)
+{
+    PS_ASSERT_PTR_NON_NULL(dbh, false);
+    PS_ASSERT_PTR_NON_NULL(tableName, false);
+    PS_ASSERT_PTR_NON_NULL(codeStr, false);
 
     // map code string to numeric fault code
@@ -286,5 +338,5 @@
     psFree(values);
 
-    long rowsAffected = psDBUpdateRows(config->dbh, "newImfile", config->where, values); 
+    long rowsAffected = psDBUpdateRows(dbh, tableName, where, values); 
     if (rowsAffected < 0) {
         // database error
@@ -300,4 +352,5 @@
     return true;
 }
+
 
 static bool updateexpMode(pxConfig *config)
@@ -1088,5 +1141,5 @@
 }
 
-static psU32 mapCodeStrToInt(char *codeStr)
+static psU32 mapCodeStrToInt(const char *codeStr)
 {
     if (strcasestr(codeStr, "none")) {
Index: /trunk/ippTools/src/regtool.h
===================================================================
--- /trunk/ippTools/src/regtool.h	(revision 10975)
+++ /trunk/ippTools/src/regtool.h	(revision 10976)
@@ -28,4 +28,5 @@
     P0TOOL_MODE_PENDINGIMFILE,
     P0TOOL_MODE_UPDATEEXP,
+    P0TOOL_MODE_FAULTEXP,
     P0TOOL_MODE_UPDATEIMFILE,
     P0TOOL_MODE_FAULTIMFILE,
Index: /trunk/ippTools/src/regtoolConfig.c
===================================================================
--- /trunk/ippTools/src/regtoolConfig.c	(revision 10975)
+++ /trunk/ippTools/src/regtoolConfig.c	(revision 10976)
@@ -55,4 +55,6 @@
     psMetadataAddU64(pendingexpArgs, PS_LIST_TAIL, "-limit",  0,
         "limit result set to N items", 0);
+    psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-faulted",  0,
+        "only return imfiles with a fault status set", false);
     psMetadataAddBool(pendingexpArgs, PS_LIST_TAIL, "-simple",  0,
         "use the simple output format", false);
@@ -118,4 +120,11 @@
     psMetadataAddBool(updateexpArgs, PS_LIST_TAIL, "-detrend",  0,
         "declare this as detrend data", false);
+
+    // -faultexp
+    psMetadata *faultexpArgs = psMetadataAlloc();
+    psMetadataAddStr(faultexpArgs, PS_LIST_TAIL, "-exp_tag",  0,
+        "search by exposure ID", NULL);
+    psMetadataAddStr(faultexpArgs, PS_LIST_TAIL, "-code",  0,
+        "set fault code (required)", NULL);
     
     // -updateimfile
@@ -198,10 +207,11 @@
     psMetadata *argSets = psMetadataAlloc();
     // find which mode we're running under
-    PXTOOL_MODE("-pendingexp",   P0TOOL_MODE_PENDINGEXP,  pendingexpArgs);
-    PXTOOL_MODE("-pendingimfile",P0TOOL_MODE_PENDINGIMFILE,pendingimfileArgs);
-    PXTOOL_MODE("-updateexp",    P0TOOL_MODE_UPDATEEXP,   updateexpArgs);
-    PXTOOL_MODE("-updateimfile", P0TOOL_MODE_UPDATEIMFILE,updateimfileArgs);
-    PXTOOL_MODE("-faultimfile",  P0TOOL_MODE_FAULTIMFILE, faultimfileArgs);
-    PXTOOL_MODE("-rawimfile",    P0TOOL_MODE_RAWIMFILE,   rawimfileArgs);
+    PXTOOL_MODE("-pendingexp",   P0TOOL_MODE_PENDINGEXP,    pendingexpArgs);
+    PXTOOL_MODE("-pendingimfile",P0TOOL_MODE_PENDINGIMFILE, pendingimfileArgs);
+    PXTOOL_MODE("-updateexp",    P0TOOL_MODE_UPDATEEXP,     updateexpArgs);
+    PXTOOL_MODE("-faultexp",     P0TOOL_MODE_FAULTEXP,      faultexpArgs);
+    PXTOOL_MODE("-updateimfile", P0TOOL_MODE_UPDATEIMFILE,  updateimfileArgs);
+    PXTOOL_MODE("-faultimfile",  P0TOOL_MODE_FAULTIMFILE,   faultimfileArgs);
+    PXTOOL_MODE("-rawimfile",    P0TOOL_MODE_RAWIMFILE,     rawimfileArgs);
 
     bool argErr = false;
