Index: trunk/ippTools/configure.ac
===================================================================
--- trunk/ippTools/configure.ac	(revision 25823)
+++ trunk/ippTools/configure.ac	(revision 25835)
@@ -18,5 +18,5 @@
 PKG_CHECK_MODULES([PSLIB], [pslib >= 1.1.0])
 PKG_CHECK_MODULES([PSMODULES], [psmodules >= 1.1.0])
-PKG_CHECK_MODULES([IPPDB], [ippdb >= 1.1.55]) 
+PKG_CHECK_MODULES([IPPDB], [ippdb >= 1.1.56]) 
 
 PXTOOLS_CFLAGS="${PSLIB_CFLAGS=} ${PSMODULES_CFLAGS=} ${IPPDB_CFLAGS=}"
Index: trunk/ippTools/share/addtool_queue_cam_id.sql
===================================================================
--- trunk/ippTools/share/addtool_queue_cam_id.sql	(revision 25823)
+++ trunk/ippTools/share/addtool_queue_cam_id.sql	(revision 25835)
@@ -8,5 +8,7 @@
         '%s',           -- reduction
         '%s',           -- label
+        '%s',           -- data_group
         '%s',           -- dvodb 
+        '%s',           -- note
 	%d		-- image_only
     FROM camRun
Index: trunk/ippTools/share/camtool_queue_chip_id.sql
===================================================================
--- trunk/ippTools/share/camtool_queue_chip_id.sql	(revision 25823)
+++ trunk/ippTools/share/camtool_queue_chip_id.sql	(revision 25835)
@@ -9,4 +9,6 @@
         '%s',           -- workdir_state
         '%s',           -- label
+        '%s',           -- data_group
+        '%s',           -- dist_group
         '%s',           -- reduction
         '%s',           -- expgroup
@@ -14,5 +16,6 @@
         '%s',           -- tess_id
         '%s',           -- end_stage
-        0               -- magicked
+        0,              -- magicked
+        '%s'           -- note
     FROM chipRun
     WHERE
Index: trunk/ippTools/share/chiptool_completely_processed_exp.sql
===================================================================
--- trunk/ippTools/share/chiptool_completely_processed_exp.sql	(revision 25823)
+++ trunk/ippTools/share/chiptool_completely_processed_exp.sql	(revision 25835)
@@ -7,4 +7,6 @@
     workdir_state,
     label,
+    data_group,
+    dist_group,
     reduction,
     expgroup,
@@ -12,5 +14,6 @@
     tess_id,
     end_stage,
-    all_files_magicked as magicked
+    all_files_magicked as magicked,
+    note
 FROM
     (SELECT
Index: trunk/ippTools/share/disttool_definebyquery_camera.sql
===================================================================
--- trunk/ippTools/share/disttool_definebyquery_camera.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_definebyquery_camera.sql	(revision 25835)
@@ -4,5 +4,6 @@
     rawExp.exp_name as run_tag,
     camRun.magicked,
-    distTarget.label,
+    camRun.label,
+    distTarget.dist_group,
     distTarget.target_id,
     distTarget.clean
@@ -12,5 +13,5 @@
 JOIN distTarget ON distTarget.stage = 'camera'
     AND rawExp.filter = distTarget.filter
-    AND camRun.label  = distTarget.label
+    AND camRun.dist_group  = distTarget.dist_group
 JOIN rcInterest USING(target_id)
 LEFT JOIN distRun ON distRun.stage = 'camera' 
Index: trunk/ippTools/share/disttool_definebyquery_chip.sql
===================================================================
--- trunk/ippTools/share/disttool_definebyquery_chip.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_definebyquery_chip.sql	(revision 25835)
@@ -5,4 +5,5 @@
     rawExp.exp_name as run_tag,
     chipRun.label,
+    chipRun.dist_group,
     distTarget.target_id,
     distTarget.clean
@@ -10,5 +11,5 @@
 JOIN rawExp USING(exp_id)
 JOIN distTarget ON distTarget.stage = 'chip'
-    AND chipRun.label = distTarget.label 
+    AND chipRun.dist_group = distTarget.dist_group 
     AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
Index: trunk/ippTools/share/disttool_definebyquery_diff.sql
===================================================================
--- trunk/ippTools/share/disttool_definebyquery_diff.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_definebyquery_diff.sql	(revision 25835)
@@ -4,5 +4,6 @@
     diffRun.magicked,
     rawExp.exp_name as run_tag,
-    distTarget.label,
+    diffRun.label,
+    distTarget.dist_group,
     distTarget.target_id,
     distTarget.clean
@@ -15,5 +16,5 @@
 JOIN rawExp USING(exp_id)
 JOIN distTarget ON distTarget.stage = 'diff'
-    AND diffRun.label = distTarget.label
+    AND diffRun.dist_group = distTarget.dist_group
     AND distTarget.filter = rawExp.filter
 JOIN rcInterest USING(target_id)
Index: trunk/ippTools/share/disttool_definebyquery_fake.sql
===================================================================
--- trunk/ippTools/share/disttool_definebyquery_fake.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_definebyquery_fake.sql	(revision 25835)
@@ -4,5 +4,6 @@
     CAST(0 AS SIGNED) AS magicked,
     rawExp.exp_name as run_tag,
-    distTarget.label,
+    fakeRun.label,
+    distTarget.dist_group,
     distTarget.target_id,
     distTarget.clean
@@ -11,5 +12,5 @@
 JOIN chipRun USING(chip_id)
 JOIN rawExp USING(exp_id)
-JOIN distTarget ON distTarget.stage = 'fake' AND fakeRun.label = distTarget.label
+JOIN distTarget ON distTarget.stage = 'fake' AND fakeRun.dist_group = distTarget.dist_group
     AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
Index: trunk/ippTools/share/disttool_definebyquery_raw.sql
===================================================================
--- trunk/ippTools/share/disttool_definebyquery_raw.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_definebyquery_raw.sql	(revision 25835)
@@ -4,10 +4,11 @@
     rawExp.exp_name AS run_tag,
     rawExp.magicked,
-    distTarget.label,
+    chipRun.label,
+    distTarget.dist_group,
     distTarget.target_id,
     distTarget.clean
 FROM rawExp
 JOIN chipRun USING(exp_id)
-JOIN distTarget ON distTarget.label = chipRun.label AND distTarget.stage = 'raw'
+JOIN distTarget ON distTarget.dist_group = chipRun.dist_group AND distTarget.stage = 'raw'
     AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
Index: trunk/ippTools/share/disttool_definebyquery_stack.sql
===================================================================
--- trunk/ippTools/share/disttool_definebyquery_stack.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_definebyquery_stack.sql	(revision 25835)
@@ -5,5 +5,6 @@
     -- run tag in the form 'stack.$skycell_id.$stack_id'
     CONCAT_WS('.', 'stack', stackRun.skycell_id, convert(stackRun.stack_id, CHAR)) as run_tag,
-    distTarget.label,
+    stackRun.label,
+    distTarget.dist_group,
     distTarget.target_id,
     distTarget.clean
@@ -11,5 +12,5 @@
 JOIN stackSumSkyfile USING(stack_id)
 JOIN distTarget ON distTarget.stage = 'stack'
-    AND stackRun.label = distTarget.label
+    AND stackRun.dist_group = distTarget.dist_group
     AND stackRun.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
Index: trunk/ippTools/share/disttool_definebyquery_warp.sql
===================================================================
--- trunk/ippTools/share/disttool_definebyquery_warp.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_definebyquery_warp.sql	(revision 25835)
@@ -4,5 +4,6 @@
     warpRun.magicked,
     rawExp.exp_name as run_tag,
-    distTarget.label,
+    warpRun.label,
+    distTarget.dist_group,
     distTarget.target_id,
     distTarget.clean
@@ -13,5 +14,5 @@
 JOIN rawExp USING(exp_id)
 JOIN distTarget ON distTarget.stage = 'warp' 
-    AND warpRun.label = distTarget.label
+    AND warpRun.dist_group = distTarget.dist_group
     AND rawExp.filter = distTarget.filter
 JOIN rcInterest USING(target_id)
Index: trunk/ippTools/share/disttool_defineinterest.sql
===================================================================
--- trunk/ippTools/share/disttool_defineinterest.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_defineinterest.sql	(revision 25835)
@@ -1,4 +1,4 @@
 INSERT INTO rcInterest
-    SELECT 0, dest_id, target_id, '@STATE@'
+    SELECT 0, rcDestination.dest_id, distTarget.target_id, '@STATE@'
     FROM distTarget
         JOIN rcDestination
Index: trunk/ippTools/share/disttool_pending_camera.sql
===================================================================
--- trunk/ippTools/share/disttool_pending_camera.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pending_camera.sql	(revision 25835)
@@ -2,4 +2,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -16,4 +17,5 @@
     chipRun.magicked
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN camRun ON camRun.cam_id = distRun.stage_id
 JOIN camProcessedExp USING(cam_id)
Index: trunk/ippTools/share/disttool_pending_chip.sql
===================================================================
--- trunk/ippTools/share/disttool_pending_chip.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pending_chip.sql	(revision 25835)
@@ -2,4 +2,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -16,4 +17,5 @@
     chipProcessedImfile.magicked
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN chipRun ON chipRun.chip_id = distRun.stage_id
 JOIN rawExp using(exp_id)
Index: trunk/ippTools/share/disttool_pending_diff.sql
===================================================================
--- trunk/ippTools/share/disttool_pending_diff.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pending_diff.sql	(revision 25835)
@@ -2,4 +2,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -18,4 +19,5 @@
     diffSkyfile.magicked
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN diffRun ON stage_id = diff_id
 JOIN diffSkyfile using(diff_id)
Index: trunk/ippTools/share/disttool_pending_fake.sql
===================================================================
--- trunk/ippTools/share/disttool_pending_fake.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pending_fake.sql	(revision 25835)
@@ -2,4 +2,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -16,4 +17,5 @@
     0
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN fakeRun ON fakeRun.fake_id = distRun.stage_id
 JOIN fakeProcessedImfile USING(fake_id)
Index: trunk/ippTools/share/disttool_pending_raw.sql
===================================================================
--- trunk/ippTools/share/disttool_pending_raw.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pending_raw.sql	(revision 25835)
@@ -2,4 +2,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -16,4 +17,5 @@
     rawImfile.magicked
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN rawExp ON rawExp.exp_id = stage_id
 JOIN rawImfile USING(exp_id)
@@ -35,4 +37,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -49,4 +52,5 @@
     rawExp.magicked
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN rawExp ON exp_id = stage_id
 LEFT JOIN distComponent 
Index: trunk/ippTools/share/disttool_pending_stack.sql
===================================================================
--- trunk/ippTools/share/disttool_pending_stack.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pending_stack.sql	(revision 25835)
@@ -2,4 +2,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -18,4 +19,5 @@
     0 AS magicked
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN stackRun
     ON stage_id = stack_id
Index: trunk/ippTools/share/disttool_pending_warp.sql
===================================================================
--- trunk/ippTools/share/disttool_pending_warp.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pending_warp.sql	(revision 25835)
@@ -2,4 +2,5 @@
     distRun.dist_id,
     distRun.label,
+    distTarget.dist_group,
     stage,
     stage_id,
@@ -16,4 +17,5 @@
     warpSkyfile.magicked
 FROM distRun
+JOIN distTarget USING(target_id, stage)
 JOIN warpRun ON stage_id = warp_id
 JOIN warpSkyfile using(warp_id)
Index: trunk/ippTools/share/disttool_pendingfileset.sql
===================================================================
--- trunk/ippTools/share/disttool_pendingfileset.sql	(revision 25823)
+++ trunk/ippTools/share/disttool_pendingfileset.sql	(revision 25835)
@@ -4,5 +4,5 @@
     distRun.stage,
     stage_id,
-    distTarget.label,
+    distTarget.dist_group,
     distTarget.filter,
     CONCAT_WS('.', distRun.outroot, CONVERT(distRun.dist_id, CHAR)) as dist_dir,
Index: trunk/ippTools/share/faketool_completely_processed_exp.sql
===================================================================
--- trunk/ippTools/share/faketool_completely_processed_exp.sql	(revision 25823)
+++ trunk/ippTools/share/faketool_completely_processed_exp.sql	(revision 25835)
@@ -6,4 +6,6 @@
     workdir,
     label,
+    data_group,
+    dist_group,
     reduction,
     expgroup,
@@ -11,5 +13,6 @@
     tess_id,
     end_stage,
-    epoch
+    epoch,
+    note
 FROM
     (SELECT
Index: trunk/ippTools/share/faketool_queue_cam_id.sql
===================================================================
--- trunk/ippTools/share/faketool_queue_cam_id.sql	(revision 25823)
+++ trunk/ippTools/share/faketool_queue_cam_id.sql	(revision 25835)
@@ -6,4 +6,6 @@
         '%s',           -- workdir
         '%s',           -- label
+        '%s',           -- data_group
+        '%s',           -- dist_group
         '%s',           -- reduction
         '%s',           -- expgroup
@@ -11,5 +13,6 @@
         '%s',           -- tess_id
         '%s',           -- end_stage
-        NULL            -- epoch
+        NULL,           -- epoch
+        '%s'            -- note
     FROM camRun
     WHERE
Index: trunk/ippTools/share/pxadmin_create_tables.sql
===================================================================
--- trunk/ippTools/share/pxadmin_create_tables.sql	(revision 25823)
+++ trunk/ippTools/share/pxadmin_create_tables.sql	(revision 25835)
@@ -261,10 +261,13 @@
     workdir_state VARCHAR(64),
     label VARCHAR(64),
+    data_group VARCHAR(64),
+    dist_group VARCHAR(64),
     reduction VARCHAR(64),
-     expgroup VARCHAR(64),
+    expgroup VARCHAR(64),
     dvodb VARCHAR(255),
     tess_id VARCHAR(64),
     end_stage VARCHAR(64),
     magicked BIGINT,
+    note VARCHAR(255),
     PRIMARY KEY(chip_id),
     KEY(chip_id), KEY(exp_id),
@@ -272,4 +275,6 @@
     KEY(workdir_state),
     KEY(label),
+    KEY(data_group),
+    KEY(dist_group),
     KEY(expgroup),
     KEY(end_stage),
@@ -367,4 +372,6 @@
     workdir_state VARCHAR(64),
     label VARCHAR(64),
+    data_group VARCHAR(64),
+    dist_group VARCHAR(64),
     reduction VARCHAR(64),
     expgroup VARCHAR(64),
@@ -373,4 +380,5 @@
     end_stage VARCHAR(64),
     magicked BIGINT,
+    note VARCHAR(255),
     PRIMARY KEY(cam_id),
     KEY(cam_id),
@@ -379,4 +387,6 @@
     KEY(workdir_state),
     KEY(label),
+    KEY(data_group),
+    KEY(dist_group),
     KEY(expgroup),
     KEY(end_stage),
@@ -466,5 +476,7 @@
     reduction VARCHAR(64),
     label VARCHAR(64),
+    data_group VARCHAR(64),
     dvodb VARCHAR(255),
+    note  VARCHAR(255),
     image_only TINYINT,
     PRIMARY KEY(add_id),
@@ -474,4 +486,5 @@
     KEY(workdir_state),
     KEY(label),
+    KEY(data_group),
     INDEX(add_id, cam_id),
     FOREIGN KEY(cam_id) REFERENCES camRun(cam_id)
@@ -498,4 +511,6 @@
     workdir VARCHAR(255),
     label VARCHAR(64),
+    data_group VARCHAR(64),
+    dist_group VARCHAR(64),
     reduction VARCHAR(64),
     expgroup VARCHAR(64),
@@ -504,8 +519,11 @@
     end_stage VARCHAR(64),
     epoch TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
+    note VARCHAR(255),
     PRIMARY KEY(fake_id),
     KEY(cam_id),
     KEY(state),
     KEY(label),
+    KEY(data_group),
+    KEY(dist_group),
     KEY(expgroup),
     KEY(end_stage),
@@ -834,4 +852,6 @@
     workdir_state VARCHAR(64),
     label VARCHAR(64),
+    data_group VARCHAR(64),
+    dist_group VARCHAR(64),
     dvodb VARCHAR(255),
     tess_id VARCHAR(64),
@@ -840,4 +860,5 @@
     registered DATETIME,
     magicked BIGINT,
+    note VARCHAR(255),
     PRIMARY KEY(warp_id),
     KEY(warp_id),
@@ -847,4 +868,6 @@
     KEY(workdir_state),
     KEY(label),
+    KEY(data_group),
+    KEY(dist_group),
     KEY(end_stage),
     INDEX(warp_id, fake_id),
@@ -910,4 +933,6 @@
         workdir VARCHAR(255),
         label VARCHAR(64),
+        data_group VARCHAR(64),
+        dist_group VARCHAR(64),
         reduction VARCHAR(64),
         dvodb VARCHAR(255),
@@ -916,4 +941,5 @@
         tess_id VARCHAR(64),
         filter VARCHAR(64),
+        note VARCHAR(255),
         PRIMARY KEY(stack_id),
         KEY(stack_id),
@@ -921,5 +947,7 @@
         KEY(skycell_id),
         KEY(tess_id),
-        KEY(label)
+        KEY(label),
+        KEY(data_group),
+        KEY(dist_group)
 ) ENGINE=innodb DEFAULT CHARSET=latin1;
 
@@ -973,4 +1001,6 @@
         workdir VARCHAR(255),
         label VARCHAR(64),
+        data_group VARCHAR(64),
+        dist_group VARCHAR(64),
         reduction VARCHAR(64),
         dvodb VARCHAR(255),
@@ -980,9 +1010,12 @@
         exposure TINYINT DEFAULT 0,
         magicked BIGINT,
+        note VARCHAR(255),
         PRIMARY KEY(diff_id),
         KEY(diff_id),
         KEY(state),
         KEY(tess_id),
-        KEY(label)
+        KEY(label),
+        KEY(data_group),
+        KEY(dist_group)
 ) ENGINE=innodb DEFAULT CHARSET=latin1;
 
