Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/camtool.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/camtool.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/camtool.c	(revision 37403)
@@ -501,4 +501,6 @@
     PXOPT_LOOKUP_S16(quality, config->args, "-quality", false, false);
     PXOPT_LOOKUP_S16(background_model, config->args, "-background_model", false, false);
+    PXOPT_LOOKUP_S64(astrom_chips, config->args, "-astrom_chips", false, false);
+
     
     PXOPT_LOOKUP_STR(ver_pslib, config->args, "-ver_pslib", false, false);
@@ -692,5 +694,6 @@
         deteff_uq,
         quality,
-	background_model
+	background_model,
+        astrom_chips
         );
 
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/camtoolConfig.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/camtoolConfig.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/camtoolConfig.c	(revision 37403)
@@ -205,4 +205,5 @@
     psMetadataAddF32(addprocessedexpArgs, PS_LIST_TAIL, "-deteff_inst_uq", 0, "define deteff_uq", NAN);
     psMetadataAddS16(addprocessedexpArgs, PS_LIST_TAIL, "-background_model", 0, "set background_model value", 0);
+    psMetadataAddS64(addprocessedexpArgs, PS_LIST_TAIL, "-astrom_chips", 0, "chips with successful astrom", 0);
 
     // -processedexp
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/disttool.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/disttool.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/disttool.c	(revision 37403)
@@ -605,4 +605,6 @@
     PXOPT_COPY_TIME(config->args, where, "-time_stamp_begin", "distRun.time_stamp", ">=");
     PXOPT_COPY_TIME(config->args, where, "-time_stamp_end", "distRun.time_stamp", "<=");
+    PXOPT_COPY_S64(config->args, where, "-dist_id_min", "dist_id", ">=");
+    PXOPT_COPY_S64(config->args, where, "-dist_id_max", "dist_id", "<=");
 
     PXOPT_LOOKUP_BOOL(clean, config->args, "-clean", false);
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/disttoolConfig.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/disttoolConfig.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/disttoolConfig.c	(revision 37403)
@@ -85,4 +85,6 @@
     psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-time_stamp_begin", 0, "limit updates by time_stamp (>=)", NULL); 
     psMetadataAddTime(updaterunArgs, PS_LIST_TAIL, "-time_stamp_end", 0, "limit updates by time_stamp (<=)", NULL); 
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-dist_id_min",  0, "limit updates by dist_id (>=)", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-dist_id_max",  0, "limit updates by dist_id (<=)", 0);
     psMetadataAddBool(updaterunArgs, PS_LIST_TAIL,"-clean",     0, "limit updates to clean distRuns", false);
     psMetadataAddBool(updaterunArgs, PS_LIST_TAIL,"-full",      0, "limit updates to not clean distRuns", false);
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptool.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptool.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptool.c	(revision 37403)
@@ -25,4 +25,5 @@
 static bool pendingrunMode(pxConfig *config);
 static bool updaterunMode(pxConfig *config);
+static bool revertsassMode(pxConfig *config);
 
 // Exposure level
@@ -69,5 +70,6 @@
     MODECASE(LAPTOOL_MODE_PENDINGRUN,    pendingrunMode);
     MODECASE(LAPTOOL_MODE_UPDATERUN,     updaterunMode);
-
+    MODECASE(LAPTOOL_MODE_REVERTSASS,    revertsassMode);
+    
     MODECASE(LAPTOOL_MODE_PENDINGEXP,    pendingexpMode);
     MODECASE(LAPTOOL_MODE_EXPOSURES,     exposuresMode);
@@ -695,4 +697,51 @@
 }
 
+static bool revertsassMode(pxConfig *config)
+{
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_S64(config->args, where, "-lap_id", "lap_id", "==");
+  PXOPT_COPY_S64(config->args, where, "-sass_id", "final_sass_id", "==");
+  if (!psListLength(where->list)) {
+    psFree(where);
+    psError(PXTOOLS_ERR_CONFIG, false, "search parameters are required");
+    return false;
+  }
+
+  psString query = pxDataGet("laptool_revertsass.sql");
+  if (!query) {
+    psError(PXTOOLS_ERR_SYS, false, "failed to retrieve SQL statement");
+    return(false);
+  }
+  psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+  psStringAppend(&query, "\n WHERE %s", whereClause);
+  psFree(whereClause);
+
+  if (!psDBTransaction(config->dbh)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    return false;
+  }
+  
+  if (!p_psDBRunQuery(config->dbh, query)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    psFree(query);
+    return false;
+  }
+  psFree(query);
+
+  long numUpdated = psDBAffectedRows(config->dbh);
+  if (numUpdated != 1) {
+    psError(PS_ERR_UNKNOWN, false, "should have updated only one row. updated %ld", numUpdated);
+    return false;
+  }
+
+  if (!psDBCommit(config->dbh)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    return false;
+  }
+  
+  return true;
+}
 // Exposure level
 
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptool.h
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptool.h	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptool.h	(revision 37403)
@@ -19,4 +19,5 @@
   LAPTOOL_MODE_EXPOSURES,
   LAPTOOL_MODE_STACKS,
