Index: /trunk/ippTools/share/warptool_finished_run_select.sql
===================================================================
--- /trunk/ippTools/share/warptool_finished_run_select.sql	(revision 24042)
+++ /trunk/ippTools/share/warptool_finished_run_select.sql	(revision 24043)
@@ -5,4 +5,5 @@
    (SELECT DISTINCT
        warpRun.warp_id,
+       warpRun.label as label,
        warpSkyCellMap.warp_id as foo,
        warpSkyfile.warp_id as bar,
Index: /trunk/ippTools/src/warptool.c
===================================================================
--- /trunk/ippTools/src/warptool.c	(revision 24042)
+++ /trunk/ippTools/src/warptool.c	(revision 24043)
@@ -41,4 +41,5 @@
 static bool towarpedMode(pxConfig *config);
 static bool addwarpedMode(pxConfig *config);
+static bool advancerunMode(pxConfig *config);
 static bool warpedMode(pxConfig *config);
 static bool revertwarpedMode(pxConfig *config);
@@ -88,4 +89,5 @@
         MODECASE(WARPTOOL_MODE_TOWARPED,           towarpedMode);
         MODECASE(WARPTOOL_MODE_ADDWARPED,          addwarpedMode);
+        MODECASE(WARPTOOL_MODE_ADVANCERUN,         advancerunMode);
         MODECASE(WARPTOOL_MODE_WARPED,             warpedMode);
         MODECASE(WARPTOOL_MODE_REVERTWARPED,       revertwarpedMode);
@@ -976,4 +978,86 @@
 }
 
+static bool advancerunMode(pxConfig *config)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-warp_id", "warp_id", "==");
+    pxAddLabelSearchArgs (config, where, "-label", "label", "==");
+
+    PXOPT_LOOKUP_U64(limit, config->args, "-limit", false, false);
+
+    psString query = pxDataGet("warptool_finished_run_select.sql");
+    if (!query) {
+        psError(PXTOOLS_ERR_DATA, false, "failed to retrieve SQL statement");
+        return false;
+    }
+
+    if (psListLength(where->list)) {
+        psString whereClause = psDBGenerateWhereSQL(where, "warpRun");
+        psStringAppend(&query, " %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(where);
+
+    if (!p_psDBRunQuery(config->dbh, query)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(query);
+        return false;
+    }
+    psFree(query);
+
+    psArray *output = p_psDBFetchResult(config->dbh);
+    if (!output) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+    if (!psArrayLength(output)) {
+        psTrace("warptool", PS_LOG_INFO, "no rows found");
+        psFree(output);
+        return true;
+    }
+
+    query = pxDataGet("warptool_finish_run.sql");
+    for (long i = 0; i < psArrayLength(output); i++) {
+        psMetadata *row = output->data[i];
+
+        bool status;
+        psS64 warp_id = psMetadataLookupS64(&status, row, "warp_id");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to look up value for warp_id");
+            psFree(output);
+            psFree(query);
+            return false;
+        }
+        psS32 magicked = psMetadataLookupS64(&status, row, "magicked");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to look up value for magicked");
+            psFree(output);
+            psFree(query);
+            return false;
+        }
+        if (!p_psDBRunQueryF(config->dbh, query, magicked, warp_id)) {
+            psError(PS_ERR_UNKNOWN, false, "database error");
+            psFree(output);
+            psFree(query);
+            return false;
+        }
+
+        psS64 numUpdated = psDBAffectedRows(config->dbh);
+
+        if (numUpdated != 1) {
+            psError(PS_ERR_UNKNOWN, false, "should have affected 1 row");
+            psFree(query);
+            psFree(output);
+            return false;
+        }
+    }
+    psFree(output);
+    psFree(query);
+
+    return true;
+}
+
 bool warpCompletedRuns(pxConfig *config)
 {
Index: /trunk/ippTools/src/warptool.h
===================================================================
--- /trunk/ippTools/src/warptool.h	(revision 24042)
+++ /trunk/ippTools/src/warptool.h	(revision 24043)
@@ -37,4 +37,5 @@
     WARPTOOL_MODE_TOWARPED,
     WARPTOOL_MODE_ADDWARPED,
+    WARPTOOL_MODE_ADVANCERUN,
     WARPTOOL_MODE_WARPED,
     WARPTOOL_MODE_REVERTWARPED,
Index: /trunk/ippTools/src/warptoolConfig.c
===================================================================
--- /trunk/ippTools/src/warptoolConfig.c	(revision 24042)
+++ /trunk/ippTools/src/warptoolConfig.c	(revision 24043)
@@ -219,4 +219,10 @@
     psMetadataAddBool(revertwarpedArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
 
+    // -advancerun
+    psMetadata *advancerunArgs = psMetadataAlloc();
+    psMetadataAddS64(advancerunArgs, PS_LIST_TAIL, "-warp_id", 0,      "search by warp ID", 0);
+    psMetadataAddStr(advancerunArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "search by label ", NULL);
+    psMetadataAddU64(advancerunArgs, PS_LIST_TAIL, "-limit",  0,       "limit exposures to advance to N items", 0);
+
     // -block
     psMetadata *blockArgs = psMetadataAlloc();
@@ -297,4 +303,5 @@
     PXOPT_ADD_MODE("-towarped",        "", WARPTOOL_MODE_TOWARPED,       towarpedArgs);
     PXOPT_ADD_MODE("-addwarped",       "", WARPTOOL_MODE_ADDWARPED,      addwarpedArgs);
+    PXOPT_ADD_MODE("-advancerun",      "", WARPTOOL_MODE_ADVANCERUN,     advancerunArgs);
     PXOPT_ADD_MODE("-warped",          "", WARPTOOL_MODE_WARPED,         warpedArgs);
     PXOPT_ADD_MODE("-revertwarped",    "", WARPTOOL_MODE_REVERTWARPED,   revertwarpedArgs);