@@ -1055,7 +1088,9 @@
         workdir_state VARCHAR(255),
         label VARCHAR(64),
+        data_group VARCHAR(64),
         dvodb VARCHAR(255),
         registered DATETIME,
         fault SMALLINT,
+        note VARCHAR(255),
         PRIMARY KEY(magic_id),
         KEY(magic_id),
@@ -1063,4 +1098,5 @@
         KEY(workdir_state),
         KEY(label),
+        KEY(data_group),
         KEY(fault),
         FOREIGN KEY(exp_id)  REFERENCES rawExp(exp_id),
@@ -1118,8 +1154,11 @@
         cam_id BIGINT,
         label VARCHAR(64),
+        data_group VARCHAR(64),
         outroot VARCHAR(255),
         recoveryroot VARCHAR(255),
         re_place TINYINT,
         remove TINYINT,
+        fault SMALLINT,
+        note VARCHAR(255),
         PRIMARY KEY(magic_ds_id),
         KEY(magic_ds_id),
@@ -1127,4 +1166,5 @@
         KEY(magic_id),
         KEY(label),
+        KEY(fault),
         FOREIGN KEY(magic_id) REFERENCES magicRun(magic_id),
         FOREIGN KEY(inv_magic_id) REFERENCES magicRun(magic_id)
@@ -1303,4 +1343,5 @@
     time_stamp  TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
     fault       SMALLINT,
+    note        VARCHAR(255),
     PRIMARY KEY(dist_id),
     KEY(state),
Index: trunk/ippTools/src/addtool.c
===================================================================
--- trunk/ippTools/src/addtool.c	(revision 25823)
+++ trunk/ippTools/src/addtool.c	(revision 25835)
@@ -111,5 +111,7 @@
     PXOPT_LOOKUP_STR(dvodb,       config->args, "-set_dvodb", false, false);
     PXOPT_LOOKUP_STR(label,       config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(data_group,  config->args, "-set_data_group", false, false);
     PXOPT_LOOKUP_STR(reduction,   config->args, "-set_reduction", false, false);
+    PXOPT_LOOKUP_STR(note,        config->args, "-set_note", false, false);
     PXOPT_LOOKUP_BOOL(image_only, config->args, "-image_only", false);
     PXOPT_LOOKUP_BOOL(pretend,    config->args, "-pretend", false);
@@ -216,5 +218,7 @@
 			       reduction   ? reduction : row->reduction,
 			       label       ? label     : row->label,
+			       data_group  ? data_group : (label ? label : row->label),
 			       dvodb       ? dvodb     : row->dvodb,
+                               note        ? note      : NULL,
 			       image_only
         )) {
@@ -253,6 +257,5 @@
     PXOPT_COPY_STR(config->args, where, "-reduction", "addRun.reduction", "==");
 
-    if (!psListLength(where->list)
-        && !psMetadataLookupBool(NULL, config->args, "-all")) {
+    if (!psListLength(where->list)) {
         psFree(where);
         psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
@@ -260,4 +263,16 @@
     }
 
+    psString query = psStringCopy("UPDATE addRun JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id)");
+
+    // pxUpdateRun gets parameters from config->args and runs the update query
+    bool result = pxUpdateRun(config, where, &query, false);
+
+    psFree(query);
+    psFree(where);
+
+    return result;
+
+
+#ifdef notdef
     PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
     PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
@@ -288,4 +303,5 @@
 
     return true;
+#endif
 }
 
Index: trunk/ippTools/src/addtoolConfig.c
===================================================================
--- trunk/ippTools/src/addtoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/addtoolConfig.c	(revision 25835)
@@ -61,4 +61,8 @@
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-pretend",           0, "do not actually modify the database", false);
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple",            0, "use the simple output format", false);
+
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_data_group", 0,   "define new data_group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "define new dist_group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_note", 0,         "define new note", NULL);
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all",               0, "allow everything to be queued without search terms", false);
 
@@ -74,5 +78,7 @@
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state",              0, "set state", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label",              0, "set label", NULL);
-
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_data_group", 0,   "define new data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "define new dist_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_note", 0,         "define new note", NULL);
     // -pendingexp
     psMetadata *pendingexpArgs = psMetadataAlloc();
Index: trunk/ippTools/src/camtool.c
===================================================================
--- trunk/ippTools/src/camtool.c	(revision 25823)
+++ trunk/ippTools/src/camtool.c	(revision 25835)
@@ -121,4 +121,6 @@
     PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
     PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
     PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
     PXOPT_LOOKUP_STR(expgroup, config->args, "-set_expgroup", false, false);
@@ -126,4 +128,5 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
     PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
 
     // find the exp_id of all the exposures that we want to queue up.
@@ -212,9 +215,12 @@
                     workdir     ? workdir   : row->workdir,
                     label       ? label     : row->label,
+                    data_group  ? data_group: row->data_group,
+                    dist_group  ? dist_group: row->dist_group,
                     reduction   ? reduction : row->reduction,
                     expgroup    ? expgroup  : row->expgroup,
                     dvodb       ? dvodb     : row->dvodb,
                     tess_id     ? tess_id   : row->tess_id,
-                    end_stage   ? end_stage : row->end_stage
+                    end_stage   ? end_stage : row->end_stage,
+                    note
         )) {
             if (!psDBRollback(config->dbh)) {
@@ -251,39 +257,21 @@
     PXOPT_COPY_STR(config->args, where, "-reduction", "camRun.reduction", "==");
 
-    if (!psListLength(where->list)
-        && !psMetadataLookupBool(NULL, config->args, "-all")) {
+    if (!psListLength(where->list)) {
         psFree(where);
         psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
         return false;
     }
-
-    PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
-    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
-
-    if ((!state) && (!label)) {
-        psError(PXTOOLS_ERR_DATA, false, "parameters are required");
-        psFree(where);
-        return false;
-    }
-
-    if (state) {
-        // set camRun.state to state
-        if (!pxcamRunSetStateByQuery(config, where, state)) {
-            psFree(where);
-            return false;
-        }
-    }
-
-    if (label) {
-        // set camRun.label to label
-        if (!pxcamRunSetLabelByQuery(config, where, label)) {
-            psFree(where);
-            return false;
-        }
-    }
-
+    psString query = psStringCopy("UPDATE camRun JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id)");
+
+    // pxUpdateRun gets parameters from config->args and updates
+    bool result = pxUpdateRun(config, where, &query, true);
+    if (!result) {
+        psError(PXTOOLS_ERR_DATA, false, "pxUpdateRun failed");
+    }
+
+    psFree(query);
     psFree(where);
 
-    return true;
+    return result;
 }
 
@@ -642,9 +630,12 @@
             pendingRow->workdir,
             pendingRow->label,
+            pendingRow->data_group,
+            pendingRow->dist_group,
             pendingRow->reduction,
             pendingRow->expgroup,
             pendingRow->dvodb,
             pendingRow->tess_id,
-            pendingRow->end_stage
+            pendingRow->end_stage,
+            NULL    // note does not propagate
     )) {
         // rollback
@@ -656,20 +647,4 @@
         return false;
     }
-
-/*     if (!pxaddQueueByCamID(config, */
-/* 			   pendingRow->cam_id, */
-/* 			   pendingRow->workdir, */
-/* 			   pendingRow->label, */
-/* 			   pendingRow->reduction, */
-/* 			   pendingRow->dvodb */
-/*     )) { */
-/*         // rollback */
-/*         if (!psDBRollback(config->dbh)) { */
-/*             psError(PS_ERR_UNKNOWN, false, "database error"); */
-/*         } */
-/*         psError(PS_ERR_UNKNOWN, false, "failed to queue new addRun"); */
-/*         psFree(pendingRow); */
-/*         return false; */
-/*     } */
 
     psFree(pendingRow);