+  LAPTOOL_MODE_REVERTSASS,
   LAPTOOL_MODE_UPDATEEXP,
   LAPTOOL_MODE_DIFFCHECK,
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptoolConfig.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptoolConfig.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/laptoolConfig.c	(revision 37403)
@@ -117,4 +117,9 @@
   ADD_OPT(S64, updaterunArgs, "-set_final_sass_id",           "set final stack sass_id", 0);
   
+  // -revertsass
+  psMetadata *revertsassArgs = psMetadataAlloc();
+  ADD_OPT(S64, revertsassArgs, "-lap_id",                     "search by lap run id", 0);
+  ADD_OPT(S64, revertsassArgs, "-sass_id",                    "sass id that is being removed", 0);
+
   // -pendingexp
   psMetadata *pendingexpArgs = psMetadataAlloc();
@@ -136,5 +141,5 @@
   ADD_OPT(Bool,stacksArgs, "-simple",                         "use the simple output format", false);
   ADD_OPT(U64, stacksArgs, "-limit",                          "limit result set to N items", 0);
-  
+	  
   // -updateexp
   psMetadata *updateexpArgs = psMetadataAlloc();
@@ -227,4 +232,5 @@
   PXOPT_ADD_MODE("-listrun",                 "", LAPTOOL_MODE_PENDINGRUN,       listrunArgs);
   PXOPT_ADD_MODE("-updaterun",               "", LAPTOOL_MODE_UPDATERUN,        updaterunArgs);
+  PXOPT_ADD_MODE("-revertsass",              "mode to remove the sass_id", LAPTOOL_MODE_REVERTSASS,   revertsassArgs);
   PXOPT_ADD_MODE("-pendingexp",              "", LAPTOOL_MODE_PENDINGEXP,       pendingexpArgs);
   PXOPT_ADD_MODE("-exposures",               "", LAPTOOL_MODE_EXPOSURES,        exposuresArgs);
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetool.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetool.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetool.c	(revision 37403)
@@ -44,7 +44,10 @@
 static bool updaterelexpMode(pxConfig *config);
 static bool listrelexpMode(pxConfig *config);
+static bool deleterelexpMode(pxConfig *config);
 static bool definerelstackMode(pxConfig *config);
 static bool updaterelstackMode(pxConfig *config);
+static bool setrelstackcalibratedfromskycalMode(pxConfig *config);
 static bool listrelstackMode(pxConfig *config);
+static bool deleterelstackMode(pxConfig *config);
 static bool summaryMode(pxConfig *config);
 static bool definerelgroupMode(pxConfig *config);
@@ -81,8 +84,11 @@
         MODECASE(RELEASETOOL_MODE_UPDATERELEXP,     updaterelexpMode);
         MODECASE(RELEASETOOL_MODE_LISTRELEXP,       listrelexpMode);
+        MODECASE(RELEASETOOL_MODE_DELETERELEXP,     deleterelexpMode);
 
         MODECASE(RELEASETOOL_MODE_DEFINERELSTACK,   definerelstackMode);
         MODECASE(RELEASETOOL_MODE_UPDATERELSTACK,   updaterelstackMode);
+        MODECASE(RELEASETOOL_MODE_SETRELSTACKCALIBRATEDFROMSKYCAL, setrelstackcalibratedfromskycalMode);
         MODECASE(RELEASETOOL_MODE_LISTRELSTACK,     listrelstackMode);
+        MODECASE(RELEASETOOL_MODE_DELETERELSTACK,   deleterelstackMode);
         MODECASE(RELEASETOOL_MODE_SUMMARY,          summaryMode);
 
@@ -780,5 +786,7 @@
 
     if (priority_order) {
-        psStringAppend(&query, "\nAND priority > 0 order by exp_id, priority DESC");
+        psStringAppend(&query, "\nAND priority > 0 ORDER BY exp_id, priority DESC");
+    } else {
+        psStringAppend(&query, "\nORDER BY exp_id, relexp_id DESC");
     }
 
@@ -815,4 +823,62 @@
 
     psFree(output);
+
+    return true;
+}
+
+static bool deleterelexpMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_S64(relexp_id, config->args,   "-relexp_id", false, false);
+    // If relexp_id is supplied that is all that we need
+    if (!relexp_id) {
+        // Otherwise we need to identify the release ...
+        PXOPT_LOOKUP_STR(release_name, config->args, "-release_name", false, false);
+        PXOPT_LOOKUP_S32(rel_id, config->args,      "-rel_id", false, false);
+
+        if (!release_name && !rel_id) {
+            psError(PXTOOLS_ERR_CONFIG, true, "at least one of -relexp_id, -release_name, or -rel_id is required\n");
+            return false;
+        }
+        // ... and the exposure
+        PXOPT_LOOKUP_STR(label, config->args,       "-label", false, false);
+        PXOPT_LOOKUP_S64(cam_id, config->args,      "-cam_id", false, false);
+        PXOPT_LOOKUP_S64(exp_id, config->args,      "-exp_id", false, false);
+        PXOPT_LOOKUP_STR(exp_name, config->args,    "-exp_name", false, false);
+        if (!label && !cam_id && !exp_id && !exp_name) {
+            psError(PXTOOLS_ERR_CONFIG, true, "at least one of -label, -cam_id, -exp_id, -exp_name is required\n");
+            return false;
+        }
+    }
+
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_S32(config->args, where, "-relexp_id", "relExp.relexp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-label",  "camRun.label", "==");
+    PXOPT_COPY_S64(config->args, where, "-cam_id", "relExp.cam_id", "==");
+    PXOPT_COPY_S64(config->args, where, "-exp_id", "relExp.exp_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-exp_name", "rawExp.exp_name", "==");
+
+    PXOPT_COPY_S32(config->args, where, "-rel_id",  "relExp.rel_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-release_name", "ippRelease.release_name", "==");
+
+    psString query = pxDataGet("releasetool_deleterelexp.sql");
+
+    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+    psStringAppend(&query, "\n    AND %s", whereClause);
+    psFree(whereClause);
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+
+    psU64 affected = psDBAffectedRows(config->dbh);
+    psLogMsg("releasetool", PS_LOG_INFO, "Deleted %" PRIu64 " relExp rows", affected);
+
+
+    psFree(query);
 
     return true;
