Index: trunk/ippTools/src/dettool.c
===================================================================
--- trunk/ippTools/src/dettool.c	(revision 8464)
+++ trunk/ippTools/src/dettool.c	(revision 8481)
@@ -3311,4 +3311,171 @@
 static bool updateresidexpMode(pxConfig *config)
 {
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // build a query to search by det_id, iteration, exp_id
+    psMetadata *where = psMetadataAlloc();
+    bool status = false;
+    psString det_id = psMetadataLookupStr(&status, config->args, "-det_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -det_id");
+        psFree(where);
+        return false;
+    }
+    if (det_id) {
+        if (!psMetadataAddStr(where, PS_LIST_TAIL, "det_id", 0, "==", det_id)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item det_id");
+            psFree(where);
+            return false;
+        }
+    }
+    psS32 iteration = psMetadataLookupS32(&status, config->args, "-iteration");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -iteration");
+        psFree(where);
+        return false;
+    }
+    // always where iteration
+    if (!psMetadataAddS32(where, PS_LIST_TAIL, "iteration", 0, "==", iteration)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item iteration");
+        psFree(where);
+        return false;
+    }
+    psString exp_id = psMetadataLookupStr(&status, config->args, "-exp_id");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -exp_id");
+        psFree(where);
+        return false;
+    }
+    if (exp_id) {
+        if (!psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==", exp_id)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
+            psFree(where);
+            return false;
+        }
+    }
+
+    // find the values we're going to set
+    // copy everything but det_id, iteration, & exp_id from the args and
+    // remove the '-' prefix
+    psMetadata *set = psMetadataAlloc();
+    psString recipe = psMetadataLookupStr(&status, config->args, "-recip");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -recip");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+    if (recipe) {
+        if (!psMetadataAddStr(set, PS_LIST_TAIL, "recipe", 0, "==", recipe)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
+            psFree(set);
+            psFree(where);
+            return false;
+        }
+    }
+
+    psF64 bg = psMetadataLookupF64(&status, config->args, "-bg");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+    if (!isnan(bg)) {
+        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg", 0, "==", bg)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
+            psFree(set);
+            psFree(where);
+            return false;
+        }
+    }
+
+    psF64 bg_stdev = psMetadataLookupF64(&status, config->args, "-bg_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_stdev");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+    if (!isnan(bg_stdev)) {
+        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg_stdev", 0, "==", bg_stdev)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");
+            psFree(set);
+            psFree(where);
+            return false;
+        }
+    }
+
+    psF64 bg_mean_stdev = psMetadataLookupF64(&status, config->args, "-bg_mean_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -bg_mean_stdev");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+    if (!isnan(bg_mean_stdev)) {
+        if (!psMetadataAddF64(set, PS_LIST_TAIL, "bg_mean_stdev", 0, "==", bg_mean_stdev)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
+            psFree(set);
+            psFree(where);
+            return false;
+        }
+    }
+
+    psString b1_uri = psMetadataLookupStr(&status, config->args, "-b1_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -b1_uri");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+    if (b1_uri) {
+        if (!psMetadataAddStr(set, PS_LIST_TAIL, "b1_uri", 0, "==", b1_uri)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item b1_uri");
+            psFree(set);
+            psFree(where);
+            return false;
+        }
+    }
+
+    psString b2_uri = psMetadataLookupStr(&status, config->args, "-b2_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -b2_uri");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+    if (b2_uri) {
+        if (!psMetadataAddStr(set, PS_LIST_TAIL, "b2_uri", 0, "==", b2_uri)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item b2_uri");
+            psFree(set);
+            psFree(where);
+            return false;
+        }
+    }
+
+    bool reject = psMetadataLookupBool(&status, config->args, "-reject");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -reject");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+    if (!psMetadataAddBool(set, PS_LIST_TAIL, "accept", 0, "==", !reject)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item accept");
+        psFree(set);
+        psFree(where);
+        return false;
+    }
+
+    long changed = psDBUpdateRows(config->dbh, "detResidExp", where, set);
+    psFree(set);
+    psFree(where);
+
+    if (changed < 0) {
+        psError(PS_ERR_UNKNOWN, false, "no rows were updated");
+        return false;
+    }
+
     return true;
 }