Index: trunk/ippTools/src/camtoolConfig.c
===================================================================
--- trunk/ippTools/src/camtoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/camtoolConfig.c	(revision 25835)
@@ -62,5 +62,7 @@
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_tess_id",        0, "define tess ID", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_end_stage",      0, "define end stage", NULL);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all",               0, "allow everything to be queued without search terms", false);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_data_group",     0, "define data group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_dist_group",     0, "define dist group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_note",           0, "define note", NULL);
 
     // -updaterun
@@ -77,5 +79,7 @@
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state",          0, "set state", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label",          0, "set label", NULL);
-
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_data_group", 0,   "define new data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "define new dist_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_note", 0,         "define new note", NULL);
     // -pendingexp
     psMetadata *pendingexpArgs = psMetadataAlloc();
Index: trunk/ippTools/src/chiptool.c
===================================================================
--- trunk/ippTools/src/chiptool.c	(revision 25823)
+++ trunk/ippTools/src/chiptool.c	(revision 25835)
@@ -146,4 +146,7 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
     PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
 
     // default
@@ -265,4 +268,6 @@
 				 workdir     ? workdir   : raw_workdir,
 				 label       ? label     : raw_label,
+                                 data_group  ? data_group : (label ? label : raw_label),
+                                 dist_group,
 				 reduction   ? reduction : raw_reduction,
 				 // expgroup    ? expgroup  : raw_expgroup,
@@ -271,5 +276,6 @@
 				 dvodb       ? dvodb     : raw_dvodb,
 				 tess_id     ? tess_id   : raw_tess_id,
-				 end_stage   ? end_stage : raw_end_stage
+				 end_stage   ? end_stage : raw_end_stage,
+                                 note
 				 )) {
             if (!psDBRollback(config->dbh)) {
@@ -303,41 +309,24 @@
     PXOPT_COPY_STR(config->args,  where, "-label",   "chipRun.label",   "==");
     PXOPT_COPY_STR(config->args,  where, "-state",   "chipRun.state",   "==");
-
-    if (!psListLength(where->list) &&
-        !psMetadataLookupBool(NULL, config->args, "-all")) {
+    PXOPT_COPY_STR(config->args,  where, "-data_group", "chipRun.data_group",   "==");
+    PXOPT_COPY_STR(config->args,  where, "-dist_group", "chipRun.dist_group",   "==");
+
+    if (!psListLength(where->list)) {
         psFree(where);
-        where = NULL;
         psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
         return false;
     }
-
-    PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
-    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
-
-    if ((!state) && (!label)) {
-        psError(PXTOOLS_ERR_DATA, false, "parameters are required");
-        psFree(where);
-        return false;
-    }
-
-    if (state) {
-        // set chipRun.state to state
-        if (!pxchipRunSetStateByQuery(config, where, state)) {
-            psFree(where);
-            return false;
-        }
-    }
-
-    if (label) {
-        // set chipRun.label to label
-        if (!pxchipRunSetLabelByQuery(config, where, label)) {
-            psFree(where);
-            return false;
-        }
-    }
-
+    psString query = psStringCopy("UPDATE chipRun JOIN rawExp USING(exp_id)");
+
+    // pxUpdateRun gets parameters from config->args and updates
+    bool result = pxUpdateRun(config, where, &query, true);
+    if (!result) {
+        psError(PXTOOLS_ERR_DATA, false, "pxUpdateRun failed");
+    }
+
+    psFree(query);
     psFree(where);
 
-    return true;
+    return result;
 }
 
@@ -1258,9 +1247,12 @@
                     chipRun->workdir,
                     chipRun->label,
+                    chipRun->data_group,
+                    chipRun->dist_group,
                     chipRun->reduction,
                     chipRun->expgroup,
                     chipRun->dvodb,
                     chipRun->tess_id,
-                    chipRun->end_stage
+                    chipRun->end_stage,
+                    NULL    // note does not propagate
         )) {
            if (!psDBRollback(config->dbh)) {
Index: trunk/ippTools/src/chiptoolConfig.c
===================================================================
--- trunk/ippTools/src/chiptoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/chiptoolConfig.c	(revision 25835)
@@ -58,7 +58,9 @@
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_tess_id",  0,            "define tessellation identifier", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_end_stage",  0,            "define end stage", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_data_group",  0,      "define data group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_dist_group",  0,      "define distribution group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_note",  0,           "define note", NULL);
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-pretend",  0,            "do not actually modify the database", false);
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
 
     // -updaterun
@@ -67,8 +69,12 @@
     psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-chip_id",              0,            "search by chip ID", 0);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "search by state", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label",  0,          "search by label", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label",  0,           "search by label", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-data_group",  0,      "search by data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-dist_group",  0,      "search by dist_group", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state", 0,        "set state", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label", 0,        "set label", NULL);
-    psMetadataAddBool(updaterunArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_data_group", 0,   "set data group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "set dist group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_note", 0,         "set note", NULL);
 
     // -pendingimfile
Index: trunk/ippTools/src/difftool.c
===================================================================
--- trunk/ippTools/src/difftool.c	(revision 25823)
+++ trunk/ippTools/src/difftool.c	(revision 25835)
@@ -51,5 +51,4 @@
 
 static bool setdiffRunState(pxConfig *config, psS64 diff_id, const char *state, psS64 magicked);
-static bool setdiffRunStateByLabel(pxConfig *config, const char* label, const char *state);
 static bool change_skyfile_data_state(pxConfig *config, psString data_state, psString run_state);
 static bool tocleanedskyfileMode(pxConfig *config);
@@ -126,10 +125,13 @@
 
     // required options
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false);
     PXOPT_LOOKUP_BOOL(bothways, config->args, "-bothways", false);
     PXOPT_LOOKUP_BOOL(exposure, config->args, "-exposure", false);
-    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
-    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-rset_eduction", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
 
     // default
@@ -142,4 +144,6 @@
             workdir,
             label,
+            data_group ? data_group : label,
+            dist_group,
             reduction,
             NULL,       // dvodb
@@ -148,5 +152,6 @@
             bothways,
             exposure,
-            false
+            false,
+            note
     );
     if (!run) {
@@ -179,4 +184,26 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    psMetadata *where = psMetadataAlloc();
+
+    PXOPT_COPY_S64(config->args, where, "-diff_id",  "stack_id",   "==");
+    PXOPT_COPY_STR(config->args, where, "-label",     "label",     "==");
+    PXOPT_COPY_STR(config->args, where, "-state",     "state",     "==");
+    if (!psListLength(where->list)) {
+        psFree(where);
+        psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
+        return false;
+    }
+
+    psString query = psStringCopy("UPDATE diffRun");
+
+    // pxUpdateRun gets parameters from config->args and updates
+    bool result = pxUpdateRun(config, where, &query, true);
+
+    psFree(query);
+    psFree(where);
+
+    return result;
+
+#ifdef notdef
     // required options
     PXOPT_LOOKUP_S64(diff_id, config->args, "-diff_id", false, false);
@@ -197,4 +224,5 @@
 
     return false;
+#endif
 }
 
@@ -907,4 +935,5 @@
 
 
+#ifdef notdef
 static bool setdiffRunStateByLabel(pxConfig *config, const char *label, const char *state) {
   PS_ASSERT_PTR_NON_NULL(state,false);
@@ -925,4 +954,5 @@
   return true;
 }
+#endif
 
 // Generate a single populated run
@@ -932,5 +962,8 @@
                          const char *tess_id, // Tessellation identifier
                          const char *label, // label
+                         const char *data_group, // data_group
+                         const char *dist_group, // dist_group
                          const char *reduction, // reduction
+                         const char *note,      // note
                          psS64 input_warp_id, // Warp identifier for input image, PS_MAX_S64 for none
                          psS64 input_stack_id, // Stack identifier for input image, PS_MAX_S64 for none
@@ -963,4 +996,6 @@
             workdir,
             label,
+            data_group ? data_group : label,
+            dist_group,
             reduction,
             NULL,       // dvodb
@@ -969,5 +1004,6 @@
             false,
             false,
-            0       // magicked
+            0,       // magicked
+            note
     );
 
@@ -1043,4 +1079,6 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false); // required options
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
     PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
     PXOPT_LOOKUP_S64(template_warp_id, config->args, "-template_warp_id", false, false);
@@ -1049,4 +1087,5 @@
     PXOPT_LOOKUP_S64(input_stack_id, config->args, "-input_stack_id", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
 
     if (template_stack_id && template_warp_id) {
@@ -1072,5 +1111,5 @@
     psArray *list = psArrayAllocEmpty(16); // List of runs, to print
 
-    if (!populatedrun(list, workdir, skycell_id, tess_id, label, reduction,
+    if (!populatedrun(list, workdir, skycell_id, tess_id, label, data_group ? data_group : label, dist_group, reduction, note,
                       input_warp_id ? input_warp_id : PS_MAX_S64,
                       input_stack_id ? input_stack_id : PS_MAX_S64,
@@ -1111,8 +1150,12 @@
     PXOPT_COPY_STR(config->args, stackWhere, "-stack_label", "stackRun.label", "==");
 
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false); // required options
-    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false); // option
-    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false); // option
-    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false); // required option
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false); // option
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false); // option
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-set_registered", false, false);
+
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(newTemplates, config->args, "-new-templates", false);
@@ -1350,4 +1393,6 @@
                 workdir,
                 label,
+                data_group ? data_group : label,
+                dist_group,
                 reduction,
                 NULL,       // dvodb
@@ -1356,5 +1401,6 @@
                 false,                  // bothways
                 true,                   // exposure
-                0       // magicked
+                0,       // magicked
+                note
         );
 
@@ -1425,5 +1471,5 @@
     }
 
-    if (!diffRunPrintObjects(stdout, list, !simple)) {
+    if (numGood && !diffRunPrintObjects(stdout, list, !simple)) {
         psError(PS_ERR_UNKNOWN, false, "failed to print object");
         psFree(list);
@@ -1506,8 +1552,12 @@
 
     // Settings to apply to defined run
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false); // required options
-    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false); // option
-    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false); // option
-    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false); // required options
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false); // option
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false); // option
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false); // option
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false); // option
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false); // option
+    PXOPT_LOOKUP_TIME(registered, config->args, "-set_registered", false, false);
+
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
@@ -1693,6 +1743,6 @@
         }
 
-        diffRunRow *run = diffRunRowAlloc(0, "reg", workdir, label, reduction, NULL, registered,
-                                          tess_id, true, true, false); // Run to insert
+        diffRunRow *run = diffRunRowAlloc(0, "reg", workdir, label, data_group ? data_group : label, dist_group, reduction, NULL, registered,
+                                          tess_id, true, true, false, note); // Run to insert
         if (!diffRunInsertObject(config->dbh, run)) {
             psError(PS_ERR_UNKNOWN, false, "database error");
Index: trunk/ippTools/src/difftoolConfig.c
===================================================================
--- trunk/ippTools/src/difftoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/difftoolConfig.c	(revision 25835)
@@ -47,11 +47,14 @@
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_workdir", 0,         "define workdir (required)", NULL);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID (required)", NULL);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-bothways",  0,            "do the subtraction both ways?", false);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-exposure",  0,            "subtraction for entire exposure?", false);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label",  0,            "define label", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-reduction",  0,            "define reduction class", NULL);
-    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-bothways",  0,          "do the subtraction both ways?", false);
+    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-exposure",  0,          "subtraction for entire exposure?", false);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_label",  0,          "define label", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_reduction",  0,      "define reduction class", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-set_registered",  0,    "time detrend run was registered", now);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_data_group",  0,     "define data group", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_dist_group",  0,     "define dist group", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_note",  0,           "define note", NULL);
     psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
 
@@ -61,5 +64,10 @@
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "set state (required)", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label", 0,            "define by label instead of diff ID", 0);
-    
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label", 0,        "define new value for label", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state", 0,        "define new state", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_data_group", 0,   "define new data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "define new dist_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_note", 0,         "define new note", NULL);
+
     // -addinputskyfile
     psMetadata *addinputskyfileArgs = psMetadataAlloc();
@@ -175,8 +183,11 @@
     psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-warp_label", 0, "search by warp label", NULL);
     psMetadataAddF32(definewarpstackArgs, PS_LIST_TAIL, "-good_frac", 0, "minimum good fraction of skycell", NAN);