@@ -1026,4 +1092,130 @@
     return false;
 }
+static bool setrelstackcalibratedfromskycalMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, NULL);
+
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_STR(config->args, where, "-skycal_label", "skycalRun.label", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycal_data_group", "skycalRun.data_group", "LIKE");
+    PXOPT_COPY_S64(config->args, where, "-skycal_id",  "skycalRun.skycal_id", "==");
+    if (!psListLength(where->list)) {
+        psError(PXTOOLS_ERR_CONFIG, false, "at least one of -skycal_label, -skycal_data_group, or -skycal_id is required");
+        return false;
+    }
+
+    PXOPT_COPY_STR(config->args, where, "-tess_id",    "stackRun.tess_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id", "stackRun.skycell_id", "==");
+    pxskycellAddWhere(config, where);
+
+    // insure that at least one of these is supplied to select the release
+    PXOPT_LOOKUP_S64(rel_id, config->args,      "-rel_id", false, false);
+    PXOPT_LOOKUP_STR(release_name, config->args, "-release_name", false, false);
+    if (!rel_id && !release_name) {
+        psError(PXTOOLS_ERR_CONFIG, true, "either -rel_id or -release_name is required");
+        return false;
+    }
+
+    // limit query to the target release. (Note: this will select nothing if release_name and rel_id don't match)
+    // note: we add these after above to insure that search args are supplied
+    PXOPT_COPY_STR(config->args, where, "-release_name", "ippRelease.release_name", "==");
+    PXOPT_COPY_S32(config->args, where, "-rel_id", "ippRelease.rel_id", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+    PXOPT_LOOKUP_BOOL(replace, config->args, "-replace", false);
+
+    psString query = pxDataGet("releasetool_setrelstackcalibratedfromskycal.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_SYS, false, "failed to retreive SQL statement");
+        psFree(where);
+        return false;
+    }
+
+    if (replace) {
+        // don't cut on relStack.state
+        psStringAppend(&query, "\nWHERE ");;
+    } else {
+        // normal path only update rows in state processed
+        psStringAppend(&query, "\nWHERE relStack.state = 'processed'\nAND ");;
+    }
+        
+    // Add in the where conditions
+    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+    psStringAppend(&query, "%s", whereClause);
+    psFree(whereClause);
+
+    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);
+
+    psU64 affected = psDBAffectedRows(config->dbh);
+    psLogMsg("releasetool", PS_LOG_INFO, "Updated %" PRIu64 " relStack rows", affected);
+
+    return true;
+}
+
+static bool deleterelstackMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    PXOPT_LOOKUP_S64(relstack_id, config->args,   "-relstack_id", false, false);
+    // If relexp_id is supplied that is all that we need
+    if (!relstack_id) {
+        // Otherwise we need to identify the release ...
+        PXOPT_LOOKUP_STR(release_name, config->args, "-release_name", false, false);
+        PXOPT_LOOKUP_S32(rel_id, config->args,      "-rel_id", false, false);
+
+        if (!release_name && !rel_id) {
+            psError(PXTOOLS_ERR_CONFIG, true, "at least one of -relstack_id, -release_name, or -rel_id is required\n");
+            return false;
+        }
+        // ... and the Stack
+        PXOPT_LOOKUP_STR(label, config->args,       "-label", false, false);
+        PXOPT_LOOKUP_S64(stack_id, config->args,    "-stack_id", false, false);
+        if (!label && !stack_id) {
+            psError(PXTOOLS_ERR_CONFIG, true, "at least one of -label and  -stack_id is required\n");
+            return false;
+        }
+    }
+
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_S32(config->args, where, "-relstack_id", "relStack.relstack_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-label", "stackRun.label", "==");
+    PXOPT_COPY_S64(config->args, where, "-stack_id", "relStack.stack_id", "==");
+
+    PXOPT_COPY_S32(config->args, where, "-rel_id", "relStack.rel_id", "==");
+    PXOPT_COPY_STR(config->args, where, "-release_name", "ippRelease.release_name", "==");
+
+    psString query = pxDataGet("releasetool_deleterelstack.sql");
+
+    psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
+    psStringAppend(&query, "\n    AND %s", whereClause);
+    psFree(whereClause);
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+
+    psU64 affected = psDBAffectedRows(config->dbh);
+    psLogMsg("releasetool", PS_LOG_INFO, "Deleted %" PRIu64 " relStack rows", affected);
+
+
+    psFree(query);
+
+    return true;
+}
 
 static bool listrelstackMode(pxConfig *config)
