Index: trunk/ippTools/share/Makefile.am
===================================================================
--- trunk/ippTools/share/Makefile.am	(revision 23863)
+++ trunk/ippTools/share/Makefile.am	(revision 23864)
@@ -108,4 +108,5 @@
      disttool_revertrun_update.sql \
      disttool_revertrun_delete.sql \
+     disttool_revertfileset.sql \
      disttool_toadvance.sql \
      faketool_change_exp_state.sql \
Index: trunk/ippTools/share/disttool_revertfileset.sql
===================================================================
--- trunk/ippTools/share/disttool_revertfileset.sql	(revision 23864)
+++ trunk/ippTools/share/disttool_revertfileset.sql	(revision 23864)
@@ -0,0 +1,4 @@
+DELETE FROM rcDSFileset
+USING rcDSFileset, distRun
+WHERE distRun.dist_id = rcDSFileset.dist_id
+    AND rcDSFileset.fault != 0
Index: trunk/ippTools/src/disttool.c
===================================================================
--- trunk/ippTools/src/disttool.c	(revision 23863)
+++ trunk/ippTools/src/disttool.c	(revision 23864)
@@ -41,4 +41,8 @@
 static bool pendingfilesetMode(pxConfig *config);
 static bool addfilesetMode(pxConfig *config);
+static bool revertfilesetMode(pxConfig *config);
+static bool queuercrunMode(pxConfig *config);
+static bool updatercrunMode(pxConfig *config);
+static bool revertrcrunMode(pxConfig *config);
 static bool pendingdatastoresMode(pxConfig *config);
 
@@ -72,4 +76,8 @@
         MODECASE(DISTTOOL_MODE_PENDINGFILESET, pendingfilesetMode);
         MODECASE(DISTTOOL_MODE_ADDFILESET, addfilesetMode);
+        MODECASE(DISTTOOL_MODE_REVERTFILESET, revertfilesetMode);
+        MODECASE(DISTTOOL_MODE_QUEUERCRUN, queuercrunMode);
+        MODECASE(DISTTOOL_MODE_UPDATERCRUN, updatercrunMode);
+        MODECASE(DISTTOOL_MODE_REVERTRCRUN, revertrcrunMode);
         MODECASE(DISTTOOL_MODE_PENDINGDATASTORES, pendingdatastoresMode);
         default:
@@ -894,4 +902,53 @@
     return true;
 }
+static bool revertfilesetMode(pxConfig *config)
+{
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-fs_id", "fs_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-dist_id", "rcDSFileset.dist_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-prod_id", "prod_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-stage", "stage", "==");;
+    PXOPT_COPY_S64(config->args, where, "-stage_id", "stage_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-state", "state", "==");
+    PXOPT_COPY_STR(config->args, where, "-label", "label", "==");
+    PXOPT_COPY_S16(config->args, where, "-fault", "rcDSFileset.fault", "==");
+
+    // It might be useful to be able to query by the parameters of the underlying runs
+
+    if (!psListLength(where->list) && !psMetadataLookupBool(NULL, config->args, "-all")) {
+        psFree(where);
+        psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
+        return false;
+    }
+
+    psString query = pxDataGet("disttool_revertfileset.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
+        psFree(where);
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        if (!psDBRollback(config->dbh)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+        }
+        return false;
+    }
+    psFree(query);
+
+    int numUpdated = psDBAffectedRows(config->dbh);
+
+    psLogMsg("disttool", PS_LOG_INFO, "deleted %d rcDSFilesets", numUpdated);
+
+    return true;
+}
 
 static bool pendingdatastoresMode(pxConfig *config)
@@ -968,2 +1025,18 @@
     return true;
 }
+
+static bool queuercrunMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    return true;
+}
+static bool updatercrunMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    return true;
+}
+static bool revertrcrunMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    return true;
+}
Index: trunk/ippTools/src/disttool.h
===================================================================
--- trunk/ippTools/src/disttool.h	(revision 23863)
+++ trunk/ippTools/src/disttool.h	(revision 23864)
@@ -35,4 +35,8 @@
     DISTTOOL_MODE_PENDINGFILESET,
     DISTTOOL_MODE_ADDFILESET,
+    DISTTOOL_MODE_REVERTFILESET,
+    DISTTOOL_MODE_QUEUERCRUN,
+    DISTTOOL_MODE_UPDATERCRUN,
+    DISTTOOL_MODE_REVERTRCRUN,
     DISTTOOL_MODE_PENDINGDATASTORES,
 } disttoolMode;
Index: trunk/ippTools/src/disttoolConfig.c
===================================================================
--- trunk/ippTools/src/disttoolConfig.c	(revision 23863)
+++ trunk/ippTools/src/disttoolConfig.c	(revision 23864)
@@ -147,4 +147,16 @@
     psMetadataAddBool(pendingdatastoresArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
 
+    // -revertfileset
+    psMetadata *revertfilesetArgs = psMetadataAlloc();
+    psMetadataAddS64(revertfilesetArgs, PS_LIST_TAIL, "-fs_id", 0, "define fs_id", 0);
+    psMetadataAddS64(revertfilesetArgs, PS_LIST_TAIL, "-dist_id", 0, "define dist_id", 0);
+    psMetadataAddS64(revertfilesetArgs, PS_LIST_TAIL, "-prod_id", 0, "define dist_id", 0);
+    psMetadataAddStr(revertfilesetArgs, PS_LIST_TAIL, "-stage",    0, "define stage", NULL);
+    psMetadataAddS64(revertfilesetArgs, PS_LIST_TAIL, "-stage_id", 0, "define stage_id", 0);
+    psMetadataAddStr(revertfilesetArgs, PS_LIST_TAIL, "-state",    0, "define state", NULL);
+    psMetadataAddStr(revertfilesetArgs, PS_LIST_TAIL, "-label",    0, "define label", NULL);
+    psMetadataAddS16(revertfilesetArgs, PS_LIST_TAIL, "-fault", 0, "define fault code", 0);
+    psMetadataAddBool(revertfilesetArgs, PS_LIST_TAIL, "-all",    0, "revert all faulted runs", NULL);
+
     psMetadata *argSets = psMetadataAlloc();
     psMetadata *modes = psMetadataAlloc();
@@ -160,4 +172,5 @@
     PXOPT_ADD_MODE("-pendingfileset",      "", DISTTOOL_MODE_PENDINGFILESET, pendingfilesetArgs);
     PXOPT_ADD_MODE("-addfileset",      "", DISTTOOL_MODE_ADDFILESET, addfilesetArgs);
+    PXOPT_ADD_MODE("-revertfileset",      "", DISTTOOL_MODE_REVERTFILESET, revertfilesetArgs);
     PXOPT_ADD_MODE("-pendingdatastores",      "", DISTTOOL_MODE_PENDINGDATASTORES, pendingdatastoresArgs);
 