-    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-workdir", 0, "define workdir (required)", NULL);
-    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-label",  0, "define label", NULL);
-    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-reduction",  0, "define reduction class", NULL);
-    psMetadataAddTime(definewarpstackArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
+    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-set_workdir", 0, "define workdir (required)", NULL);
+    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-set_label",  0, "define label", NULL);
+    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-set_reduction",  0, "define reduction class", NULL);
+    psMetadataAddTime(definewarpstackArgs, PS_LIST_TAIL, "-set_registered", 0, "time detrend run was registered", now);
+    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-set_data_group",  0,     "define data group", NULL);
+    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-set_dist_group",  0,     "define dist group", NULL);
+    psMetadataAddStr(definewarpstackArgs, PS_LIST_TAIL, "-set_note",  0,           "define note", NULL);
     psMetadataAddBool(definewarpstackArgs, PS_LIST_TAIL, "-new-templates", 0, "also search for diffs with new template", false);
     psMetadataAddBool(definewarpstackArgs, PS_LIST_TAIL, "-rerun", 0, "define new run even if one exists", false);
@@ -198,8 +209,11 @@
     psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-template_label", 0, "search by warp label for template", NULL);
     psMetadataAddF32(definewarpwarpArgs, PS_LIST_TAIL, "-good_frac", 0, "minimum good fraction of skycell", NAN);
-    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-workdir", 0, "define workdir (required)", NULL);
-    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-label",  0, "define label", NULL);
-    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-reduction",  0, "define reduction class", NULL);
-    psMetadataAddTime(definewarpwarpArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
+    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-set_workdir", 0, "define workdir (required)", NULL);
+    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-set_label",  0, "define label", NULL);
+    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-set_reduction",  0, "define reduction class", NULL);
+    psMetadataAddTime(definewarpwarpArgs, PS_LIST_TAIL, "-set_registered", 0, "time detrend run was registered", now);
+    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-set_data_group",  0,     "define data group", NULL);
+    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-set_dist_group",  0,     "define dist group", NULL);
+    psMetadataAddStr(definewarpwarpArgs, PS_LIST_TAIL, "-set_note",  0,           "define note", NULL);
     psMetadataAddBool(definewarpwarpArgs, PS_LIST_TAIL, "-rerun", 0, "define new run even if one exists", false);
     psMetadataAddBool(definewarpwarpArgs, PS_LIST_TAIL, "-available", 0, "define new run even if warpRun has some faults", false);
Index: trunk/ippTools/src/disttool.c
===================================================================
--- trunk/ippTools/src/disttool.c	(revision 25823)
+++ trunk/ippTools/src/disttool.c	(revision 25835)
@@ -32,5 +32,4 @@
 
 static bool definebyqueryMode(pxConfig *config);
-static bool definerunMode(pxConfig *config);
 static bool updaterunMode(pxConfig *config);
 static bool revertrunMode(pxConfig *config);
@@ -79,5 +78,4 @@
     switch (config->mode) {
         MODECASE(DISTTOOL_MODE_DEFINEBYQUERY, definebyqueryMode);
-        MODECASE(DISTTOOL_MODE_DEFINERUN, definerunMode);
         MODECASE(DISTTOOL_MODE_UPDATERUN, updaterunMode);
         MODECASE(DISTTOOL_MODE_REVERTRUN, revertrunMode);
@@ -123,46 +121,4 @@
 }
 
-static bool definerunMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_STR(stage, config->args, "-stage", true, false);
-    PXOPT_LOOKUP_S64(stage_id, config->args, "-stage_id",  true, false);
-    PXOPT_LOOKUP_STR(outroot, config->args, "-outroot", true, false);
-    PXOPT_LOOKUP_S64(target_id, config->args, "-target_id",  true, false);
-
-    // optional
-    PXOPT_LOOKUP_BOOL(clean, config->args, "-clean", false);
-    PXOPT_LOOKUP_BOOL(no_magic, config->args, "-no_magic", false);
-    PXOPT_LOOKUP_STR(set_label, config->args, "-set_label", false, false);
-
-    // TODO: check that stage has an expected value
-    // XXX: all of the following concerns will be managed properly by definebyquery
-
-    // TODO: should we check that stage_id actually exists for stage
-    // in magicdstool we queue off of a magic_id so the stage_id, exp_id, and cam_id get looked up
-    // when the run is queued
-
-    if (!distRunInsert(config->dbh,
-            0,          // dist_id
-            target_id,
-            stage,
-            stage_id,
-            0,
-            set_label,
-            outroot,
-            clean,
-            no_magic,
-            "new",
-            NULL,       // time_stamp
-            0           // fault
-            )) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    return true;
-}
 
 static bool definebyqueryMode(pxConfig *config)
@@ -178,4 +134,6 @@
     PXOPT_LOOKUP_BOOL(no_magic, config->args, "-no_magic", false);
     PXOPT_LOOKUP_STR(set_label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(set_note, config->args, "-set_note", false, false);
+
     PXOPT_LOOKUP_S64(limit, config->args, "-limit", false, false);
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
@@ -191,4 +149,5 @@
 
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-dist_group", false, false);
 
     psString query = NULL;
@@ -209,4 +168,7 @@
             psStringAppend(&query, " AND (chipRun.label = '%s')", label);
         }
+        if (dist_group) {
+            psStringAppend(&query, " AND (chipRun.dist_group = '%s')", dist_group);
+        }
     } else if (!strcmp(stage, "chip")) {
         magicRunType = "chipRun";
@@ -222,4 +184,7 @@
             psStringAppend(&query, " AND (chipRun.label = '%s')", label);
         }
+        if (dist_group) {
+            psStringAppend(&query, " AND (chipRun.dist_group = '%s')", dist_group);
+        }
     } else if (!strcmp(stage, "camera")) {
         magicRunType = "camRun";    // This is used below to set the magicked business
@@ -235,4 +200,7 @@
             psStringAppend(&query, " AND (camRun.label = '%s')", label);
         }
+        if (dist_group) {
+            psStringAppend(&query, " AND (camRun.dist_group = '%s')", dist_group);
+        }
     } else if (!strcmp(stage, "fake")) {
         magicRunType = "fakeRun";
@@ -246,4 +214,7 @@
         if (label) {
             psStringAppend(&query, " AND (fakeRun.label = '%s')", label);
+        }
+        if (dist_group) {
+            psStringAppend(&query, " AND (fakeRun.dist_group = '%s')", dist_group);
         }
         // fake stage doesn't require magic
@@ -262,4 +233,7 @@
             psStringAppend(&query, " AND (warpRun.label = '%s')", label);
         }
+        if (dist_group) {
+            psStringAppend(&query, " AND (warpRun.dist_group = '%s')", dist_group);
+        }
 
     } else if (!strcmp(stage, "diff")) {
@@ -276,4 +250,7 @@
             psStringAppend(&query, " AND (diffRun.label = '%s')", label);
         }
+        if (dist_group) {
+            psStringAppend(&query, " AND (diffRun.dist_group = '%s')", dist_group);
+        }
 
     } else if (!strcmp(stage, "stack")) {
@@ -288,4 +265,7 @@
         if (label) {
             psStringAppend(&query, " AND (stackRun.label = '%s')", label);
+        }
+        if (dist_group) {
+            psStringAppend(&query, " AND (stackRun.dist_group = '%s')", dist_group);
         }
         // stack stage doesn't require magic
@@ -371,5 +351,5 @@
         psS64 magic_ds_id = psMetadataLookupS64(NULL, md, "magicked");
         psS64 target_id = psMetadataLookupS64(NULL, md, "target_id");
-        psString target_label = psMetadataLookupStr(NULL, md, "label");
+        psString stage_label = psMetadataLookupStr(NULL, md, "label");
         bool clean = psMetadataLookupBool(NULL, md, "clean");
 
@@ -381,5 +361,5 @@
             new_label = set_label;
         } else {
-            new_label = target_label;
+            new_label = stage_label;
         }
         distRunRow *row = distRunRowAlloc(
@@ -395,5 +375,6 @@
                 "new",
                 NULL,   // time_stamp
-                0       // fault
+                0,       // fault
+                set_note    // note does not propagate
                 );
 
@@ -1239,5 +1220,5 @@
 
     // required
-    PXOPT_LOOKUP_STR(label, config->args, "-label", true, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-dist_group", true, false);
     PXOPT_LOOKUP_STR(filter, config->args, "-filter", true, false);
     PXOPT_LOOKUP_STR(stage, config->args, "-stage", true, false);
@@ -1250,5 +1231,5 @@
     distTargetRow *row = distTargetRowAlloc(
             0,          // target_id
-            label,
+            dist_group,
             filter,
             stage,
@@ -1287,5 +1268,5 @@
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where, "-target_id", "target_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-label", "label", "==");
+    PXOPT_COPY_STR(config->args, where, "-dist_group", "dist_group", "==");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
     PXOPT_COPY_STR(config->args, where, "-stage", "stage", "==");
@@ -1323,5 +1304,5 @@
     psMetadata *where = psMetadataAlloc();
     PXOPT_COPY_S64(config->args, where, "-target_id", "target_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-label", "label", "==");
+    PXOPT_COPY_STR(config->args, where, "-dist_group", "dist_group", "LIKE");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "==");
     PXOPT_COPY_STR(config->args, where, "-stage", "stage", "==");
@@ -1518,5 +1499,5 @@
     PXOPT_LOOKUP_S64(target_id, config->args,    "-target_id", false, false);
     PXOPT_LOOKUP_STR(stage, config->args,        "-stage", false, false);
-    PXOPT_LOOKUP_STR(label, config->args,        "-label", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args,   "-dist_group", false, false);
     PXOPT_LOOKUP_STR(filter, config->args,       "-filter", false, false);
     PXOPT_LOOKUP_BOOL(clean, config->args,       "-clean", false);
@@ -1528,6 +1509,6 @@
             error = true;
         }
-        if (!label) {
-            psError(PS_ERR_UNKNOWN, !error, "label is required if target_id is not supplied");
+        if (!dist_group) {
+            psError(PS_ERR_UNKNOWN, !error, "dist_group is required if target_id is not supplied");
             error = true;
         }
@@ -1539,5 +1520,5 @@
     // optional
     PXOPT_LOOKUP_S64(limit, config->args, "-limit", false, false);
-    PXOPT_LOOKUP_STR(state, config->args,        "-set_state", false, false);
+    PXOPT_LOOKUP_STR(state, config->args,  "-set_state", false, false);
     if (state) {
         if (strcmp(state, "enabled") && strcmp(state, "disabled")) {
@@ -1555,5 +1536,5 @@
     PXOPT_COPY_STR(config->args, where, "-dest_name", "rcDestination.name", "==");
     PXOPT_COPY_S64(config->args, where, "-target_id", "target_id", "==");
-    PXOPT_COPY_STR(config->args, where, "-label", "label", "LIKE");
+    PXOPT_COPY_STR(config->args, where, "-dist_group", "dist_group", "LIKE");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "LIKE");
     PXOPT_COPY_STR(config->args, where, "-stage", "stage", "==");
@@ -1658,5 +1639,5 @@
     PXOPT_COPY_S64(config->args, where, "-target_id", "target_id", "==");
     PXOPT_COPY_STR(config->args, where, "-stage", "stage", "==");
-    PXOPT_COPY_STR(config->args, where, "-label", "label", "LIKE");
+    PXOPT_COPY_STR(config->args, where, "-dist_group", "dist_group", "LIKE");
     PXOPT_COPY_STR(config->args, where, "-filter", "filter", "LIKE");
     PXOPT_COPY_STR(config->args, where, "-state", "state", "==");
Index: trunk/ippTools/src/disttool.h
===================================================================
--- trunk/ippTools/src/disttool.h	(revision 25823)
+++ trunk/ippTools/src/disttool.h	(revision 25835)
@@ -26,5 +26,4 @@
     DISTTOOL_MODE_NONE      = 0x0,
     DISTTOOL_MODE_DEFINEBYQUERY,
-    DISTTOOL_MODE_DEFINERUN,
     DISTTOOL_MODE_UPDATERUN,
     DISTTOOL_MODE_REVERTRUN,
Index: trunk/ippTools/src/disttoolConfig.c
===================================================================
--- trunk/ippTools/src/disttoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/disttoolConfig.c	(revision 25835)
@@ -50,4 +50,5 @@
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-no_magic", 0, "magic is not needed", false);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_label",    0, "define label for run", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_note",    0, "select by dist_group", NULL);
 
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-dry_run", 0, "don't queue runs just display what would be selected", false);
@@ -58,18 +59,9 @@
     psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-chip_id",       0, "define chip_id", 0); 
     psMetadataAddS64(definebyqueryArgs, PS_LIST_TAIL, "-magic_ds_id",   0, "define chip_id", 0); 
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-label",         0, "select by label", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-label",         0, "select by run label", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-dist_group",    0, "select by dist_group", NULL);
 
     psMetadataAddU64(definebyqueryArgs, PS_LIST_TAIL, "-limit",  0,  "limit result set to N items", 0);
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
-
-    // -definerun
-    psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-stage",         0, "define stage for bundle (required)", NULL);
-    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-stage_id", 0, "define stage_id (required)", 0);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-outroot",  0, "define output destination (required)", NULL);
-    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-target_id", 0, "define target_id (required)", 0); 
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-clean", 0,   "build clean distribution bundle", false);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-no_magic", 0, "magic is not needed", false);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_label",    0, "define label for run", NULL);
 
     // -updaterun