@@ -1050,5 +1242,5 @@
 
     PXOPT_COPY_STR(config->args, where, "-surveyName",  "survey.surveyName", "LIKE");
-    PXOPT_COPY_S32(config->args, where, "-rel_id",      "relExp.rel_id", "==");
+    PXOPT_COPY_S32(config->args, where, "-rel_id",      "relStack.rel_id", "==");
     pxskycellAddWhere(config, where);
 
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetool.h
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetool.h	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetool.h	(revision 37403)
@@ -34,6 +34,9 @@
     RELEASETOOL_MODE_TOCALIBEXP,
     RELEASETOOL_MODE_LISTRELEXP,
+    RELEASETOOL_MODE_DELETERELEXP,
     RELEASETOOL_MODE_DEFINERELSTACK,
     RELEASETOOL_MODE_UPDATERELSTACK,
+    RELEASETOOL_MODE_SETRELSTACKCALIBRATEDFROMSKYCAL,
+    RELEASETOOL_MODE_DELETERELSTACK,
     RELEASETOOL_MODE_TOCALIBSTACK,
     RELEASETOOL_MODE_LISTRELSTACK,
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetoolConfig.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetoolConfig.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/releasetoolConfig.c	(revision 37403)
@@ -67,5 +67,5 @@
     psMetadataAddStr(definereleaseArgs, PS_LIST_TAIL, "-set_ubercal_file", 0,  "define ubercal file name", NULL);
 
-    // -uptdaterelease
+    // -updaterelease
     psMetadata *updatereleaseArgs = psMetadataAlloc();
 
@@ -183,4 +183,15 @@
     psMetadataAddBool(listrelexpArgs, PS_LIST_TAIL, "-simple",      0, "use the simple output format", false);
 
+    // -deleterelexp
+    psMetadata *deleterelexpArgs = psMetadataAlloc();
+    psMetadataAddS64(deleterelexpArgs, PS_LIST_TAIL,  "-relexp_id", 0,   "select by released exposure ID", 0);
+    psMetadataAddS64(deleterelexpArgs, PS_LIST_TAIL,  "-exp_id", 0,      "select by exposure ID", 0);
+    psMetadataAddStr(deleterelexpArgs,  PS_LIST_TAIL, "-exp_name", 0,    "select by exposure name", NULL);
+    psMetadataAddS32(deleterelexpArgs, PS_LIST_TAIL,  "-rel_id", 0,      "select by release ID", 0);
+    psMetadataAddS32(deleterelexpArgs, PS_LIST_TAIL,  "-cam_id", 0,      "select by cam run ID", 0);
+    psMetadataAddStr(deleterelexpArgs,  PS_LIST_TAIL, "-label", 0,       "select by camRun.label", NULL);
+    psMetadataAddStr(deleterelexpArgs,  PS_LIST_TAIL, "-release_name", 0, "select by release name (LIKE comparision)", NULL);
+
+
     // -definerelstack
     psMetadata *definerelstackArgs = psMetadataAlloc();
@@ -248,4 +259,38 @@
     psMetadataAddBool(listrelstackArgs, PS_LIST_TAIL, "-simple",      0, "use the simple output format", false);
 
