Index: trunk/ippTools/src/pstamptool.c
===================================================================
--- trunk/ippTools/src/pstamptool.c	(revision 33112)
+++ trunk/ippTools/src/pstamptool.c	(revision 33119)
@@ -704,6 +704,8 @@
     PXOPT_LOOKUP_S16(fault,       config->args, "-fault",      false, false);
     PXOPT_LOOKUP_S64(exp_id,      config->args, "-exp_id",     false, false);
-    PXOPT_LOOKUP_S64(options,     config->args, "-options",     false, false);
+    PXOPT_LOOKUP_S64(options,     config->args, "-options",    false, false);
     PXOPT_LOOKUP_S64(dep_id,      config->args, "-dep_id",     false, false);
+    PXOPT_LOOKUP_S64(parent_id,   config->args, "-parent_id",  false, false);
+    PXOPT_LOOKUP_BOOL(is_parent,  config->args, "-is_parent",  false);
 
     // unless the job is being inserted with stop state require outputBase
@@ -716,4 +718,19 @@
     if (!strcmp(job_type, "get_image") || !strcmp(job_type, "detect_query") || !strcmp(job_type, "none")) {
         stampJob = false;
+    } else if (!strcmp(job_type, "child")) {
+        // job_type child's only action is to resolve a dependent
+        // XXX: IS this necessary?
+        if (!dep_id) {
+            psError(PS_ERR_UNKNOWN, true, "dep_id required for child job\n");
+            return false;
+        }
+        if (is_parent) {
+            psError(PS_ERR_UNKNOWN, true, "job type child can not be a parent job\n");
+            return false;
+        }
+        stampJob = false;
+    } else if (!strcmp(job_type, "mosaic")) {
+        stampJob = false;
+        is_parent = true;
     } else if (!strcmp(job_type, "stamp")) {
         stampJob = true;
@@ -723,5 +740,5 @@
     }
     if (!pstampJobInsert(config->dbh,
-            0, // job_id
+            0,          // job_id
             req_id,
             rownum,
@@ -733,5 +750,7 @@
             options,
             dep_id,
-            0   // fault_count
+            0,          // fault_count
+            parent_id,
+            is_parent
             )) {
         psError(PS_ERR_UNKNOWN, false, "database error");
@@ -842,8 +861,11 @@
 
     // use psDBGenerateWhereSQL because the SQL yields an intermediate table
+    psString whereStr = NULL;
     if (psListLength(where->list)) {
         psString whereClause = psDBGenerateWhereConditionSQL(where, NULL);
-        psStringAppend(&query, " AND %s", whereClause);
+        psStringAppend(&whereStr, "\n AND %s", whereClause);
         psFree(whereClause);
+    } else {
+        psStringAppend(&whereStr, "%s", "");
     }
     psFree(where);
@@ -858,9 +880,11 @@
     }
 
-    if (!p_psDBRunQuery(config->dbh, query)) {
-        psError(PS_ERR_UNKNOWN, false, "database error");
-        psFree(query);
-        return false;
-    }
+    if (!p_psDBRunQueryF(config->dbh, query, whereStr, whereStr)) {
+        psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(whereStr);
+        psFree(query);
+        return false;
+    }
+    psFree(whereStr);
     psFree(query);
 
@@ -956,4 +980,5 @@
 
     PXOPT_LOOKUP_S32(fault,  config->args, "-set_fault",  true, false);
+    PXOPT_LOOKUP_STR(state,  config->args, "-set_state",  false, false);
 
     psMetadata *where = psMetadataAlloc();
@@ -986,5 +1011,5 @@
     psFree(where);
 
-    if (!p_psDBRunQueryF(config->dbh, query, fault, fault)) {
+    if (!p_psDBRunQueryF(config->dbh, query, fault, fault, state)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
         psFree(query);
Index: trunk/ippTools/src/pstamptoolConfig.c
===================================================================
--- trunk/ippTools/src/pstamptoolConfig.c	(revision 33112)
+++ trunk/ippTools/src/pstamptoolConfig.c	(revision 33119)
@@ -144,4 +144,6 @@
     psMetadataAddS64(addjobArgs, PS_LIST_TAIL, "-options", 0,          "define options", 0);
     psMetadataAddS64(addjobArgs, PS_LIST_TAIL, "-dep_id", 0,           "define job dep_id", 0);
+    psMetadataAddS64(addjobArgs, PS_LIST_TAIL, "-parent_id", 0,        "define parent's job_id", 0);
+    psMetadataAddBool(addjobArgs, PS_LIST_TAIL, "-is_parent", 0,       "define whether job has children", false);
     psMetadataAddS16(addjobArgs, PS_LIST_TAIL, "-fault", 0,            "define job result", 0);
 
@@ -186,4 +188,5 @@
     psMetadataAddS32(stopdependentjobArgs, PS_LIST_TAIL,  "-fault_count", 0,   "select by fault_count (>=)", 0);
     psMetadataAddS16(stopdependentjobArgs, PS_LIST_TAIL,  "-set_fault", 0,    "new fault value for job and dependent (required)", 0);
+    psMetadataAddStr(stopdependentjobArgs, PS_LIST_TAIL, "-set_state", 0,            "new pstampDependent.state", "new");
     psMetadataAddStr(stopdependentjobArgs, PS_LIST_TAIL, "-label", PS_META_DUPLICATE_OK, "search by pstampJob label (LIKE comparision)", NULL);
     psMetadataAddU64(stopdependentjobArgs, PS_LIST_TAIL, "-limit", 0,      "not used", 0);