@@ -139,4 +131,5 @@
     psMetadataAddS64(pendingfilesetArgs, PS_LIST_TAIL, "-dist_id", 0, "define dist_id", 0);
     psMetadataAddStr(pendingfilesetArgs, PS_LIST_TAIL, "-label",   PS_META_DUPLICATE_OK, "limit results to label", NULL);
+    psMetadataAddStr(pendingfilesetArgs, PS_LIST_TAIL, "-dist_group",   PS_META_DUPLICATE_OK, "limit results to dist_group", NULL);
     psMetadataAddStr(pendingfilesetArgs, PS_LIST_TAIL, "-stage",   0, "limit results to runs for stage", NULL);
     psMetadataAddU64(pendingfilesetArgs, PS_LIST_TAIL, "-limit",   0,  "limit result set to N items", 0);
@@ -219,5 +212,5 @@
     // -definetarget
     psMetadata *definetargetArgs = psMetadataAlloc();
-    psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-label",     0, "define label (required)", NULL);
+    psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-dist_group", 0, "define dist_group (required)", NULL);
     psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-filter",     0, "define filter (required)", NULL);
     psMetadataAddStr(definetargetArgs, PS_LIST_TAIL, "-stage",     0, "define stage (required)", NULL);
@@ -230,12 +223,13 @@
     psMetadataAddS64(updatetargetArgs, PS_LIST_TAIL, "-target_id", 0, "define target_id", 0);
     psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-stage",     0, "define stage", NULL);
-    psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-set_state", 0, "define state", NULL);
-    psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-label",     0, "define label", NULL);
+    psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-dist_group", 0, "define dist_group", NULL);
     psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-filter",    0, "define filter", NULL);
+
+    psMetadataAddStr(updatetargetArgs, PS_LIST_TAIL, "-set_state", 0, "define new state", NULL);
 
     // -listtarget
     psMetadata *listtargetArgs = psMetadataAlloc();
     psMetadataAddS64(listtargetArgs, PS_LIST_TAIL, "-target_id", 0, "list target with target_id", 0);
-    psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-label",  0, "list targets for label", NULL);
+    psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-dist_group",  0, "list targets for dist_group", NULL);
     psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-filter",    0, "define filter", NULL);
     psMetadataAddStr(listtargetArgs, PS_LIST_TAIL, "-stage",     0, "list targets for stage", NULL);
@@ -252,5 +246,5 @@
     psMetadataAddS64(defineinterestArgs, PS_LIST_TAIL, "-target_id", 0, "define target_id", 0);
     psMetadataAddStr(defineinterestArgs, PS_LIST_TAIL, "-stage",     0, "define stage", NULL);
-    psMetadataAddStr(defineinterestArgs, PS_LIST_TAIL, "-label",     0, "define label", NULL);
+    psMetadataAddStr(defineinterestArgs, PS_LIST_TAIL, "-dist_group",     0, "define dist_group", NULL);
     psMetadataAddStr(defineinterestArgs, PS_LIST_TAIL, "-filter",    0, "define filter (LIKE comparison)", NULL);
     psMetadataAddBool(defineinterestArgs, PS_LIST_TAIL,"-clean",     0, "list clean targets", false);
@@ -271,5 +265,5 @@
     psMetadataAddS64(listinterestsArgs, PS_LIST_TAIL, "-int_id", 0, "list interests with int_id", 0);
     psMetadataAddStr(listinterestsArgs, PS_LIST_TAIL, "-dest_name",  0, "list interests for destinationn name)", NULL);
-    psMetadataAddStr(listinterestsArgs, PS_LIST_TAIL, "-label",  0, "list interests for label (LIKE comparison)", NULL);
+    psMetadataAddStr(listinterestsArgs, PS_LIST_TAIL, "-dist_group",  0, "list interests for dist_group (LIKE comparison)", NULL);
     psMetadataAddStr(listinterestsArgs, PS_LIST_TAIL, "-filter",    0, "list interests by filter (LIKE comparison)", NULL);
     psMetadataAddStr(listinterestsArgs, PS_LIST_TAIL, "-stage",     0, "list interests for stage", NULL);
@@ -284,5 +278,4 @@
 
     PXOPT_ADD_MODE("-definebyquery",    "", DISTTOOL_MODE_DEFINEBYQUERY, definebyqueryArgs);
-    PXOPT_ADD_MODE("-definerun",    "", DISTTOOL_MODE_DEFINERUN, definerunArgs);
     PXOPT_ADD_MODE("-updaterun",    "", DISTTOOL_MODE_UPDATERUN, updaterunArgs);
     PXOPT_ADD_MODE("-revertrun",    "", DISTTOOL_MODE_REVERTRUN, revertrunArgs);
Index: trunk/ippTools/src/faketool.c
===================================================================
--- trunk/ippTools/src/faketool.c	(revision 25823)
+++ trunk/ippTools/src/faketool.c	(revision 25835)
@@ -177,4 +177,7 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
     PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
 
     // default
@@ -265,5 +268,5 @@
 
         // queue the exp
-        if (!pxfakeQueueByCamID(config, cam_id, workdir, label, reduction, expgroup, dvodb, tess_id, end_stage)) {
+        if (!pxfakeQueueByCamID(config, cam_id, workdir, label, data_group ? data_group : label, dist_group, reduction, expgroup, dvodb, tess_id, end_stage, note)) {
             if (!psDBRollback(config->dbh)) {
                 psError(PS_ERR_UNKNOWN, false, "database error");
@@ -330,7 +333,8 @@
     PXOPT_COPY_F32(config->args, where, "-sun_angle_max", "sun_angle", "<");
     PXOPT_COPY_STR(config->args, where, "-label", "fakeRun.label", "==");
-
-    if (!psListLength(where->list)
-        && !psMetadataLookupBool(NULL, config->args, "-all")) {
+    PXOPT_COPY_STR(config->args, where, "-data_group", "fakeRun.data_group", "==");
+    PXOPT_COPY_STR(config->args, where, "-dist_group", "fakeRun.dist_group", "==");
+
+    if (!psListLength(where->list)) {
         psFree(where);
         where = NULL;
@@ -339,32 +343,16 @@
     }
 
-    PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
-    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
-
-    if ((!state) && (!label)) {
-        psError(PXTOOLS_ERR_DATA, false, "parameters are required");
-        psFree(where);
-        return false;
-    }
-
-    if (state) {
-        // set fakeRun.state to state
-        if (!pxfakeRunSetStateByQuery(config, where, state)) {
-            psFree(where);
-            return false;
-        }
-    }
-
-    if (label) {
-        // set fakeRun.label to label
-        if (!pxfakeRunSetLabelByQuery(config, where, label)) {
-            psFree(where);
-            return false;
-        }
-    }
-
+    psString query = psStringCopy("UPDATE fakeRun JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id)");
+
+    // pxUpdateRun gets parameters from config->args and updates
+    bool result = pxUpdateRun(config, where, &query, true);
+    if (!result) {
+        psError(PXTOOLS_ERR_DATA, false, "pxUpdateRun failed");
+    }
+
+    psFree(query);
     psFree(where);
 
-    return true;
+    return result;
 }
 
@@ -1162,8 +1150,11 @@
                                  fakeRun->workdir,
                                  fakeRun->label,
+                                 fakeRun->data_group,
+                                 fakeRun->dist_group,
                                  fakeRun->dvodb,
                                  fakeRun->tess_id,
                                  fakeRun->reduction,
-                                 fakeRun->end_stage
+                                 fakeRun->end_stage,
+                                 NULL // note does not propagate
         )) {
             psError(PS_ERR_UNKNOWN, false, "failed to queue warpRun");
Index: trunk/ippTools/src/faketoolConfig.c
===================================================================
--- trunk/ippTools/src/faketoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/faketoolConfig.c	(revision 25835)
@@ -93,4 +93,7 @@
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_tess_id",  0,            "define tessellation identifier", NULL);
     psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_end_stage",  0,            "define end stage", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_dist_group",  0,           "define dist group", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_data_group",  0,           "define data group", NULL);
+    psMetadataAddStr(queueArgs, PS_LIST_TAIL, "-set_note",  0,                 "define note", NULL);
     psMetadataAddBool(queueArgs, PS_LIST_TAIL, "-pretend",  0,            "do not actually modify the database", false);
     psMetadataAddBool(queueArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
@@ -143,5 +146,7 @@
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state", 0,            "set state", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label", 0,            "set label", NULL);
-    psMetadataAddBool(updaterunArgs, PS_LIST_TAIL, "-all",  0,            "allow everything to be queued without search terms", false);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_data_group", 0,   "define new data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "define new dist_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_note", 0,         "define new note", NULL);
 
     // -pendingexp
Index: trunk/ippTools/src/flatcorr.c
===================================================================
--- trunk/ippTools/src/flatcorr.c	(revision 25823)
+++ trunk/ippTools/src/flatcorr.c	(revision 25835)
@@ -133,4 +133,5 @@
     PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
     PXOPT_LOOKUP_STR(region, config->args, "-set_region", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
 
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
@@ -235,5 +236,5 @@
 
         // queue the exp : force this to stop at the chip stage
-        psS64 chip_id = pxchipQueueByExpTag(config, exp_id, workdir, label, reduction, expgroup, dvodb, tess_id, "chip");
+        psS64 chip_id = pxchipQueueByExpTag(config, exp_id, workdir, label, label, NULL, reduction, expgroup, dvodb, tess_id, "chip", note);
         if (!chip_id) {
             if (!psDBRollback(config->dbh)) {
@@ -523,9 +524,13 @@
 		row->workdir,
 		row->label,
+		row->data_group,
+		row->dist_group,
 		row->reduction,
 		row->expgroup,
 		row->dvodb,
 		row->tess_id,
-		"camera")) {
+		"camera",
+                NULL // note does not propragate
+                )) {
             if (!psDBRollback(config->dbh)) {
                 psError(PS_ERR_UNKNOWN, false, "database error");
@@ -658,5 +663,7 @@
 		row->reduction,
 		row->label,
+                row->data_group,
 		row->dvodb,
+                NULL,       // note is not propagated
 		0)) {
             if (!psDBRollback(config->dbh)) {
Index: trunk/ippTools/src/magicdstool.c
===================================================================
--- trunk/ippTools/src/magicdstool.c	(revision 25823)
+++ trunk/ippTools/src/magicdstool.c	(revision 25835)
@@ -33,5 +33,4 @@
 
 static bool definebyqueryMode(pxConfig *config);
-static psS64 definerunMode(pxConfig *config);
 static bool updaterunMode(pxConfig *config);
 static bool todestreakMode(pxConfig *config);
@@ -46,5 +45,4 @@
 
 static bool setmagicDSRunState(pxConfig *config, psS64 magic_id, psMetadata *where, const char *state);
-static bool magicDSGetIDs(pxConfig *config, psString stage, psS64 magic_id, psS64 *stage_id, psS64 *cam_id);
 
 # define MODECASE(caseName, func) \
@@ -67,5 +65,4 @@
     switch (config->mode) {
         MODECASE(MAGICDSTOOL_MODE_DEFINEBYQUERY,       definebyqueryMode);
-        MODECASE(MAGICDSTOOL_MODE_DEFINERUN,           definerunMode);
         MODECASE(MAGICDSTOOL_MODE_UPDATERUN,           updaterunMode);
         MODECASE(MAGICDSTOOL_MODE_TODESTREAK,          todestreakMode);
@@ -110,4 +107,6 @@
     PXOPT_LOOKUP_BOOL(noreplace, config->args, "-noreplace", false);
     PXOPT_LOOKUP_STR(set_label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(set_data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
     PXOPT_LOOKUP_BOOL(rerun, config->args, "-rerun", false);
     PXOPT_LOOKUP_BOOL(dry_run, config->args, "-dry_run", false);
@@ -248,4 +247,5 @@
         psS64 cam_id = psMetadataLookupS64(NULL, row, "cam_id");
         psString magicRunLabel = psMetadataLookupStr(NULL, row, "label");
+        psString magicRunDataGroup = psMetadataLookupStr(NULL, row, "data_group");
         psString magicRunWorkdir = psMetadataLookupStr(NULL, row, "workdir");
         
@@ -269,8 +269,11 @@
                 cam_id,
                 set_label ? set_label : magicRunLabel,
+                set_data_group ? set_data_group : magicRunDataGroup,
                 outroot,
                 recoveryroot,
                 noreplace ? 0 :1,   // re_place
-                0); // remove
+                0,      // remove
+                0,      // fault
+                note);  // remove
 
         psFree(outroot);
@@ -315,66 +318,4 @@
 }
 
-static psS64 definerunMode(pxConfig *config)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-
-    // required
-    PXOPT_LOOKUP_S64(magic_id, config->args, "-magic_id", true, false);
-    PXOPT_LOOKUP_STR(stage, config->args, "-stage", true, false);
-    PXOPT_LOOKUP_STR(outroot, config->args, "-outroot", true, false);
-
-    // optional
-    PXOPT_LOOKUP_STR(recoveryroot, config->args, "-recoveryroot", false, false);
-    PXOPT_LOOKUP_BOOL(re_place, config->args, "-replace", false);
-    PXOPT_LOOKUP_BOOL(remove, config->args, "-remove", false);
-    PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
-
-    psS64 stage_id = 0, cam_id = 0;
-
-    if (!magicDSGetIDs(config, stage, magic_id, &stage_id, &cam_id)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to get ids");
-        return false;
-    }
-
-    magicDSRunRow *run = magicDSRunRowAlloc(
-            0,          // ID
-            magic_id,
-            0,          // inv_magic_id
-            "new",      // state
-            stage,
-            stage_id,
-            cam_id,
-            label,
-            outroot,
-            recoveryroot,
-            re_place,
-            remove
-    );
-
-    if (!run) {
-        psError(PS_ERR_UNKNOWN, false, "failed to alloc magicRun object");
-        return false;
-    }
-    if (!magicDSRunInsertObject(config->dbh, run)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(run);
-        return false;
-    }
-
-    psS64 magic_ds_id = psDBLastInsertID(config->dbh);
-    run->magic_ds_id = magic_ds_id;
-
-    if (!magicDSRunPrintObject(stdout, run, !simple)) {
-            psError(PS_ERR_UNKNOWN, false, "failed to print object");
-            psFree(run);
-            return false;
-    }
-
-    psFree(run);
-
-    return magic_id;
-}
-
 
 static bool updaterunMode(pxConfig *config)
@@ -696,68 +637,4 @@
 }
 
-static bool magicDSGetIDs(pxConfig *config, psString stage, psS64 magic_id, psS64 *stage_id, psS64 *cam_id)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(stage, false);
-    PS_ASSERT_PTR_NON_NULL(stage_id, false);
-    PS_ASSERT_PTR_NON_NULL(cam_id, false);
-
-    int stageNum = ippStringToStage(stage);;
-    if (stageNum == IPP_STAGE_NONE) {
-        psError(PXTOOLS_ERR_DATA, false, "%s is not a valid value for stage", stage);
-        return false;
-    }
-
-    psString query = pxDataGet("magicdstool_getrunids.sql");
-    if (!query) {
-        psError(PXTOOLS_ERR_DATA, false, "failed to retreive SQL statement");
-        return false;
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, magic_id)) {
-        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("magicdstool", PS_LOG_INFO, "no rows found");
-        psFree(output);
-        return true;
-    }
-    if (psArrayLength(output) > 1) {
-        psError(PS_ERR_UNKNOWN, true, "unexpected number of rows found %ld for magic_id %" PRId64,
-            psArrayLength(output), magic_id);
-        return false;
-    }
-    psMetadata *row = output->data[0];
-
-    *cam_id = psMetadataLookupS64(NULL, row, "cam_id");
-    switch (stageNum) {
-    case IPP_STAGE_RAW:
-        *stage_id = psMetadataLookupS64(NULL, row, "exp_id");
-        break;
-    case IPP_STAGE_CHIP:
-        *stage_id = psMetadataLookupS64(NULL, row, "chip_id");
-        break;
-    case IPP_STAGE_CAMERA:
-        *stage_id = *cam_id;
-        return true;
-    case IPP_STAGE_WARP:
-        *stage_id = psMetadataLookupS64(NULL, row, "warp_id");
-        break;
-    case IPP_STAGE_DIFF:
-        *stage_id = psMetadataLookupS64(NULL, row, "diff_id");
-        break;
-    }
-
-    return true;
-}
 
 static bool advancerunMode(pxConfig *config)