+    // -updaterelstack
+    psMetadata *updaterelstackArgs = psMetadataAlloc();
+
+    psMetadata *calibraterelstackArgs = psMetadataAlloc();
+
+        // set the target release and collection of relStacks (one of these is required)
+    psMetadataAddStr(calibraterelstackArgs,  PS_LIST_TAIL, "-release_name", 0, "define release name", NULL);
+    psMetadataAddS32(calibraterelstackArgs, PS_LIST_TAIL,  "-rel_id", 0,      "define release ID", 0);
+
+        // select the processing
+    psMetadataAddStr(calibraterelstackArgs,  PS_LIST_TAIL, "-skycal_label",  0, "select by skycalRun.label", NULL);
+    psMetadataAddStr(calibraterelstackArgs,  PS_LIST_TAIL, "-skycal_data_group", 0,  "select by skycalRun.data_group", NULL);
+    psMetadataAddS64(calibraterelstackArgs, PS_LIST_TAIL,  "-skycal_id", 0,      "select by skycalRun.skycal_id", 0);
+
+    psMetadataAddStr(calibraterelstackArgs,  PS_LIST_TAIL, "-tess_id", 0,  "select by tess_id", NULL);
+    psMetadataAddStr(calibraterelstackArgs,  PS_LIST_TAIL, "-skycell_id", 0,  "select by skycell_id", NULL);
+    pxskycellAddArguments(calibraterelstackArgs);
+
+    psMetadataAddBool(calibraterelstackArgs, PS_LIST_TAIL, "-replace",   0, "replace any existing calibrations", false);
+    psMetadataAddU64(calibraterelstackArgs, PS_LIST_TAIL,  "-limit",   0, "limit result set to N items", 0);
+
+    // -deleterelstack
+    psMetadata *deleterelstackArgs = psMetadataAlloc();
+    psMetadataAddS64(deleterelstackArgs, PS_LIST_TAIL,  "-relstack_id", 0,   "select by released exposure ID", 0);
+    psMetadataAddS64(deleterelstackArgs, PS_LIST_TAIL,  "-stack_id", 0,   "select by stack ID", 0);
+//    psMetadataAddS64(deleterelstackArgs, PS_LIST_TAIL,  "-skycal_id", 0,   "select by skycal ID", 0);
+    psMetadataAddStr(deleterelstackArgs,  PS_LIST_TAIL, "-release_name", 0, "select by release name (LIKE comparision)", NULL);
+    psMetadataAddS32(deleterelstackArgs, PS_LIST_TAIL,  "-rel_id", 0,   "select by release ID", 0);
+
+    psMetadataAddStr(deleterelstackArgs,  PS_LIST_TAIL, "-label",  0,      "select by stackRun.label", NULL);
+//    psMetadataAddStr(deleterelstackArgs,  PS_LIST_TAIL, "-data_group", 0,  "select by stackRun.data_group", NULL);
+//    psMetadataAddStr(deleterelstackArgs,  PS_LIST_TAIL, "-skycal_label",  0, "select by skycalRun.label", NULL);
+//    psMetadataAddStr(deleterelstackArgs,  PS_LIST_TAIL, "-skycal_data_group", 0,  "select by skycalRun.data_group", NULL);
+
     // -summary
     psMetadata *summaryArgs = psMetadataAlloc();
@@ -348,7 +393,12 @@
     PXOPT_ADD_MODE("-tocalibexp",       "list relExps pending calibration",  RELEASETOOL_MODE_TOCALIBEXP,  tocalibexpArgs);
     PXOPT_ADD_MODE("-listrelexp",       "list released exposures",      RELEASETOOL_MODE_LISTRELEXP,    listrelexpArgs);
+    PXOPT_ADD_MODE("-deleterelexp",     "delete a released exposure",   RELEASETOOL_MODE_DELETERELEXP,  deleterelexpArgs);
 
     PXOPT_ADD_MODE("-definerelstack",     "define a released stack",    RELEASETOOL_MODE_DEFINERELSTACK,  definerelstackArgs);
     PXOPT_ADD_MODE("-listrelstack",       "list released stacks",      RELEASETOOL_MODE_LISTRELSTACK,    listrelstackArgs);
+    PXOPT_ADD_MODE("-updaterelstack",     "update parameters of released stacks",      RELEASETOOL_MODE_LISTRELSTACK,    updaterelstackArgs);
+    PXOPT_ADD_MODE("-setrelstackcalibratedfromskycal", "update parameters of using skycalResults",      RELEASETOOL_MODE_SETRELSTACKCALIBRATEDFROMSKYCAL,    calibraterelstackArgs);
+    PXOPT_ADD_MODE("-deleterelstack",     "update parameters of released stacks",      RELEASETOOL_MODE_DELETERELSTACK,  deleterelstackArgs);
+
     PXOPT_ADD_MODE("-summary",            "list stackSummaryes for released stacks", RELEASETOOL_MODE_SUMMARY,    summaryArgs);
 
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetool.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetool.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetool.c	(revision 37403)
@@ -23,4 +23,5 @@
 
 // Update
+static bool dropcomponentMode(pxConfig *config);
 static bool updaterunMode(pxConfig *config);
 static bool updatepollMode(pxConfig *config);
@@ -49,4 +50,5 @@
     MODECASE(REMOTETOOL_MODE_LISTRUN,       listrunMode);
     MODECASE(REMOTETOOL_MODE_LISTCOMPONENT, listcomponentMode);
+    MODECASE(REMOTETOOL_MODE_DROPCOMPONENT, dropcomponentMode);
     MODECASE(REMOTETOOL_MODE_UPDATERUN,     updaterunMode);
     MODECASE(REMOTETOOL_MODE_UPDATEPOLL,    updatepollMode);
@@ -94,5 +96,7 @@
 
   // Get a list of the things we can insert into a new component
+  // CZW: these labels no longer need to be linked to the table, as I've split stageRun and remoteRun into sub-queries.
   psString query = NULL;
+  psString whereOption = psStringCopy("");
   if (!strcmp(stage,"chip")) {
     query = pxDataGet("remotetool_definebyquery_chip.sql");
@@ -103,5 +107,5 @@
     
     if (label) {
-      psStringAppend(&query, " AND (chipRun.label = '%s')", label);
+      psStringAppend(&whereOption, "\n AND (label = '%s')", label);
     }
   }
@@ -114,5 +118,5 @@
     
     if (label) {
-      psStringAppend(&query, " AND (camRun.label = '%s')", label);
+      psStringAppend(&whereOption, "\n AND (label = '%s')", label);
     }
   }    
