Index: /trunk/ippTools/src/camtool.c
===================================================================
--- /trunk/ippTools/src/camtool.c	(revision 11023)
+++ /trunk/ippTools/src/camtool.c	(revision 11024)
@@ -30,4 +30,5 @@
 static bool pendingimfileMode(pxConfig *config);
 static bool addprocessedexpMode(pxConfig *config);
+static bool faultexpMode(pxConfig *config);
 static bool blockMode(pxConfig *config);
 static bool maskedMode(pxConfig *config);
@@ -51,4 +52,5 @@
         MODECASE(P3TOOL_MODE_PENDINGIMFILE,     pendingimfileMode);
         MODECASE(P3TOOL_MODE_ADDPROCESSEDEXP,   addprocessedexpMode);
+        MODECASE(P3TOOL_MODE_FAULTEXP,          faultexpMode);
         MODECASE(P3TOOL_MODE_BLOCK,             blockMode);
         MODECASE(P3TOOL_MODE_MASKED,            maskedMode);
@@ -76,4 +78,17 @@
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
+
+    bool status = false;
+    psU64 limit = psMetadataLookupU64(&status, config->args, "-limit");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -limit");
+        return false;
+    }
+
+    bool faulted = psMetadataLookupU64(&status, config->args, "-faulted");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -faulted");
+        return false;
+    }
 
     psString query = psStringCopy(
@@ -97,4 +112,19 @@
         psStringAppend(&query, " %s", whereClause);
         psFree(whereClause);
+    }
+
+    if (faulted) {
+        // list only faulted rows
+        psStringAppend(&query, " %s", "AND p3PendingExp.fault != 0");
+    } else {
+        // don't list faulted rows
+        psStringAppend(&query, " %s", "AND p3PendingExp.fault = 0");
+    }
+
+    // treat limit == 0 as "no limit"
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, " %s", limitString);
+        psFree(limitString);
     }
 
@@ -390,4 +420,25 @@
 }
 
+
+static bool faultexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    bool status = false;
+    psS8 code = psMetadataLookupS8(&status, config->args, "-code");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -code");
+        return false;
+    }
+
+    if (!pxSetFaultCode(config->dbh, "p3PendingExp", config->where, code)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to set set fault flag");
+        return false;
+    }
+
+    return true;
+}
+
+
 static bool blockMode(pxConfig *config)
 {
Index: /trunk/ippTools/src/camtool.h
===================================================================
--- /trunk/ippTools/src/camtool.h	(revision 11023)
+++ /trunk/ippTools/src/camtool.h	(revision 11024)
@@ -28,4 +28,5 @@
     P3TOOL_MODE_PENDINGIMFILE,
     P3TOOL_MODE_ADDPROCESSEDEXP,
+    P3TOOL_MODE_FAULTEXP,
     P3TOOL_MODE_BLOCK,
     P3TOOL_MODE_MASKED,
Index: /trunk/ippTools/src/camtoolConfig.c
===================================================================
--- /trunk/ippTools/src/camtoolConfig.c	(revision 11023)
+++ /trunk/ippTools/src/camtoolConfig.c	(revision 11024)
@@ -49,6 +49,11 @@
     psMetadataAddS32(pendingexpArgs, PS_LIST_TAIL, "-p3_version", 0,
             "search for exposures with this p3 version", -1);
+    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);
+
     
     // -pendingimfile
@@ -93,4 +98,15 @@
             "define banana 2", NULL);
 
+    // -faultexp
+    psMetadata *faultexpArgs = psMetadataAlloc();
+    psMetadataAddStr(faultexpArgs, PS_LIST_TAIL, "-exp_tag",  0,
+        "search by exposure ID", NULL);
+    psMetadataAddStr(faultexpArgs, PS_LIST_TAIL, "-class",  0,
+        "search by class", NULL);
+    psMetadataAddStr(faultexpArgs, PS_LIST_TAIL, "-class_id",  0,
+        "search by class ID", NULL);
+    psMetadataAddS8(faultexpArgs, PS_LIST_TAIL, "-code",  0,
+        "set fault code (required)", 0);
+
     // -block
     psMetadata *blockArgs = psMetadataAlloc();
@@ -128,10 +144,11 @@
     psMetadata *argSets = psMetadataAlloc();
     // find which mode we're running under
-    PXTOOL_MODE("-pendingexp",   P3TOOL_MODE_PENDINGEXP,  pendingexpArgs);
-    PXTOOL_MODE("-pendingimfile",P3TOOL_MODE_PENDINGIMFILE,pendingimfileArgs);
+    PXTOOL_MODE("-pendingexp",   P3TOOL_MODE_PENDINGEXP,    pendingexpArgs);
+    PXTOOL_MODE("-pendingimfile",P3TOOL_MODE_PENDINGIMFILE, pendingimfileArgs);
+    PXTOOL_MODE("-faultexp",     P3TOOL_MODE_FAULTEXP,      faultexpArgs);
     PXTOOL_MODE("-addprocessedexp", P3TOOL_MODE_ADDPROCESSEDEXP, addprocessedexpArgs);
-    PXTOOL_MODE("-block",        P3TOOL_MODE_BLOCK,          blockArgs);
-    PXTOOL_MODE("-masked",       P3TOOL_MODE_MASKED,         maskedArgs);
-    PXTOOL_MODE("-unblock",      P3TOOL_MODE_UNBLOCK,        unblockArgs);
+    PXTOOL_MODE("-block",        P3TOOL_MODE_BLOCK,         blockArgs);
+    PXTOOL_MODE("-masked",       P3TOOL_MODE_MASKED,        maskedArgs);
+    PXTOOL_MODE("-unblock",      P3TOOL_MODE_UNBLOCK,       unblockArgs);
 
     bool argErr = false;
@@ -210,5 +227,5 @@
     addWhereStr(filter);
 
-    if (config->where->list->n < 1) {
+    if (psListLength(config->where->list) < 1) {
         psFree(config->where);
         config->where = NULL;
Index: /trunk/ippTools/src/chiptool.c
===================================================================
--- /trunk/ippTools/src/chiptool.c	(revision 11023)
+++ /trunk/ippTools/src/chiptool.c	(revision 11024)
@@ -768,5 +768,6 @@
         pendingExp->p1_version,
         pendingExp->p2_version,
-        pendingExp->label
+        pendingExp->label,
+        0   // fault code
     );
 }