Index: trunk/ippTools/src/magicdstool.h
===================================================================
--- trunk/ippTools/src/magicdstool.h	(revision 25823)
+++ trunk/ippTools/src/magicdstool.h	(revision 25835)
@@ -26,5 +26,4 @@
     MAGICDSTOOL_MODE_NONE           = 0x0,
     MAGICDSTOOL_MODE_DEFINEBYQUERY,
-    MAGICDSTOOL_MODE_DEFINERUN,
     MAGICDSTOOL_MODE_UPDATERUN,
     MAGICDSTOOL_MODE_TODESTREAK,
Index: trunk/ippTools/src/magicdstoolConfig.c
===================================================================
--- trunk/ippTools/src/magicdstoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/magicdstoolConfig.c	(revision 25835)
@@ -68,15 +68,4 @@
     psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-simple",  0, "use the simple output format", false);
     psMetadataAddU64(definebyqueryArgs, PS_LIST_TAIL, "-limit", 0, "limit result set to N items", 0);
-
-    // -definerun
-    psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddS64(definerunArgs, PS_LIST_TAIL, "-magic_id", 0, "define magic_id (required)", 0);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-stage", 0, "define stage for run (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-outroot", 0, "define output directory (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-recoveryroot", 0, "define recovery directory", NULL);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-noreplace", 0, "do not replace the input wit with the destreaked versions", false);
-//    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-remove", 0, "use the simple output format", false);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", 0, "define label", NULL);
-    psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple", 0, "use the simple output format", false);
 
     // -updaterun
@@ -172,6 +161,4 @@
     PXOPT_ADD_MODE("-definebyquery",       "create magic de-streak runs from magic runs",
                     MAGICDSTOOL_MODE_DEFINEBYQUERY,     definebyqueryArgs);
-    PXOPT_ADD_MODE("-definerun",           "create one magic de-streak run for one magic run",
-                    MAGICDSTOOL_MODE_DEFINERUN,         definerunArgs);
     PXOPT_ADD_MODE("-updaterun",           "update state of magic de-streak run",
                     MAGICDSTOOL_MODE_UPDATERUN,         updaterunArgs);
Index: trunk/ippTools/src/magictool.c
===================================================================
--- trunk/ippTools/src/magictool.c	(revision 25823)
+++ trunk/ippTools/src/magictool.c	(revision 25835)
@@ -117,4 +117,6 @@
     // Optional
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-data_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-note", false, false);
     PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
@@ -236,6 +238,17 @@
 
         // create a new magicRun for this group
-        magicRunRow *run = magicRunRowAlloc(0, exp_id, diff_id, inverse, "new", workdir, "dirty", label,
-                                            dvodb, registered, 0);
+        magicRunRow *run = magicRunRowAlloc(0,
+                                            exp_id,
+                                            diff_id,
+                                            inverse,
+                                            "new",      // state
+                                            workdir,
+                                            "dirty",    // workdir_state
+                                            label,
+                                            data_group,
+                                            dvodb,
+                                            registered,
+                                            0,          // fault
+                                            note);
         if (!run) {
             psAbort("failed to alloc magicRun object");
@@ -331,7 +344,9 @@
             "dirty",    // workdir_state
             label,
+            NULL,       // data_group
             dvodb,
             registered,
-            0
+            0,          // fault
+            NULL
     );
 
Index: trunk/ippTools/src/pxadd.c
===================================================================
--- trunk/ippTools/src/pxadd.c	(revision 25823)
+++ trunk/ippTools/src/pxadd.c	(revision 25835)
@@ -127,5 +127,7 @@
 		       char *reduction,
 		       char *label,
+                       char *data_group,
 		       char *dvodb,
+                       char *note,
 		       bool image_only)
 {
@@ -152,5 +154,7 @@
 			 reduction? reduction : "NULL",
 			 label    ? label     : "NULL",
+			 data_group ? data_group     : "NULL",
 			 dvodb    ? dvodb     : "NULL",
+			 note     ? note     : "NULL",
 			 image_only,
 			 (long long) cam_id
Index: trunk/ippTools/src/pxadd.h
===================================================================
--- trunk/ippTools/src/pxadd.h	(revision 25823)
+++ trunk/ippTools/src/pxadd.h	(revision 25835)
@@ -35,5 +35,7 @@
 		       char *reduction,
 		       char *label,
+                       char *data_group,
 		       char *dvodb,
+		       char *note,
 		       bool image_only);
 
Index: trunk/ippTools/src/pxcam.c
===================================================================
--- trunk/ippTools/src/pxcam.c	(revision 25823)
+++ trunk/ippTools/src/pxcam.c	(revision 25835)
@@ -141,86 +141,16 @@
 }
 
-
-bool pxcamRunSetStateByQuery(pxConfig *config, psMetadata *where, const char *state)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(state, false);
-
-    // check that state is a valid string value
-    if (!pxIsValidState(state)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "invalid chipRun state: %s", state);
-        return false;
-    }
-
-    psString query = psStringCopy("UPDATE camRun JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id) SET camRun.state = '%s'");
-
-    if (where) {
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, state)) {
-        psFree(query);
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psFree(query);
-
-    return true;
-}
-
-
-bool pxcamRunSetLabel(pxConfig *config, psS64 cam_id, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    char *query = "UPDATE camRun SET camRun.label = '%s' WHERE cam_id = %" PRId64;
-    if (!p_psDBRunQueryF(config->dbh, query, label, cam_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for cam_id %" PRId64, cam_id);
-        return false;
-    }
-
-    return true;
-}
-
-bool pxcamRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    psString query = psStringCopy("UPDATE camRun JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id) SET camRun.label = '%s'");
-
-    if (where) {
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, label)) {
-        psFree(query);
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psFree(query);
-
-    return true;
-}
-
-
 bool pxcamQueueByChipID(pxConfig *config,
                     psS64 chip_id,
                     char *workdir,
                     char *label,
+                    char *data_group,
+                    char *dist_group,
                     char *recipe,
                     char *expgroup,
                     char *dvodb,
                     char *tess_id,
-                    char *end_stage)
+                    char *end_stage,
+                    char *note)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -245,4 +175,6 @@
                 "dirty", //workdir_state
                 label    ? label    : "NULL",
+                data_group ? data_group : "NULL",
+                dist_group ? dist_group : "NULL",
                 recipe   ? recipe   : "NULL",
                 expgroup ? expgroup : "NULL",
@@ -250,4 +182,5 @@
                 tess_id  ? tess_id  : "NULL",
                 end_stage ? end_stage : "NULL",
+                note     ? note     : "NULL",
                 (long long)chip_id
     )) {
Index: trunk/ippTools/src/pxcam.h
===================================================================
--- trunk/ippTools/src/pxcam.h	(revision 25823)
+++ trunk/ippTools/src/pxcam.h	(revision 25835)
@@ -26,8 +26,4 @@
 
 bool pxcamRunSetState(pxConfig *config, psS64 cam_id, const char *state, psS64 magicked);
-bool pxcamRunSetStateByQuery(pxConfig *config, psMetadata *where, const char *state);
-bool pxcamRunSetLabel(pxConfig *config, psS64 cam_id, const char *label);
-bool pxcamRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label);
-
 bool pxcamSetSearchArgs (psMetadata *md);
 bool pxcamGetSearchArgs (pxConfig *config, psMetadata *where);
@@ -37,9 +33,12 @@
                         char *workdir,
                         char *label,
+                        char *data_group,
+                        char *dist_group,
                         char *recipe,
                         char *expgroup,
                         char *dvodb,
                         char *tess_id,
-                        char *end_stage);
+                        char *end_stage,
+                        char *note);
 
 #endif // PXCAM_H
Index: trunk/ippTools/src/pxchip.c
===================================================================
--- trunk/ippTools/src/pxchip.c	(revision 25823)
+++ trunk/ippTools/src/pxchip.c	(revision 25835)
@@ -192,44 +192,4 @@
 }
 
-bool pxchipRunSetLabel(pxConfig *config, psS64 chip_id, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    char *query = "UPDATE chipRun SET label = '%s' WHERE chip_id = %" PRId64;
-    if (!p_psDBRunQueryF(config->dbh, query, label, chip_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for chip_id %" PRId64, chip_id);
-        return false;
-    }
-
-    return true;
-}
-
-
-bool pxchipRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    psString query = psStringCopy("UPDATE chipRun JOIN rawExp USING(exp_id) SET label = '%s'");
-
-    if (where && psListLength(where->list) > 0) {
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, label)) {
-        psFree(query);
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psFree(query);
-
-    return true;
-}
-
 bool pxchipProcessedImfileSetStateByQuery(pxConfig *config, psMetadata *where, const char *state)
 {
@@ -276,9 +236,12 @@
                          const char *workdir,
                          const char *label,
+                         const char *data_group,
+                         const char *dist_group,
                          const char *reduction,
                          const char *expgroup,
                          const char *dvodb,
                          const char *tess_id,
-                         const char *end_stage)
+                         const char *end_stage,
+                         const char *note)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -298,4 +261,6 @@
             "dirty",    // workdir_state
             label,
+            data_group,
+            dist_group,
             reduction,
             expgroup,
@@ -303,5 +268,6 @@
             tess_id,
             end_stage,