@@ -125,5 +129,7 @@
     
     if (label) {
-      psStringAppend(&query, " AND (warpRun.label = '%s')", label);
+      // Because warp has to check to see if something other than the state is set correctly, I have to use this wonky way to pass the label in.
+      //      psStringAppend(&query, " AND (warpRun.label = '%s')", label);
+      psStringAppend(&whereOption, "\n AND (label = '%s')", label);
     }
   }    
@@ -136,5 +142,5 @@
     
     if (label) {
-      psStringAppend(&query, " AND (stackRun.label = '%s')", label);
+      psStringAppend(&whereOption, "\n AND (label = '%s')", label);
     }
   }    
@@ -149,5 +155,5 @@
     psFree(limitString);
   }
-  if (!p_psDBRunQuery(config->dbh, query)) {
+  if (!p_psDBRunQueryF(config->dbh, query,whereOption,whereOption)) { // This needs to be here twice because we need to restrict on label twice.
     psError(PS_ERR_UNKNOWN, false, "database error");
     psFree(query);
@@ -310,9 +316,47 @@
 // Update
 
+static bool dropcomponentMode(pxConfig *config)
+{
+  // Assert that we have a unique component to operate on.
+  PXOPT_LOOKUP_S64(remote_id,config->args, "-remote_id",true, false);
+  psAssert(remote_id,"This must exist for this mode to be safe.");
+  PXOPT_LOOKUP_S64(stage_id, config->args, "-stage_id", true, false);
+  psAssert(stage_id,"This must exist for this mode to be safe.");
+
+  psString query = pxDataGet("remotetool_dropcomponent.sql");
+  if (!query) {
+    psError(PXTOOLS_ERR_SYS, false, "Failed to retreive SQL statement");
+    return false;
+  }
+  
+  if (!psDBTransaction(config->dbh)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    return false;
+  }
+
+  if (!p_psDBRunQueryF(config->dbh, query, remote_id, stage_id)) {
+    psError(PS_ERR_UNKNOWN, false, "Database error");
+    psFree(query);
+    return false;
+  }
+  psFree(query);
+  
+  
+
+  // 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);
-  // PXOPT_LOOKUP_S64(remote_id,  config->args, "-remote_id",    true, false);
-  
+  PXOPT_LOOKUP_S64(remote_id,  config->args, "-remote_id",    true, false);
+  psAssert(remote_id,"This should have failed before this point.");
+
   psMetadata *where = psMetadataAlloc();
   psMetadata *values = psMetadataAlloc();
@@ -341,6 +385,7 @@
 {
   PS_ASSERT_PTR_NON_NULL(config, false);
-  // PXOPT_LOOKUP_S64(remote_id,  config->args, "-remote_id",    true, false);
-  
+  PXOPT_LOOKUP_S64(remote_id,  config->args, "-remote_id",    true, false);
+  psAssert(remote_id,"This should have failed before this point.");
+
   psMetadata *where = psMetadataAlloc();
   // Wheres
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetool.h
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetool.h	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetool.h	(revision 37403)
@@ -13,4 +13,5 @@
   REMOTETOOL_MODE_LISTRUN,
   REMOTETOOL_MODE_LISTCOMPONENT,
+  REMOTETOOL_MODE_DROPCOMPONENT,
   REMOTETOOL_MODE_UPDATERUN,
   REMOTETOOL_MODE_UPDATEPOLL,
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetoolConfig.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetoolConfig.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/remotetoolConfig.c	(revision 37403)
@@ -64,4 +64,10 @@
   ADD_OPT(S16, listcomponentArgs, "-limit",              "limit to number of runs to display", 0);
   ADD_OPT(Bool, listcomponentArgs, "-simple",            "simple print format", false);
+
+  // -dropcomponent
+  psMetadata *dropcomponentArgs = psMetadataAlloc();
+  ADD_OPT(S64, dropcomponentArgs, "-remote_id",         "run to update", 0);
+  ADD_OPT(S64, dropcomponentArgs, "-stage_id",          "stage_id to remote", 0);
+  
   // -updaterun
   psMetadata *updaterunArgs = psMetadataAlloc();
@@ -95,4 +101,5 @@
   PXOPT_ADD_MODE("-listrun",           "", REMOTETOOL_MODE_LISTRUN,        listrunArgs);
   PXOPT_ADD_MODE("-listcomponent",     "", REMOTETOOL_MODE_LISTCOMPONENT,  listcomponentArgs);
+  PXOPT_ADD_MODE("-dropcomponent",     "", REMOTETOOL_MODE_DROPCOMPONENT,  dropcomponentArgs);
   PXOPT_ADD_MODE("-updaterun",         "", REMOTETOOL_MODE_UPDATERUN,      updaterunArgs);
   PXOPT_ADD_MODE("-updatepoll",        "", REMOTETOOL_MODE_UPDATEPOLL,     updatepollArgs);
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktool.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktool.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktool.c	(revision 37403)
@@ -41,4 +41,5 @@
 static bool sumskyfileMode(pxConfig *config);
 static bool sassskyfileMode(pxConfig *config);
+static bool updatesassMode(pxConfig *config);
 static bool revertsumskyfileMode(pxConfig *config);
 static bool tosummaryMode(pxConfig *config);
@@ -82,5 +83,6 @@
         MODECASE(STACKTOOL_MODE_ADDSUMSKYFILE,         addsumskyfileMode);
         MODECASE(STACKTOOL_MODE_SUMSKYFILE,            sumskyfileMode);
-        MODECASE(STACKTOOL_MODE_SASSSKYFILE,            sassskyfileMode);
+        MODECASE(STACKTOOL_MODE_SASSSKYFILE,           sassskyfileMode);
+	MODECASE(STACKTOOL_MODE_UPDATESASS,            updatesassMode);
         MODECASE(STACKTOOL_MODE_REVERTSUMSKYFILE,      revertsumskyfileMode);
         MODECASE(STACKTOOL_MODE_TOSUMMARY,             tosummaryMode);
@@ -260,4 +262,6 @@
     // these are used to build the HAVING restriction
     PXOPT_COPY_S32(config->args, having, "-min_num", "num_warp", ">=");
+    PXOPT_COPY_S32(config->args, having, "-max_num", "num_warp", "<=");
+    
     PXOPT_LOOKUP_S32(min_num,     config->args, "-min_num",  false, false);
     if (min_num < 2) {
@@ -754,6 +758,12 @@
     PXOPT_COPY_STR(config->args, where, "-data_group", "stackRun.data_group", "==");
     PXOPT_COPY_STR(config->args, where, "-state",     "stackRun.state",     "==");
-    PXOPT_COPY_S64(config->args, where, "-sass_id",   "stackAssociationMap.sass_id",  "==");
+
     PXOPT_LOOKUP_S16(fault, config->args, "-fault", false, false);
+    PXOPT_LOOKUP_S64(sass_id, config->args, "-sass_id", false, false);
+
+    if (sass_id) {
+      PXOPT_COPY_S64(config->args, where, "-sass_id",   "stackAssociationMap.sass_id",  "==");
+    }
+    
     if (!psListLength(where->list)) {
         psFree(where);
@@ -769,5 +779,8 @@
         PXOPT_COPY_S16(config->args, where, "-fault", "stackSumSkyfile.fault", "==");
     }
-
+    if (sass_id) {
+      psStringAppend(&query, " JOIN stackAssociationMap USING(stack_id)");
+    }
+    
     // pxUpdateRun gets parameters from config->args and updates
     bool result = pxUpdateRun(config, where, &query, "stackRun", "stack_id", "stackSumSkyfile", true, false);
@@ -1293,9 +1306,4 @@
     PXOPT_COPY_STR(config->args, where, "-data_group", "stackAssociation.data_group", "LIKE");
 
-//  The following three selectors are incompatible with the sql so omit them
-//    PXOPT_COPY_S64(config->args, where, "-warp_id", "warpRun.warp_id", "==");
-//     PXOPT_COPY_S64(config->args, where, "-exp_id", "rawExp.exp_id", "==");
-//    PXOPT_COPY_STR(config->args, where, "-exp_name", "rawExp.exp_name", "==");
-
     PXOPT_LOOKUP_BOOL(all, config->args, "-all", false);
 
@@ -1367,4 +1375,49 @@
 }
 
+static bool updatesassMode(pxConfig *config)
+{
+  PS_ASSERT_PTR_NON_NULL(config, false);
+
+  psMetadata *where = psMetadataAlloc();
+  PXOPT_COPY_S64(config->args, where, "-sass_id", "sass_id", "==");
+  PXOPT_COPY_STR(config->args, where, "-data_group", "data_group", "==");
+  PXOPT_COPY_STR(config->args, where, "-projection_cell", "projection_cell", "==");
+  PXOPT_COPY_STR(config->args, where, "-tess_id", "tess_id", "==");
+  PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
+  if (!psListLength(where->list)) {
+    psFree(where);
+    psError(PXTOOLS_ERR_CONFIG, false, "search parameters are required");
+    return false;
+  }
+
+  psMetadata *values = psMetadataAlloc();
+  PXOPT_COPY_STR(config->args, values, "-set_data_group", "data_group", "==");
+  if (!psListLength(values->list)) {
+    psFree(values);
+    psError(PXTOOLS_ERR_CONFIG, false, "data_group to assign not found");
+    return false;
+  }
+
+  if (!psDBTransaction(config->dbh)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    return false;
+  }
+  
+  long rows = psDBUpdateRows(config->dbh, "stackAssociation", where, values);
+  psFree(values);
+  psFree(where);
+
+  if (rows != 1) {
+    psError(PS_ERR_UNKNOWN, false, "should have updated only one row. updated %ld", rows);
+    return false;
+  }
+
+  if (!psDBCommit(config->dbh)) {
+    psError(PS_ERR_UNKNOWN, false, "database error");
+    return false;
+  }
+
+  return true;
+}
 
 static bool revertsumskyfileMode(pxConfig *config)
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktool.h
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktool.h	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktool.h	(revision 37403)
@@ -35,4 +35,5 @@
     STACKTOOL_MODE_SUMSKYFILE,
     STACKTOOL_MODE_SASSSKYFILE,
+    STACKTOOL_MODE_UPDATESASS,
     STACKTOOL_MODE_REVERTSUMSKYFILE,
     STACKTOOL_MODE_TOSUMMARY,
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktoolConfig.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktoolConfig.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/stacktoolConfig.c	(revision 37403)
@@ -98,4 +98,5 @@
     psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-random", 0, "use this number of random elements", 0);
     psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-min_num", 0, "minimum number of inputs", 0);
+    psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-max_num", 0, "maximum number of inputs", 0);
     psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-min_new", 0, "minimum number of new inputs", 0);
     psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-min_frac", 0, "minumum fraction of new inputs", NAN);
@@ -237,4 +238,14 @@
     psMetadataAddBool(sassskyfileArgs, PS_LIST_TAIL, "-all",  0,            "enable search without arguments", false);
 
+    // -updatesass
+    psMetadata *updatesassArgs = psMetadataAlloc();
+    psMetadataAddS64(updatesassArgs, PS_LIST_TAIL, "-sass_id", 0,           "search by stack association id", 0);
+    psMetadataAddStr(updatesassArgs, PS_LIST_TAIL, "-data_group", 0,        "search by data group", 0);
+    psMetadataAddStr(updatesassArgs, PS_LIST_TAIL, "-projection_cell", 0,   "search by projection cell", 0);
+    psMetadataAddStr(updatesassArgs, PS_LIST_TAIL, "-tess_id", 0,           "search by tess_id", 0);
+    psMetadataAddStr(updatesassArgs, PS_LIST_TAIL, "-filter", 0,            "search by filter", 0);
+
+    psMetadataAddStr(updatesassArgs, PS_LIST_TAIL, "-set_data_group", 0,    "data_group to assign", 0);
+
     // -revertsumskyfile
     psMetadata *revertsumskyfileArgs= psMetadataAlloc();
@@ -347,5 +358,6 @@
     PXOPT_ADD_MODE("-donecleanup",           "show runs that have been cleaned",     STACKTOOL_MODE_DONECLEANUP,          donecleanupArgs);
 
-    PXOPT_ADD_MODE("-sassskyfile",      "list results of stackAssociation", STACKTOOL_MODE_SASSSKYFILE,      sassskyfileArgs);
+    PXOPT_ADD_MODE("-sassskyfile",          "list results of stackAssociation", STACKTOOL_MODE_SASSSKYFILE,      sassskyfileArgs);
+    PXOPT_ADD_MODE("-updatesass",           "update data_group of stackAssociation", STACKTOOL_MODE_UPDATESASS,  updatesassArgs);
     PXOPT_ADD_MODE("-tosummary",            "show runs that can be summarized", STACKTOOL_MODE_TOSUMMARY, tosummaryArgs);
     PXOPT_ADD_MODE("-summary",              "show runs that have been summarized", STACKTOOL_MODE_SUMMARY, summaryArgs);
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/staticskytool.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/staticskytool.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/staticskytool.c	(revision 37403)
@@ -1057,4 +1057,5 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
 
     psString query = pxDataGet("staticskytool_defineskycalrun.sql");
@@ -1084,4 +1085,9 @@
     }
 
+    if (limit) {
+        psString limitString = psDBGenerateLimitSQL(limit);
+        psStringAppend(&query, "\n%s", limitString);
+        psFree(limitString);
+    }
 
     if (!p_psDBRunQueryF(config->dbh, query, labelHook)) {
@@ -1171,4 +1177,5 @@
     PXOPT_COPY_S64(config->args, where, "-sky_id",   "sky_id",   "==");
     PXOPT_COPY_S64(config->args, where, "-stack_id", "stack_id",   "==");
+    PXOPT_COPY_STR(config->args, where, "-skycell_id",  "stackRun.skycell_id",    "==");
     PXOPT_COPY_STR(config->args, where, "-label",   "skycalRun.label",    "==");
     PXOPT_COPY_STR(config->args, where, "-state",   "skycalRun.state",    "==");
Index: branches/eam_branches/ps2-tc3-20130727/ippTools/src/staticskytoolConfig.c
===================================================================
--- branches/eam_branches/ps2-tc3-20130727/ippTools/src/staticskytoolConfig.c	(revision 36680)
+++ branches/eam_branches/ps2-tc3-20130727/ippTools/src/staticskytoolConfig.c	(revision 37403)
@@ -181,4 +181,5 @@
     psMetadataAddBool(defineskycalrunArgs, PS_LIST_TAIL, "-check_inputs",  0, "list inputs, do not modify database", false);
     psMetadataAddBool(defineskycalrunArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
+    psMetadataAddU64(defineskycalrunArgs, PS_LIST_TAIL, "-limit", 0, "limit result set to N items", 0);
 
     // -updateskycalrun
@@ -188,4 +189,5 @@
     psMetadataAddS64(updateskycalrunArgs, PS_LIST_TAIL, "-stack_id", 0,  "search by stack ID", 0);
     psMetadataAddStr(updateskycalrunArgs, PS_LIST_TAIL, "-state", 0, "search by state", NULL);
+    psMetadataAddStr(updateskycalrunArgs, PS_LIST_TAIL, "-skycell_id", 0, "search by skycell_id", 0);
     psMetadataAddStr(updateskycalrunArgs, PS_LIST_TAIL, "-label", 0, "search by label", 0);
     pxskycellAddArguments(updateskycalrunArgs);