-            0           // magicked
+            0,          // magicked
+            note
             )
     ) {
Index: trunk/ippTools/src/pxchip.h
===================================================================
--- trunk/ippTools/src/pxchip.h	(revision 25823)
+++ trunk/ippTools/src/pxchip.h	(revision 25835)
@@ -28,8 +28,4 @@
 
 bool pxchipRunSetState(pxConfig *config, psS64 chip_id, const char *state, const bool magicked);
-bool pxchipRunSetStateByQuery(pxConfig *config, psMetadata *where, const char *state);
-bool pxchipRunSetLabel(pxConfig *config, psS64 chip_id, const char *label);
-bool pxchipRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label);
-
 bool pxchipProcessedImfileSetStateByQuery(pxConfig *config, psMetadata *where, const char *state);
 
@@ -38,9 +34,12 @@
                          const char *workdir,
                          const char *label,
+                         const char *data_group,
+                         const char *dist_group,
                          const char *reduction,
                          const char *expgroup,
                          const char *dvodb,
                          const char *tess_id,
-                         const char *end_stage);
+                         const char *end_stage,
+                         const char *note);
 
 
Index: trunk/ippTools/src/pxfake.c
===================================================================
--- trunk/ippTools/src/pxfake.c	(revision 25823)
+++ trunk/ippTools/src/pxfake.c	(revision 25835)
@@ -51,87 +51,16 @@
 }
 
-
-bool pxfakeRunSetStateByQuery(pxConfig *config, psMetadata *where, const char *state)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(state, false);
-
-    // check that state is a valid string value
-    if (!pxIsValidState(state)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "invalid fakeRun state: %s", state);
-        return false;
-    }
-
-    psString query = psStringCopy("UPDATE fakeRun JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id) SET fakeRun.state = '%s'");
-
-    if (where) {
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, state)) {
-        psFree(query);
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psFree(query);
-
-    return true;
-}
-
-
-bool pxfakeRunSetLabel(pxConfig *config, psS64 fake_id, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    char *query = "UPDATE fakeRun SET fakeRun.label = '%s' WHERE fake_id = %" PRId64;
-    if (!p_psDBRunQueryF(config->dbh, query, label, fake_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for fake_id %" PRId64, fake_id);
-        return false;
-    }
-
-    return true;
-}
-
-
-bool pxfakeRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    psString query = psStringCopy("UPDATE fakeRun JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id) SET fakeRun.label = '%s'");
-
-    if (where) {
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, label)) {
-        psFree(query);
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psFree(query);
-
-    return true;
-}
-
-
 psS64 pxfakeQueueByCamID(pxConfig *config,
                     psS64 cam_id,
                     char *workdir,
                     char *label,
+                    char *data_group,
+                    char *dist_group,
                     char *reduction,
                     char *expgroup,
                     char *dvodb,
                     char *tess_id,
-                    char *end_stage)
+                    char *end_stage,
+                    char *note)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -157,4 +86,6 @@
                 workdir  ? workdir  : "NULL",
                 label    ? label    : "NULL",
+                data_group ? data_group : "NULL",
+                dist_group ? dist_group : "NULL",
                 reduction? reduction: "NULL",
                 expgroup ? expgroup : "NULL",
@@ -162,4 +93,5 @@
                 tess_id  ? tess_id  : "NULL",
                 end_stage ? end_stage : "NULL",
+                note     ? note     : "NULL",
                 (long long)cam_id
     )) {
Index: trunk/ippTools/src/pxfake.h
===================================================================
--- trunk/ippTools/src/pxfake.h	(revision 25823)
+++ trunk/ippTools/src/pxfake.h	(revision 25835)
@@ -26,8 +26,4 @@
 
 bool pxfakeRunSetState(pxConfig *config, psS64 fake_id, const char *state);
-bool pxfakeRunSetStateByQuery(pxConfig *config, psMetadata *where, const char *state);
-bool pxfakeRunSetLabel(pxConfig *config, psS64 fake_id, const char *label);
-bool pxfakeRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label);
-
 
 psS64 pxfakeQueueByCamID(pxConfig *config,
@@ -35,9 +31,12 @@
                     char *workdir,
                     char *label,
+                    char *data_group,
+                    char *dist_group,
                     char *reduction,
                     char *expgroup,
                     char *dvodb,
                     char *tess_id,
-                    char *end_stage);
+                    char *end_stage,
+                    char *note);
 
 
Index: trunk/ippTools/src/pxtools.c
===================================================================
--- trunk/ippTools/src/pxtools.c	(revision 25823)
+++ trunk/ippTools/src/pxtools.c	(revision 25835)
@@ -108,2 +108,71 @@
     return true;
 }
+
+// shared code for updating the various strings for a Run
+bool pxUpdateRun(pxConfig *config, psMetadata *where, psString *pQuery, bool has_dist_group)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    PS_ASSERT_PTR_NON_NULL(where, false);
+    PS_ASSERT_PTR_NON_NULL(pQuery, false);
+    PS_ASSERT_PTR_NON_NULL(*pQuery, false);
+
+    // make sure that -state is not the only selection parameter
+    PXOPT_LOOKUP_STR(where_state, config->args, "-state", false, false);
+    if (where_state && (psListLength(where->list) < 2)) {
+        psError(PXTOOLS_ERR_DATA, true, "selection by -state alone is not allowed");
+        return false;
+    }
+
+    PXOPT_LOOKUP_STR(state, config->args,       "-set_state", false, false);
+    PXOPT_LOOKUP_STR(label, config->args,       "-set_label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args,  "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args,        "-set_note", false, false);
+
+    psString dist_group = NULL;
+    if (has_dist_group) {
+        PXOPT_LOOKUP_STR(tmp_dist_group, config->args,  "-set_dist_group", false, false);
+        dist_group = tmp_dist_group;
+    }
+
+    if ((!state) && (!label) && (!data_group) && (has_dist_group && !dist_group) && !(note)) {
+        psError(PXTOOLS_ERR_DATA, false, "parameters are required");
+        return false;
+    }
+
+    if (state && ! pxIsValidState(state)) {
+        psError(PXTOOLS_ERR_DATA, false, "pxIsValidState failed");
+        return false;
+    }
+
+    // first paramter is added with "SET param = 'value'"
+    // subseqent ones with ", param = 'value'"
+    char *separator = " SET ";
+    char *comma = ",";
+
+#   define addColumn(_val) \
+        do { \
+            if (_val) { \
+                psStringAppend(pQuery, "%s %s = '%s'", separator, #_val, _val); \
+                separator = comma; \
+            } \
+        } while (0)
+
+    addColumn(state);
+    addColumn(data_group);
+    if (has_dist_group) {
+        addColumn(dist_group);
+    }
+    addColumn(note);
+    addColumn(label);
+
+    psString whereClause =  psDBGenerateWhereSQL(where, NULL);
+    psStringAppend(pQuery, " %s", whereClause);
+    psFree(whereClause);
+
+    if (!p_psDBRunQuery(config->dbh, *pQuery)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        return false;
+    }
+
+    return true;
+}
Index: trunk/ippTools/src/pxtools.h
===================================================================
--- trunk/ippTools/src/pxtools.h	(revision 25823)
+++ trunk/ippTools/src/pxtools.h	(revision 25835)
@@ -63,4 +63,6 @@
 bool pxGetOptions(FILE *stream, int argc, char **argv, pxConfig *config, psMetadata *modes, psMetadata *argSets);
 
+bool pxUpdateRun(pxConfig *config, psMetadata *where, psString *pQuery, bool has_dist_group);
+
 #define PXOPT_ADD_MODE(option, comment, modeval, argset) \
 { \
Index: trunk/ippTools/src/pxwarp.c
===================================================================
--- trunk/ippTools/src/pxwarp.c	(revision 25823)
+++ trunk/ippTools/src/pxwarp.c	(revision 25835)
@@ -29,108 +29,15 @@
 #include "pxwarp.h"
 
-bool pxwarpRunSetState(pxConfig *config, psS64 warp_id, const char *state)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(state, false);
-
-    // check that state is a valid string value
-    if (!pxIsValidState(state)) {
-        psError(PS_ERR_UNKNOWN, false, "invalid warpRun state: %s", state);
-        return false;
-    }
-
-    char *query = "UPDATE warpRun SET state = '%s' WHERE warp_id = %" PRId64;
-    if (!p_psDBRunQueryF(config->dbh, query, state, warp_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change state for warp_id %" PRId64, warp_id);
-        return false;
-    }
-
-    return true;
-}
-
-
-bool pxwarpRunSetStateByQuery(pxConfig *config, psMetadata *where, const char *state)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_PTR_NON_NULL(state, false);
-
-    // check that state is a valid string value
-    if (!pxIsValidState(state)) {
-        psError(PS_ERR_UNKNOWN, false, "invalid warpRun state: %s", state);
-        return false;
-    }
-
-    psString query = psStringCopy("UPDATE warpRun JOIN fakeRun USING(fake_id) JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id) SET warpRun.state = '%s'");
-
-    if (where) {
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        if (whereClause && strlen(whereClause) > 0) {
-            psStringAppend(&query, " %s", whereClause);
-        }
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, state)) {
-        psFree(query);
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psFree(query);
-
-    return true;
-}
-
-
-bool pxwarpRunSetLabel(pxConfig *config, psS64 warp_id, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    char *query = "UPDATE warpRun SET warpRun.label = '%s' WHERE warp_id = %" PRId64;
-    if (!p_psDBRunQueryF(config->dbh, query, label, warp_id)) {
-        psError(PS_ERR_UNKNOWN, false,
-                "failed to change label for warp_id %" PRId64, warp_id);
-        return false;
-    }
-
-    return true;
-}
-
-
-bool pxwarpRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label)
-{
-    PS_ASSERT_PTR_NON_NULL(config, false);
-    // note label == NULL should be explicitly allowed
-
-    psString query = psStringCopy("UPDATE warpRun JOIN fakeRun USING(fake_id) JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id) SET warpRun.label = '%s'");
-
-    if (where) {
-        psString whereClause = psDBGenerateWhereSQL(where, NULL);
-        psStringAppend(&query, " %s", whereClause);
-        psFree(whereClause);
-    }
-
-    if (!p_psDBRunQueryF(config->dbh, query, label)) {
-        psFree(query);
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
-
-    psFree(query);
-
-    return true;
-}
-
-
 bool pxwarpQueueByFakeID(pxConfig *config,
                          psS64 fake_id,
                          const char *workdir,
                          const char *label,
+                         const char *data_group,
+                         const char *dist_group,
                          const char *dvodb,
                          const char *tess_id,
                          const char *reduction,
-                         const char *end_stage)
+                         const char *end_stage,
+                         const char *note)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -145,10 +52,13 @@
         "dirty",    // workdir_state
         label,
+        data_group,
+        dist_group,
         dvodb,
         tess_id,
-                       reduction,
+        reduction,
         end_stage,
         NULL,      // registered
-        0          // magicked zero when created will get updated when warpRun goes to 'full'
+        0,         // magicked set to zero when created may get updated when warpRun goes to 'full'
+        NULL        // note
     )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
Index: trunk/ippTools/src/pxwarp.h
===================================================================
--- trunk/ippTools/src/pxwarp.h	(revision 25823)
+++ trunk/ippTools/src/pxwarp.h	(revision 25835)
@@ -25,17 +25,15 @@
 #include "pxtools.h"
 
-bool pxwarpRunSetState(pxConfig *config, psS64 warp_id, const char *state);
-bool pxwarpRunSetStateByQuery(pxConfig *config, psMetadata *where, const char *state);
-bool pxwarpRunSetLabel(pxConfig *config, psS64 warp_id, const char *label);
-bool pxwarpRunSetLabelByQuery(pxConfig *config, psMetadata *where, const char *label);
-
 bool pxwarpQueueByFakeID(pxConfig *config,
                          psS64 fake_id,
                          const char *workdir,
                          const char *label,
+                         const char *data_group,
+                         const char *dist_group,
                          const char *dvodb,
                          const char *tess_id,
                          const char *reduction,
-                         const char *end_stage);
+                         const char *end_stage,
+                         const char *note);
 
 #endif // PXWARP_H
Index: trunk/ippTools/src/regtool.c
===================================================================
--- trunk/ippTools/src/regtool.c	(revision 25823)
+++ trunk/ippTools/src/regtool.c	(revision 25835)
@@ -885,9 +885,12 @@
                 workdir,
                 label,
+                NULL,       // data_group
+                NULL,       // dist_group
                 reduction,
-                NULL, // expgroup
+                NULL,       // expgroup
                 dvodb,
                 tess_id,
-                end_stage
+                end_stage,
+                NULL        // note
     )) {
         // rollback
Index: trunk/ippTools/src/stacktool.c
===================================================================
--- trunk/ippTools/src/stacktool.c	(revision 25823)
+++ trunk/ippTools/src/stacktool.c	(revision 25835)
@@ -48,5 +48,4 @@
 
 static bool setstackRunState(pxConfig *config, psS64 stack_id, const char *state);
-static bool setstackRunStateByLabel(pxConfig *config, const char *label, const char *state);
 
 # define MODECASE(caseName, func) \
@@ -110,8 +109,14 @@
 
     // required options
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
-    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
-    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
-    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false);
+
+    // optional
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-set_registered", false, false);
 
     psMetadata *where = psMetadataAlloc();
@@ -161,8 +166,6 @@
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
     PXOPT_LOOKUP_BOOL(pretend, config->args, "-pretend", false);
-    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
-
-    if (!psListLength(where->list) &&
-        !psMetadataLookupBool(NULL, config->args, "-all")) {
+
+    if (!psListLength(where->list)) {
         psFree(where);
         psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
@@ -346,4 +349,6 @@
             workdir,
             label,
+            data_group ? data_group : label,
+            dist_group,
             reduction,
             dvodb,
@@ -351,5 +356,6 @@
             skycell_id,
             tess_id,
-            filter);
+            filter,
+            note);
 
         if (!stackRunInsertObject(config->dbh, run)) {
@@ -469,5 +475,5 @@
 
     // required options
-    PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false);
+    PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", true, false);
     PXOPT_LOOKUP_STR(skycell_id, config->args, "-skycell_id", true, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false);
@@ -476,10 +482,13 @@
     // default
     PXOPT_LOOKUP_BOOL(simple, config->args, "-simple", false);
-    PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
+    PXOPT_LOOKUP_TIME(registered, config->args, "-set_registered", false, false);
 
     // options
-    PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
-    PXOPT_LOOKUP_STR(reduction, config->args, "-reduction", false, false);
-    PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
+    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
+    PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
+    PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", false, false);
 
     // we have to support multipe exp_ids
@@ -496,4 +505,6 @@
         workdir,
         label,
+        data_group ? data_group : label,
+        dist_group,
         reduction,
         dvodb,
@@ -501,5 +512,6 @@
         skycell_id,
         tess_id,
-        filter);
+        filter,
+        note);
 
     if (!run) {
@@ -570,8 +582,30 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+#ifdef notdef
     PXOPT_LOOKUP_S64(stack_id, config->args, "-stack_id", false, false);
     PXOPT_LOOKUP_STR(state, config->args, "-state", true, false);
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
-
+#endif
+    psMetadata *where = psMetadataAlloc();
+    PXOPT_COPY_S64(config->args, where, "-stack_id",  "stack_id",   "==");
+    PXOPT_COPY_STR(config->args, where, "-label",     "label",     "==");
+    PXOPT_COPY_STR(config->args, where, "-state",     "state",     "==");
+    if (!psListLength(where->list)) {
+        psFree(where);
+        psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
+        return false;
+    }
+
+    psString query = psStringCopy("UPDATE stackRun");
+
+    // pxUpdateRun gets parameters from config->args and updates
+    bool result = pxUpdateRun(config, where, &query, true);
+
+    psFree(query);
+    psFree(where);
+
+    return result;
+
+#ifdef notdef
     // Hack-y work around to make stacktool more like the other tools, without breaking other stuff (hopefully).
 
@@ -587,4 +621,5 @@
     psError(PS_ERR_UNKNOWN, false, "Required options not found.");
     return false;
+#endif
 }
 
@@ -1015,4 +1050,5 @@
 }
 
+#ifdef notdef
 static bool setstackRunStateByLabel(pxConfig *config, const char *label, const char *state)
 {
@@ -1034,4 +1070,5 @@
     return true;
 }
+#endif
 
 static bool pendingcleanuprunMode(pxConfig *config)
Index: trunk/ippTools/src/stacktoolConfig.c
===================================================================
--- trunk/ippTools/src/stacktoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/stacktoolConfig.c	(revision 25835)
@@ -47,9 +47,12 @@
     // -definebyquery
     psMetadata *definebyqueryArgs = psMetadataAlloc();
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-workdir", 0, "define workdir (required)", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-label", 0, "define label", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-reduction", 0, "define reduction", NULL);
-    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-dvodb", 0, "define dvodb", NULL);
-    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered", 0, "time detrend run was registered", now);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_workdir", 0, "define workdir (required)", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_label", 0, "define label", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_data_group", 0, "define data group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_dist_group", 0, "define dist group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_note", 0, "define note", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_reduction", 0, "define reduction", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_dvodb", 0, "define dvodb", NULL);
+    psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-set_registered", 0, "time detrend run was registered", now);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-select_skycell_id", 0, "search for skycell_id", NULL);
     psMetadataAddF32(definebyqueryArgs, PS_LIST_TAIL, "-select_good_frac_min", 0, "define min good_frac", 0.0);
@@ -84,5 +87,4 @@
     psMetadataAddF64(definebyqueryArgs, PS_LIST_TAIL, "-select_iq_m4_max", 0, "define max iq_m4", NAN);
     psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-random", 0, "use this number of random elements", 0);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all", 0, "allow everything to be queued without search terms", false);
     psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-min_num", 0, "minimum number of inputs", 0);
     psMetadataAddS32(definebyqueryArgs, PS_LIST_TAIL, "-min_new", 0, "minimum number of new inputs", 0);
@@ -93,9 +95,9 @@
     // -definerun
     psMetadata *definerunArgs = psMetadataAlloc();
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-workdir", 0,            "define workdir (required)", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-label", 0, "define label", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-reduction", 0, "define reduction", NULL);
-    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-dvodb", 0, "define dvodb", NULL);
-    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_workdir", 0,            "define workdir (required)", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_label", 0, "define label", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_reduction", 0, "define reduction", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_dvodb", 0, "define dvodb", NULL);
+    psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-set_registered",  0,            "time detrend run was registered", now);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-skycell_id",  0,            "define skycell ID (required)", NULL);
     psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-tess_id",  0,            "define tessellation ID (required)", NULL);
@@ -106,7 +108,12 @@
     // -updaterun
     psMetadata *updaterunArgs = psMetadataAlloc();
-    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-stack_id", 0,            "define stack ID (required)", 0);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "set state (required)", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label", 0,            "define by label instead of stack ID", 0);
+    psMetadataAddS64(updaterunArgs, PS_LIST_TAIL, "-stack_id", 0,         "search by stack ID", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,            "search by state", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label", 0,            "search by label", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label", 0,        "define new value for label", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state", 0,        "define new state", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_data_group", 0,   "define new data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "define new dist_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_note", 0,         "define new note", NULL);
     
     // -addinputskyfile
Index: trunk/ippTools/src/warptool.c
===================================================================
--- trunk/ippTools/src/warptool.c	(revision 25823)
+++ trunk/ippTools/src/warptool.c	(revision 25835)
@@ -141,4 +141,7 @@
     PXOPT_LOOKUP_STR(workdir, config->args, "-workdir", true, false); // required
     PXOPT_LOOKUP_STR(label, config->args, "-label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-dist_group", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-note", false, false);
     PXOPT_LOOKUP_STR(dvodb, config->args, "-dvodb", false, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-tess_id", true, false); // required (no default TESS)
@@ -162,4 +165,6 @@
             "dirty",    // workdir_state
             label,
+            data_group ? data_group : label,
+            dist_group,
             dvodb,
             tess_id,
@@ -167,5 +172,6 @@
             end_stage,
             registered,
-            0       // magicked
+            0,       // magicked
+            note
     );
     if (!warpRun) {
@@ -253,8 +259,11 @@
     PXOPT_LOOKUP_STR(workdir, config->args, "-set_workdir", false, false);
     PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
+    PXOPT_LOOKUP_STR(data_group, config->args, "-set_data_group", false, false);
+    PXOPT_LOOKUP_STR(dist_group, config->args, "-set_dist_group", false, false);
     PXOPT_LOOKUP_STR(dvodb, config->args, "-set_dvodb", false, false);
     PXOPT_LOOKUP_STR(tess_id, config->args, "-set_tess_id", false, false);
     PXOPT_LOOKUP_STR(reduction, config->args, "-set_reduction", false, false);
     PXOPT_LOOKUP_STR(end_stage, config->args, "-set_end_stage", false, false);
+    PXOPT_LOOKUP_STR(note, config->args, "-set_note", false, false);
 
     PXOPT_LOOKUP_TIME(registered, config->args, "-registered", false, false);
@@ -342,8 +351,11 @@
                                  workdir     ? workdir   : row->workdir,
                                  label       ? label     : row->label,
+                                 data_group  ? data_group: row->data_group,
+                                 dist_group  ? dist_group: row->dist_group,
                                  dvodb       ? dvodb     : row->dvodb,
                                  tess_id     ? tess_id   : row->tess_id,
                                  reduction   ? reduction : row->reduction,
-                                 end_stage   ? end_stage : row->end_stage))
+                                 end_stage   ? end_stage : row->end_stage,
+                                 note))
           {
             psError(PS_ERR_UNKNOWN, false, "failed to trying to queue fake_id: %" PRId64, row->fake_id);
@@ -373,43 +385,23 @@
     PXOPT_COPY_STR(config->args, where, "-label",     "warpRun.label",     "==");
     PXOPT_COPY_STR(config->args, where, "-state",     "warpRun.state",     "==");
-
-    if (!psListLength(where->list)
-        && !psMetadataLookupBool(NULL, config->args, "-all")) {
+    PXOPT_COPY_STR(config->args, where, "-data_group","warpRun.data_group",     "==");
+    PXOPT_COPY_STR(config->args, where, "-dist_group","warpRun.dist_group",     "==");
+
+    if (!psListLength(where->list)) {
         psFree(where);
-        where = NULL;
         psError(PXTOOLS_ERR_DATA, false, "search parameters are required");
         return false;
     }
-
-    PXOPT_LOOKUP_STR(state, config->args, "-set_state", false, false);
-    PXOPT_LOOKUP_STR(label, config->args, "-set_label", false, false);
-
-    if ((!state) && (!label)) {
-        psError(PXTOOLS_ERR_DATA, false, "parameters (-state or -label) are required");
-        psFree(where);
-        return false;
-    }
-
-    if (state) {
-        // set warpRun.state to state
-        if (!pxwarpRunSetStateByQuery(config, where, state)) {
-            psFree(where);
-            return false;
-        }
-    }
-
-    if (label) {
-        // set chipRun.label to label
-        if (!pxwarpRunSetLabelByQuery(config, where, label)) {
-            psFree(where);
-            return false;
-        }
-    }
-
+    
+    psString query = psStringCopy("UPDATE warpRun JOIN fakeRun USING(fake_id) JOIN camRun USING(cam_id) JOIN chipRun USING(chip_id) JOIN rawExp USING(exp_id)");
+
+    // pxUpdateRun gets parameters from config->args and updates
+    bool result = pxUpdateRun(config, where, &query, true);
+
+    psFree(query);
     psFree(where);
 
-    return true;
-}
-
+    return result;
+}
 
 static bool expMode(pxConfig *config)
Index: trunk/ippTools/src/warptoolConfig.c
===================================================================
--- trunk/ippTools/src/warptoolConfig.c	(revision 25823)
+++ trunk/ippTools/src/warptoolConfig.c	(revision 25835)
@@ -100,5 +100,7 @@
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_reduction",      0, "define reduction class", NULL);
     psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_end_stage",      0, "define end stage", NULL);
-    psMetadataAddBool(definebyqueryArgs, PS_LIST_TAIL, "-all",               0, "allow everything to be queued without search terms", false);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_data_group",     0, "define data group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_dist_group",     0, "define dist group", NULL);
+    psMetadataAddStr(definebyqueryArgs, PS_LIST_TAIL, "-set_note",           0, "define note", NULL);
 
     psMetadataAddTime(definebyqueryArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
@@ -117,4 +119,8 @@
     psMetadataAddTime(definerunArgs, PS_LIST_TAIL, "-registered",  0,            "time detrend run was registered", now);
     psMetadataAddBool(definerunArgs, PS_LIST_TAIL, "-simple",  0,            "use the simple output format", false);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_end_stage",      0, "define end stage", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_data_group",     0, "define data group", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_dist_group",     0, "define dist group", NULL);
+    psMetadataAddStr(definerunArgs, PS_LIST_TAIL, "-set_note",           0, "define note", NULL);
 
     // -updaterun
@@ -128,8 +134,12 @@
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-state", 0,      "search by warpRun state", NULL);
     psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-label", 0,      "search by warpRun label", NULL);
-    psMetadataAddBool(updaterunArgs, PS_LIST_TAIL, "-all",  0,      "allow everything to be queued without search terms", false);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state", 0,  "set state", NULL);
-    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label", 0,  "set label", NULL);
-
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-data_group", 0, "search by warpRun data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-dist_group", 0, "search by warpRun dist_group", NULL);
+
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_state", 0,        "define new state", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_label", 0,        "define new value for label", 0);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_data_group", 0,   "define new data_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_dist_group", 0,   "define new dist_group", NULL);
+    psMetadataAddStr(updaterunArgs, PS_LIST_TAIL, "-set_note", 0,         "define new note", NULL);
     // -exp
     psMetadata *expArgs = psMetadataAlloc();
