Index: trunk/ippdb/src/ippdb.c
===================================================================
--- trunk/ippdb/src/ippdb.c	(revision 8543)
+++ trunk/ippdb/src/ippdb.c	(revision 8665)
@@ -1,2 +1,10 @@
+/*
+ *
+ * This file was generated by glueforge 0.24
+ *
+ * Do NOT directly edit this file.
+ *
+ */
+
 #include <stdio.h>
 
@@ -42,8 +50,8 @@
 #define P2PENDINGIMFILE_TABLE_NAME "p2PendingImfile"
 #define P2PENDINGIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
-#define P2DONEEXP_TABLE_NAME "p2DoneExp"
-#define P2DONEEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
-#define P2DONEIMFILE_TABLE_NAME "p2DoneImfile"
-#define P2DONEIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
+#define P2PROCESSEDEXP_TABLE_NAME "p2ProcessedExp"
+#define P2PROCESSEDEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
+#define P2PROCESSEDIMFILE_TABLE_NAME "p2ProcessedImfile"
+#define P2PROCESSEDIMFILE_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
 #define P3PENDINGEXP_TABLE_NAME "p3PendingExp"
 #define P3PENDINGEXP_INDEX_NAME IPPDB_DEFAULT_INDEX_NAME
@@ -562,5 +570,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 WEATHER_TABLE_NAME, WEATHER_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -1121,5 +1129,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 SKYP_TRANSPARENCY_TABLE_NAME, SKYP_TRANSPARENCY_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -1716,5 +1724,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 SKYP_ABSORPTION_TABLE_NAME, SKYP_ABSORPTION_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -2279,5 +2287,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 SKYP_EMISSION_TABLE_NAME, SKYP_EMISSION_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -2827,5 +2835,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DIMM_TABLE_NAME, DIMM_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -3367,5 +3375,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 SKYP_IR_TABLE_NAME, SKYP_IR_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -3860,5 +3868,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DOME_TABLE_NAME, DOME_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -4350,5 +4358,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 TELESCOPE_TABLE_NAME, TELESCOPE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -4855,5 +4863,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 SUMMITEXP_TABLE_NAME, SUMMITEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -5359,5 +5367,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 PZPENDINGEXP_TABLE_NAME, PZPENDINGEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -5882,5 +5890,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 PZPENDINGIMFILE_TABLE_NAME, PZPENDINGIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -6397,5 +6405,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 NEWEXP_TABLE_NAME, NEWEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -6883,5 +6891,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 NEWIMFILE_TABLE_NAME, NEWIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -7593,5 +7601,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 RAWDETRENDEXP_TABLE_NAME, RAWDETRENDEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -8446,5 +8454,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 RAWSCIENCEEXP_TABLE_NAME, RAWSCIENCEEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -9300,5 +9308,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 RAWIMFILE_TABLE_NAME, RAWIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -9898,5 +9906,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 P1PENDINGEXP_TABLE_NAME, P1PENDINGEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -10360,5 +10368,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 P2PENDINGEXP_TABLE_NAME, P2PENDINGEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -10871,5 +10879,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 P2PENDINGIMFILE_TABLE_NAME, P2PENDINGIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -11099,15 +11107,14 @@
     return true;
 }
-static void p2DoneExpRowFree(p2DoneExpRow *object);
-
-p2DoneExpRow *p2DoneExpRowAlloc(const char *exp_id, const char *recipe, psS32 p1_version, psS32 p2_version)
-{
-    p2DoneExpRow    *object;
-
-    object = psAlloc(sizeof(p2DoneExpRow));
-    psMemSetDeallocator(object, (psFreeFunc)p2DoneExpRowFree);
+static void p2ProcessedExpRowFree(p2ProcessedExpRow *object);
+
+p2ProcessedExpRow *p2ProcessedExpRowAlloc(const char *exp_id, psS32 p1_version, psS32 p2_version)
+{
+    p2ProcessedExpRow *object;
+
+    object = psAlloc(sizeof(p2ProcessedExpRow));
+    psMemSetDeallocator(object, (psFreeFunc)p2ProcessedExpRowFree);
 
     object->exp_id = psStringCopy(exp_id);
-    object->recipe = psStringCopy(recipe);
     object->p1_version = p1_version;
     object->p2_version = p2_version;
@@ -11116,11 +11123,10 @@
 }
 
-static void p2DoneExpRowFree(p2DoneExpRow *object)
+static void p2ProcessedExpRowFree(p2ProcessedExpRow *object)
 {
     psFree(object->exp_id);
-    psFree(object->recipe);
-}
-
-bool p2DoneExpCreateTable(psDB *dbh)
+}
+
+bool p2ProcessedExpCreateTable(psDB *dbh)
 {
     psMetadata      *md;
@@ -11128,6 +11134,6 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAdd(md, PS_LIST_TAIL, P2DONEEXP_INDEX_NAME, PS_DATA_S32, "AUTO_INCREMENT", 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item %s", P2DONEEXP_INDEX_NAME);
+    if (!psMetadataAdd(md, PS_LIST_TAIL, P2PROCESSEDEXP_INDEX_NAME, PS_DATA_S32, "AUTO_INCREMENT", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item %s", P2PROCESSEDEXP_INDEX_NAME);
         psFree(md);
         return false;
@@ -11138,9 +11144,4 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, "64")) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p1_version");
@@ -11154,5 +11155,5 @@
     }
 
-    status = psDBCreateTable(dbh, P2DONEEXP_TABLE_NAME, md);
+    status = psDBCreateTable(dbh, P2PROCESSEDEXP_TABLE_NAME, md);
 
     psFree(md);
@@ -11161,10 +11162,10 @@
 }
 
-bool p2DoneExpDropTable(psDB *dbh)
-{
-    return psDBDropTable(dbh, P2DONEEXP_TABLE_NAME);
-}
-
-bool p2DoneExpInsert(psDB * dbh, const char *exp_id, const char *recipe, psS32 p1_version, psS32 p2_version)
+bool p2ProcessedExpDropTable(psDB *dbh)
+{
+    return psDBDropTable(dbh, P2PROCESSEDEXP_TABLE_NAME);
+}
+
+bool p2ProcessedExpInsert(psDB * dbh, const char *exp_id, psS32 p1_version, psS32 p2_version)
 {
     psMetadata      *md;
@@ -11177,9 +11178,4 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, p1_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p1_version");
@@ -11193,5 +11189,5 @@
     }
 
-    status = psDBInsertOneRow(dbh, P2DONEEXP_TABLE_NAME, md);
+    status = psDBInsertOneRow(dbh, P2PROCESSEDEXP_TABLE_NAME, md);
     psFree(md);
 
@@ -11199,11 +11195,11 @@
 }
 
-long long p2DoneExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
+long long p2ProcessedExpDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
 {
     long long       deleted = 0;
 
-    long long count = psDBDeleteRows(dbh, P2DONEEXP_TABLE_NAME, where, limit);
+    long long count = psDBDeleteRows(dbh, P2PROCESSEDEXP_TABLE_NAME, where, limit);
     if (count < 0) {
-        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2DoneExp");
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2ProcessedExp");
         return count;
 
@@ -11213,5 +11209,5 @@
     return deleted;
 }
-bool p2DoneExpPop(psDB *dbh, char **exp_id, char **recipe, psS32 *p1_version, psS32 *p2_version)
+bool p2ProcessedExpPop(psDB *dbh, char **exp_id, psS32 *p1_version, psS32 *p2_version)
 {
     psArray         *rowSet;
@@ -11222,7 +11218,7 @@
     int             rowID;
 
-    rowSet = psDBSelectRows(dbh, P2DONEEXP_TABLE_NAME, NULL, 1);
+    rowSet = psDBSelectRows(dbh, P2PROCESSEDEXP_TABLE_NAME, NULL, 1);
     if (!rowSet) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2DONEEXP_INDEX_NAME);
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2PROCESSEDEXP_INDEX_NAME);
         psFree(rowSet);
         return NULL;
@@ -11237,7 +11233,7 @@
     psFree(rowSet);
 
-    rowID = psMetadataLookupS32(&status, row, P2DONEEXP_INDEX_NAME);
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2DONEEXP_INDEX_NAME);
+    rowID = psMetadataLookupS32(&status, row, P2PROCESSEDEXP_INDEX_NAME);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2PROCESSEDEXP_INDEX_NAME);
         psFree(row);
         return NULL;
@@ -11245,7 +11241,7 @@
 
     popped = psMetadataAlloc();
-    psMetadataAddS32(popped, PS_LIST_TAIL, P2DONEEXP_INDEX_NAME, 0, NULL, rowID);
-
-    deleted = psDBDeleteRows(dbh, P2DONEEXP_TABLE_NAME, popped, 0);
+    psMetadataAddS32(popped, PS_LIST_TAIL, P2PROCESSEDEXP_INDEX_NAME, 0, NULL, rowID);
+
+    deleted = psDBDeleteRows(dbh, P2PROCESSEDEXP_TABLE_NAME, popped, 0);
     if (deleted != 1) {
         psError(PS_ERR_UNKNOWN, false, "database failed to delete row");
@@ -11263,10 +11259,4 @@
         return false;
     }
-    *recipe = psMetadataLookupPtr(&status, row, "recipe");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe");
-        psFree(row);
-        return false;
-    }
     *p1_version = psMetadataLookupS32(&status, row, "p1_version");
     if (!status) {
@@ -11287,13 +11277,13 @@
 }
 
-bool p2DoneExpInsertObject(psDB *dbh, p2DoneExpRow *object)
-{
-    return p2DoneExpInsert(dbh, object->exp_id, object->recipe, object->p1_version, object->p2_version);
-}
-
-bool p2DoneExpInsertObjects(psDB *dbh, psArray *objects)
+bool p2ProcessedExpInsertObject(psDB *dbh, p2ProcessedExpRow *object)
+{
+    return p2ProcessedExpInsert(dbh, object->exp_id, object->p1_version, object->p2_version);
+}
+
+bool p2ProcessedExpInsertObjects(psDB *dbh, psArray *objects)
 {
     for (long i = 0; i < psArrayLength(objects); i++) {
-        if (!p2DoneExpInsertObject(dbh, objects->data[i])) {
+        if (!p2ProcessedExpInsertObject(dbh, objects->data[i])) {
             return false;
         }
@@ -11303,26 +11293,25 @@
 }
 
-p2DoneExpRow *p2DoneExpPopObject(psDB *dbh)
+p2ProcessedExpRow *p2ProcessedExpPopObject(psDB *dbh)
 {
     char            exp_id[256];
-    char            recipe[256];
     psS32           p1_version;
     psS32           p2_version;
 
-    if (!p2DoneExpPop(dbh, (char **)&exp_id, (char **)&recipe, &p1_version, &p2_version)) {
+    if (!p2ProcessedExpPop(dbh, (char **)&exp_id, &p1_version, &p2_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to pop a database row");
         return NULL;
     }
 
-    return p2DoneExpRowAlloc(exp_id, recipe, p1_version, p2_version);
-}
-
-bool p2DoneExpInsertFits(psDB *dbh, const psFits *fits)
+    return p2ProcessedExpRowAlloc(exp_id, p1_version, p2_version);
+}
+
+bool p2ProcessedExpInsertFits(psDB *dbh, const psFits *fits)
 {
     psArray         *rowSet;
 
-    // move to (the first?) extension named  P2DONEEXP_TABLE_NAME
-    if (!psFitsMoveExtName(fits, P2DONEEXP_TABLE_NAME)) {
-        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P2DONEEXP_TABLE_NAME);
+    // move to (the first?) extension named  P2PROCESSEDEXP_TABLE_NAME
+    if (!psFitsMoveExtName(fits, P2PROCESSEDEXP_TABLE_NAME)) {
+        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P2PROCESSEDEXP_TABLE_NAME);
         return false;
     }
@@ -11342,5 +11331,5 @@
     }
 
-    if (!psDBInsertRows(dbh, P2DONEEXP_TABLE_NAME, rowSet)) {
+    if (!psDBInsertRows(dbh, P2PROCESSEDEXP_TABLE_NAME, rowSet)) {
         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
         psFree(rowSet);
@@ -11353,9 +11342,9 @@
 }
 
-bool p2DoneExpPopFits(psDB *dbh, psFits *fits, unsigned long long limit)
+bool p2ProcessedExpPopFits(psDB *dbh, psFits *fits, unsigned long long limit)
 {
     char            query[MAX_STRING_LENGTH];
 
-    if (!p2DoneExpSelectRowsFits(dbh, fits, NULL, limit)) {
+    if (!p2ProcessedExpSelectRowsFits(dbh, fits, NULL, limit)) {
         psError(PS_ERR_UNKNOWN, true, "database error or table is empty");
         return false;
@@ -11365,6 +11354,6 @@
     if (snprintf(query, MAX_STRING_LENGTH,
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
-                P2DONEEXP_TABLE_NAME, P2DONEEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+                P2PROCESSEDEXP_TABLE_NAME, P2PROCESSEDEXP_INDEX_NAME, limit) < 0) {
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -11378,10 +11367,10 @@
 }
 
-bool p2DoneExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
+bool p2ProcessedExpSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
 {
     psArray         *rowSet;
     psU64           i;
 
-    rowSet = psDBSelectRows(dbh, P2DONEEXP_TABLE_NAME, where, limit);
+    rowSet = psDBSelectRows(dbh, P2PROCESSEDEXP_TABLE_NAME, where, limit);
     if (!rowSet) {
         return false;
@@ -11390,6 +11379,6 @@
     // strip index column
     for (i = 0; i < rowSet->n; i++) {
-        if (!psMetadataRemove((psMetadata *)rowSet->data[i], 0, P2DONEEXP_INDEX_NAME)) {
-            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2DONEEXP_INDEX_NAME);
+        if (!psMetadataRemove((psMetadata *)rowSet->data[i], 0, P2PROCESSEDEXP_INDEX_NAME)) {
+            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2PROCESSEDEXP_INDEX_NAME);
             psFree(rowSet);
             return false;
@@ -11398,5 +11387,5 @@
 
     // output to fits
-    if (!psFitsWriteTable(fits, NULL, rowSet, P2DONEEXP_TABLE_NAME)) {
+    if (!psFitsWriteTable(fits, NULL, rowSet, P2PROCESSEDEXP_TABLE_NAME)) {
         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
         psFree(rowSet);
@@ -11409,5 +11398,5 @@
 }
 
-psMetadata *p2DoneExpMetadataFromObject(const p2DoneExpRow *object)
+psMetadata *p2ProcessedExpMetadataFromObject(const p2ProcessedExpRow *object)
 {
     psMetadata      *md;
@@ -11419,9 +11408,4 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
-        psFree(md);
-        return NULL;
-    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, object->p1_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p1_version");
@@ -11438,9 +11422,8 @@
 }
 
-p2DoneExpRow *p2DoneExpObjectFromMetadata(psMetadata *md)
+p2ProcessedExpRow *p2ProcessedExpObjectFromMetadata(psMetadata *md)
 {
     bool            status;
     char            *exp_id;
-    char            *recipe;
     psS32           p1_version;
     psS32           p2_version;
@@ -11451,9 +11434,4 @@
         return false;
     }
-    recipe = psMetadataLookupPtr(&status, md, "recipe");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe");
-        return false;
-    }
     p1_version = psMetadataLookupS32(&status, md, "p1_version");
     if (!status) {
@@ -11467,7 +11445,7 @@
     }
 
-    return p2DoneExpRowAlloc(exp_id, recipe, p1_version, p2_version);
-}
-psArray *p2DoneExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
+    return p2ProcessedExpRowAlloc(exp_id, p1_version, p2_version);
+}
+psArray *p2ProcessedExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
 {
     psArray         *rowSet;
@@ -11475,5 +11453,5 @@
     psU64           i;
 
-    rowSet = psDBSelectRows(dbh, P2DONEEXP_TABLE_NAME, where, limit);
+    rowSet = psDBSelectRows(dbh, P2PROCESSEDEXP_TABLE_NAME, where, limit);
     if (!rowSet) {
         return NULL;
@@ -11482,6 +11460,6 @@
     // strip index column
     for (i = 0; i < rowSet->n; i++) {
-        if (!psMetadataRemove((psMetadata *)(rowSet->data[i]), 0, P2DONEEXP_INDEX_NAME)) {
-            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2DONEEXP_INDEX_NAME);
+        if (!psMetadataRemove((psMetadata *)(rowSet->data[i]), 0, P2PROCESSEDEXP_INDEX_NAME)) {
+            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2PROCESSEDEXP_INDEX_NAME);
             psFree(rowSet);
             return false;
@@ -11495,5 +11473,5 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        p2DoneExpRow *object = p2DoneExpObjectFromMetadata(rowSet->data[i]);
+        p2ProcessedExpRow *object = p2ProcessedExpObjectFromMetadata(rowSet->data[i]);
         psArrayAdd(returnSet, 0, object);
         psFree(object);
@@ -11504,11 +11482,11 @@
     return returnSet;
 }
-bool p2DoneExpDeleteObject(psDB *dbh, const p2DoneExpRow *object)
-{
-    psMetadata *where = p2DoneExpMetadataFromObject(object);
-    long long count = psDBDeleteRows(dbh, P2DONEEXP_TABLE_NAME, where, 0);
+bool p2ProcessedExpDeleteObject(psDB *dbh, const p2ProcessedExpRow *object)
+{
+    psMetadata *where = p2ProcessedExpMetadataFromObject(object);
+    long long count = psDBDeleteRows(dbh, P2PROCESSEDEXP_TABLE_NAME, where, 0);
     psFree(where)
     if (count < 0) {
-        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2DoneExp");
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2ProcessedExp");
         return false;
     }
@@ -11516,21 +11494,21 @@
         // XXX should this be a psAbort() instead?  It is possible that
         // having an object match multiple rows was by design.
-        psError(PS_ERR_UNKNOWN, true, "p2DoneExpRow object matched more then one row.  Check your database schema");
-        return false;
-    }
-
-    return true;
-}
-long long p2DoneExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
+        psError(PS_ERR_UNKNOWN, true, "p2ProcessedExpRow object matched more then one row.  Check your database schema");
+        return false;
+    }
+
+    return true;
+}
+long long p2ProcessedExpDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
 {
     long long       deleted = 0;
 
     for (long long i = 0; i < objects->n; i++) {
-        p2DoneExpRow *object = objects->data[i];
-        psMetadata *where = p2DoneExpMetadataFromObject(object);
-        long long count = psDBDeleteRows(dbh, P2DONEEXP_TABLE_NAME, where, limit);
+        p2ProcessedExpRow *object = objects->data[i];
+        psMetadata *where = p2ProcessedExpMetadataFromObject(object);
+        long long count = psDBDeleteRows(dbh, P2PROCESSEDEXP_TABLE_NAME, where, limit);
         psFree(where)
         if (count < 0) {
-            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2DoneExp");
+            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2ProcessedExp");
             return count;
         }
@@ -11541,5 +11519,5 @@
     return deleted;
 }
-bool p2DoneExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
+bool p2ProcessedExpPrintObjects(FILE *stream, psArray *objects, bool mdcf)
 {
     PS_ASSERT_PTR_NON_NULL(objects, false);
@@ -11547,9 +11525,9 @@
     psMetadata *output = psMetadataAlloc();
     for (long i = 0; i < psArrayLength(objects); i++) {
-        psMetadata *md = p2DoneExpMetadataFromObject(objects->data[i]);
+        psMetadata *md = p2ProcessedExpMetadataFromObject(objects->data[i]);
         if (!psMetadataAddMetadata(
             output,
             PS_LIST_TAIL,
-            P2DONEEXP_TABLE_NAME,
+            P2PROCESSEDEXP_TABLE_NAME,
             PS_META_DUPLICATE_OK,
             NULL,
@@ -11572,12 +11550,12 @@
     return true;
 }
-static void p2DoneImfileRowFree(p2DoneImfileRow *object);
-
-p2DoneImfileRow *p2DoneImfileRowAlloc(const char *exp_id, const char *class_id, const char *uri, const char *recipe, psS32 p1_version, psS32 p2_version)
-{
-    p2DoneImfileRow *object;
-
-    object = psAlloc(sizeof(p2DoneImfileRow));
-    psMemSetDeallocator(object, (psFreeFunc)p2DoneImfileRowFree);
+static void p2ProcessedImfileRowFree(p2ProcessedImfileRow *object);
+
+p2ProcessedImfileRow *p2ProcessedImfileRowAlloc(const char *exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, const char *b1_uri, const char *b2_uri, psS32 p1_version, psS32 p2_version)
+{
+    p2ProcessedImfileRow *object;
+
+    object = psAlloc(sizeof(p2ProcessedImfileRow));
+    psMemSetDeallocator(object, (psFreeFunc)p2ProcessedImfileRowFree);
 
     object->exp_id = psStringCopy(exp_id);
@@ -11585,4 +11563,9 @@
     object->uri = psStringCopy(uri);
     object->recipe = psStringCopy(recipe);
+    object->bg = bg;
+    object->bg_stdev = bg_stdev;
+    object->bg_mean_stdev = bg_mean_stdev;
+    object->b1_uri = psStringCopy(b1_uri);
+    object->b2_uri = psStringCopy(b2_uri);
     object->p1_version = p1_version;
     object->p2_version = p2_version;
@@ -11591,5 +11574,5 @@
 }
 
-static void p2DoneImfileRowFree(p2DoneImfileRow *object)
+static void p2ProcessedImfileRowFree(p2ProcessedImfileRow *object)
 {
     psFree(object->exp_id);
@@ -11597,7 +11580,9 @@
     psFree(object->uri);
     psFree(object->recipe);
-}
-
-bool p2DoneImfileCreateTable(psDB *dbh)
+    psFree(object->b1_uri);
+    psFree(object->b2_uri);
+}
+
+bool p2ProcessedImfileCreateTable(psDB *dbh)
 {
     psMetadata      *md;
@@ -11605,6 +11590,6 @@
 
     md = psMetadataAlloc();
-    if (!psMetadataAdd(md, PS_LIST_TAIL, P2DONEIMFILE_INDEX_NAME, PS_DATA_S32, "AUTO_INCREMENT", 0.0)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item %s", P2DONEIMFILE_INDEX_NAME);
+    if (!psMetadataAdd(md, PS_LIST_TAIL, P2PROCESSEDIMFILE_INDEX_NAME, PS_DATA_S32, "AUTO_INCREMENT", 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item %s", P2PROCESSEDIMFILE_INDEX_NAME);
         psFree(md);
         return false;
@@ -11630,4 +11615,29 @@
         return false;
     }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg", 0, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_stdev", 0, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_mean_stdev", 0, NULL, 0.0)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "b1_uri", 0, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item b1_uri");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "b2_uri", 0, NULL, "64")) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item b2_uri");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p1_version");
@@ -11641,5 +11651,5 @@
     }
 
-    status = psDBCreateTable(dbh, P2DONEIMFILE_TABLE_NAME, md);
+    status = psDBCreateTable(dbh, P2PROCESSEDIMFILE_TABLE_NAME, md);
 
     psFree(md);
@@ -11648,10 +11658,10 @@
 }
 
-bool p2DoneImfileDropTable(psDB *dbh)
-{
-    return psDBDropTable(dbh, P2DONEIMFILE_TABLE_NAME);
-}
-
-bool p2DoneImfileInsert(psDB * dbh, const char *exp_id, const char *class_id, const char *uri, const char *recipe, psS32 p1_version, psS32 p2_version)
+bool p2ProcessedImfileDropTable(psDB *dbh)
+{
+    return psDBDropTable(dbh, P2PROCESSEDIMFILE_TABLE_NAME);
+}
+
+bool p2ProcessedImfileInsert(psDB * dbh, const char *exp_id, const char *class_id, const char *uri, const char *recipe, psF64 bg, psF64 bg_stdev, psF64 bg_mean_stdev, const char *b1_uri, const char *b2_uri, psS32 p1_version, psS32 p2_version)
 {
     psMetadata      *md;
@@ -11679,4 +11689,29 @@
         return false;
     }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg", 0, NULL, bg)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_stdev", 0, NULL, bg_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_mean_stdev", 0, NULL, bg_mean_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "b1_uri", 0, NULL, b1_uri)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item b1_uri");
+        psFree(md);
+        return false;
+    }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "b2_uri", 0, NULL, b2_uri)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item b2_uri");
+        psFree(md);
+        return false;
+    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, p1_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p1_version");
@@ -11690,5 +11725,5 @@
     }
 
-    status = psDBInsertOneRow(dbh, P2DONEIMFILE_TABLE_NAME, md);
+    status = psDBInsertOneRow(dbh, P2PROCESSEDIMFILE_TABLE_NAME, md);
     psFree(md);
 
@@ -11696,11 +11731,11 @@
 }
 
-long long p2DoneImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
+long long p2ProcessedImfileDelete(psDB *dbh, const psMetadata *where, unsigned long long limit)
 {
     long long       deleted = 0;
 
-    long long count = psDBDeleteRows(dbh, P2DONEIMFILE_TABLE_NAME, where, limit);
+    long long count = psDBDeleteRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, where, limit);
     if (count < 0) {
-        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2DoneImfile");
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2ProcessedImfile");
         return count;
 
@@ -11710,5 +11745,5 @@
     return deleted;
 }
-bool p2DoneImfilePop(psDB *dbh, char **exp_id, char **class_id, char **uri, char **recipe, psS32 *p1_version, psS32 *p2_version)
+bool p2ProcessedImfilePop(psDB *dbh, char **exp_id, char **class_id, char **uri, char **recipe, psF64 *bg, psF64 *bg_stdev, psF64 *bg_mean_stdev, char **b1_uri, char **b2_uri, psS32 *p1_version, psS32 *p2_version)
 {
     psArray         *rowSet;
@@ -11719,7 +11754,7 @@
     int             rowID;
 
-    rowSet = psDBSelectRows(dbh, P2DONEIMFILE_TABLE_NAME, NULL, 1);
+    rowSet = psDBSelectRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, NULL, 1);
     if (!rowSet) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2DONEIMFILE_INDEX_NAME);
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2PROCESSEDIMFILE_INDEX_NAME);
         psFree(rowSet);
         return NULL;
@@ -11734,7 +11769,7 @@
     psFree(rowSet);
 
-    rowID = psMetadataLookupS32(&status, row, P2DONEIMFILE_INDEX_NAME);
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2DONEIMFILE_INDEX_NAME);
+    rowID = psMetadataLookupS32(&status, row, P2PROCESSEDIMFILE_INDEX_NAME);
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item %s", P2PROCESSEDIMFILE_INDEX_NAME);
         psFree(row);
         return NULL;
@@ -11742,7 +11777,7 @@
 
     popped = psMetadataAlloc();
-    psMetadataAddS32(popped, PS_LIST_TAIL, P2DONEIMFILE_INDEX_NAME, 0, NULL, rowID);
-
-    deleted = psDBDeleteRows(dbh, P2DONEIMFILE_TABLE_NAME, popped, 0);
+    psMetadataAddS32(popped, PS_LIST_TAIL, P2PROCESSEDIMFILE_INDEX_NAME, 0, NULL, rowID);
+
+    deleted = psDBDeleteRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, popped, 0);
     if (deleted != 1) {
         psError(PS_ERR_UNKNOWN, false, "database failed to delete row");
@@ -11778,4 +11813,34 @@
         return false;
     }
+    *bg = psMetadataLookupF64(&status, row, "bg");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg");
+        psFree(row);
+        return false;
+    }
+    *bg_stdev = psMetadataLookupF64(&status, row, "bg_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_stdev");
+        psFree(row);
+        return false;
+    }
+    *bg_mean_stdev = psMetadataLookupF64(&status, row, "bg_mean_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev");
+        psFree(row);
+        return false;
+    }
+    *b1_uri = psMetadataLookupPtr(&status, row, "b1_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b1_uri");
+        psFree(row);
+        return false;
+    }
+    *b2_uri = psMetadataLookupPtr(&status, row, "b2_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b2_uri");
+        psFree(row);
+        return false;
+    }
     *p1_version = psMetadataLookupS32(&status, row, "p1_version");
     if (!status) {
@@ -11796,13 +11861,13 @@
 }
 
-bool p2DoneImfileInsertObject(psDB *dbh, p2DoneImfileRow *object)
-{
-    return p2DoneImfileInsert(dbh, object->exp_id, object->class_id, object->uri, object->recipe, object->p1_version, object->p2_version);
-}
-
-bool p2DoneImfileInsertObjects(psDB *dbh, psArray *objects)
+bool p2ProcessedImfileInsertObject(psDB *dbh, p2ProcessedImfileRow *object)
+{
+    return p2ProcessedImfileInsert(dbh, object->exp_id, object->class_id, object->uri, object->recipe, object->bg, object->bg_stdev, object->bg_mean_stdev, object->b1_uri, object->b2_uri, object->p1_version, object->p2_version);
+}
+
+bool p2ProcessedImfileInsertObjects(psDB *dbh, psArray *objects)
 {
     for (long i = 0; i < psArrayLength(objects); i++) {
-        if (!p2DoneImfileInsertObject(dbh, objects->data[i])) {
+        if (!p2ProcessedImfileInsertObject(dbh, objects->data[i])) {
             return false;
         }
@@ -11812,5 +11877,5 @@
 }
 
-p2DoneImfileRow *p2DoneImfilePopObject(psDB *dbh)
+p2ProcessedImfileRow *p2ProcessedImfilePopObject(psDB *dbh)
 {
     char            exp_id[256];
@@ -11818,22 +11883,27 @@
     char            uri[256];
     char            recipe[256];
+    psF64           bg;
+    psF64           bg_stdev;
+    psF64           bg_mean_stdev;
+    char            b1_uri[256];
+    char            b2_uri[256];
     psS32           p1_version;
     psS32           p2_version;
 
-    if (!p2DoneImfilePop(dbh, (char **)&exp_id, (char **)&class_id, (char **)&uri, (char **)&recipe, &p1_version, &p2_version)) {
+    if (!p2ProcessedImfilePop(dbh, (char **)&exp_id, (char **)&class_id, (char **)&uri, (char **)&recipe, &bg, &bg_stdev, &bg_mean_stdev, (char **)&b1_uri, (char **)&b2_uri, &p1_version, &p2_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to pop a database row");
         return NULL;
     }
 
-    return p2DoneImfileRowAlloc(exp_id, class_id, uri, recipe, p1_version, p2_version);
-}
-
-bool p2DoneImfileInsertFits(psDB *dbh, const psFits *fits)
+    return p2ProcessedImfileRowAlloc(exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, b1_uri, b2_uri, p1_version, p2_version);
+}
+
+bool p2ProcessedImfileInsertFits(psDB *dbh, const psFits *fits)
 {
     psArray         *rowSet;
 
-    // move to (the first?) extension named  P2DONEIMFILE_TABLE_NAME
-    if (!psFitsMoveExtName(fits, P2DONEIMFILE_TABLE_NAME)) {
-        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P2DONEIMFILE_TABLE_NAME);
+    // move to (the first?) extension named  P2PROCESSEDIMFILE_TABLE_NAME
+    if (!psFitsMoveExtName(fits, P2PROCESSEDIMFILE_TABLE_NAME)) {
+        psError(PS_ERR_UNKNOWN, true, "failed to find FITS extension %s", P2PROCESSEDIMFILE_TABLE_NAME);
         return false;
     }
@@ -11853,5 +11923,5 @@
     }
 
-    if (!psDBInsertRows(dbh, P2DONEIMFILE_TABLE_NAME, rowSet)) {
+    if (!psDBInsertRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, rowSet)) {
         psError(PS_ERR_UNKNOWN, false, "databse insert failed");
         psFree(rowSet);
@@ -11864,9 +11934,9 @@
 }
 
-bool p2DoneImfilePopFits(psDB *dbh, psFits *fits, unsigned long long limit)
+bool p2ProcessedImfilePopFits(psDB *dbh, psFits *fits, unsigned long long limit)
 {
     char            query[MAX_STRING_LENGTH];
 
-    if (!p2DoneImfileSelectRowsFits(dbh, fits, NULL, limit)) {
+    if (!p2ProcessedImfileSelectRowsFits(dbh, fits, NULL, limit)) {
         psError(PS_ERR_UNKNOWN, true, "database error or table is empty");
         return false;
@@ -11876,6 +11946,6 @@
     if (snprintf(query, MAX_STRING_LENGTH,
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
-                P2DONEIMFILE_TABLE_NAME, P2DONEIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+                P2PROCESSEDIMFILE_TABLE_NAME, P2PROCESSEDIMFILE_INDEX_NAME, limit) < 0) {
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -11889,10 +11959,10 @@
 }
 
-bool p2DoneImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
+bool p2ProcessedImfileSelectRowsFits(psDB *dbh, psFits *fits, const psMetadata *where, unsigned long long limit)
 {
     psArray         *rowSet;
     psU64           i;
 
-    rowSet = psDBSelectRows(dbh, P2DONEIMFILE_TABLE_NAME, where, limit);
+    rowSet = psDBSelectRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, where, limit);
     if (!rowSet) {
         return false;
@@ -11901,6 +11971,6 @@
     // strip index column
     for (i = 0; i < rowSet->n; i++) {
-        if (!psMetadataRemove((psMetadata *)rowSet->data[i], 0, P2DONEIMFILE_INDEX_NAME)) {
-            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2DONEIMFILE_INDEX_NAME);
+        if (!psMetadataRemove((psMetadata *)rowSet->data[i], 0, P2PROCESSEDIMFILE_INDEX_NAME)) {
+            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2PROCESSEDIMFILE_INDEX_NAME);
             psFree(rowSet);
             return false;
@@ -11909,5 +11979,5 @@
 
     // output to fits
-    if (!psFitsWriteTable(fits, NULL, rowSet, P2DONEIMFILE_TABLE_NAME)) {
+    if (!psFitsWriteTable(fits, NULL, rowSet, P2PROCESSEDIMFILE_TABLE_NAME)) {
         psError(PS_ERR_UNKNOWN, false, "FITS table write failed");
         psFree(rowSet);
@@ -11920,5 +11990,5 @@
 }
 
-psMetadata *p2DoneImfileMetadataFromObject(const p2DoneImfileRow *object)
+psMetadata *p2ProcessedImfileMetadataFromObject(const p2ProcessedImfileRow *object)
 {
     psMetadata      *md;
@@ -11945,4 +12015,29 @@
         return NULL;
     }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg", 0, NULL, object->bg)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg");
+        psFree(md);
+        return NULL;
+    }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_stdev", 0, NULL, object->bg_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_stdev");
+        psFree(md);
+        return NULL;
+    }
+    if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_mean_stdev", 0, NULL, object->bg_mean_stdev)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item bg_mean_stdev");
+        psFree(md);
+        return NULL;
+    }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "b1_uri", 0, NULL, object->b1_uri)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item b1_uri");
+        psFree(md);
+        return NULL;
+    }
+    if (!psMetadataAddStr(md, PS_LIST_TAIL, "b2_uri", 0, NULL, object->b2_uri)) {
+        psError(PS_ERR_UNKNOWN, false, "failed to add item b2_uri");
+        psFree(md);
+        return NULL;
+    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, object->p1_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p1_version");
@@ -11959,5 +12054,5 @@
 }
 
-p2DoneImfileRow *p2DoneImfileObjectFromMetadata(psMetadata *md)
+p2ProcessedImfileRow *p2ProcessedImfileObjectFromMetadata(psMetadata *md)
 {
     bool            status;
@@ -11966,4 +12061,9 @@
     char            *uri;
     char            *recipe;
+    psF64           bg;
+    psF64           bg_stdev;
+    psF64           bg_mean_stdev;
+    char            *b1_uri;
+    char            *b2_uri;
     psS32           p1_version;
     psS32           p2_version;
@@ -11989,4 +12089,29 @@
         return false;
     }
+    bg = psMetadataLookupF64(&status, md, "bg");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg");
+        return false;
+    }
+    bg_stdev = psMetadataLookupF64(&status, md, "bg_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_stdev");
+        return false;
+    }
+    bg_mean_stdev = psMetadataLookupF64(&status, md, "bg_mean_stdev");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item bg_mean_stdev");
+        return false;
+    }
+    b1_uri = psMetadataLookupPtr(&status, md, "b1_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b1_uri");
+        return false;
+    }
+    b2_uri = psMetadataLookupPtr(&status, md, "b2_uri");
+    if (!status) {
+        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item b2_uri");
+        return false;
+    }
     p1_version = psMetadataLookupS32(&status, md, "p1_version");
     if (!status) {
@@ -12000,7 +12125,7 @@
     }
 
-    return p2DoneImfileRowAlloc(exp_id, class_id, uri, recipe, p1_version, p2_version);
-}
-psArray *p2DoneImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
+    return p2ProcessedImfileRowAlloc(exp_id, class_id, uri, recipe, bg, bg_stdev, bg_mean_stdev, b1_uri, b2_uri, p1_version, p2_version);
+}
+psArray *p2ProcessedImfileSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
 {
     psArray         *rowSet;
@@ -12008,5 +12133,5 @@
     psU64           i;
 
-    rowSet = psDBSelectRows(dbh, P2DONEIMFILE_TABLE_NAME, where, limit);
+    rowSet = psDBSelectRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, where, limit);
     if (!rowSet) {
         return NULL;
@@ -12015,6 +12140,6 @@
     // strip index column
     for (i = 0; i < rowSet->n; i++) {
-        if (!psMetadataRemove((psMetadata *)(rowSet->data[i]), 0, P2DONEIMFILE_INDEX_NAME)) {
-            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2DONEIMFILE_INDEX_NAME);
+        if (!psMetadataRemove((psMetadata *)(rowSet->data[i]), 0, P2PROCESSEDIMFILE_INDEX_NAME)) {
+            psError(PS_ERR_UNKNOWN, true, "failed to remove item %s", P2PROCESSEDIMFILE_INDEX_NAME);
             psFree(rowSet);
             return false;
@@ -12028,5 +12153,5 @@
 
     for (i = 0; i < rowSet->n; i++) {
-        p2DoneImfileRow *object = p2DoneImfileObjectFromMetadata(rowSet->data[i]);
+        p2ProcessedImfileRow *object = p2ProcessedImfileObjectFromMetadata(rowSet->data[i]);
         psArrayAdd(returnSet, 0, object);
         psFree(object);
@@ -12037,11 +12162,11 @@
     return returnSet;
 }
-bool p2DoneImfileDeleteObject(psDB *dbh, const p2DoneImfileRow *object)
-{
-    psMetadata *where = p2DoneImfileMetadataFromObject(object);
-    long long count = psDBDeleteRows(dbh, P2DONEIMFILE_TABLE_NAME, where, 0);
+bool p2ProcessedImfileDeleteObject(psDB *dbh, const p2ProcessedImfileRow *object)
+{
+    psMetadata *where = p2ProcessedImfileMetadataFromObject(object);
+    long long count = psDBDeleteRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, where, 0);
     psFree(where)
     if (count < 0) {
-        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2DoneImfile");
+        psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2ProcessedImfile");
         return false;
     }
@@ -12049,21 +12174,21 @@
         // XXX should this be a psAbort() instead?  It is possible that
         // having an object match multiple rows was by design.
-        psError(PS_ERR_UNKNOWN, true, "p2DoneImfileRow object matched more then one row.  Check your database schema");
-        return false;
-    }
-
-    return true;
-}
-long long p2DoneImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
+        psError(PS_ERR_UNKNOWN, true, "p2ProcessedImfileRow object matched more then one row.  Check your database schema");
+        return false;
+    }
+
+    return true;
+}
+long long p2ProcessedImfileDeleteRowObjects(psDB *dbh, const psArray *objects, unsigned long long limit)
 {
     long long       deleted = 0;
 
     for (long long i = 0; i < objects->n; i++) {
-        p2DoneImfileRow *object = objects->data[i];
-        psMetadata *where = p2DoneImfileMetadataFromObject(object);
-        long long count = psDBDeleteRows(dbh, P2DONEIMFILE_TABLE_NAME, where, limit);
+        p2ProcessedImfileRow *object = objects->data[i];
+        psMetadata *where = p2ProcessedImfileMetadataFromObject(object);
+        long long count = psDBDeleteRows(dbh, P2PROCESSEDIMFILE_TABLE_NAME, where, limit);
         psFree(where)
         if (count < 0) {
-            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2DoneImfile");
+            psError(PS_ERR_UNKNOWN, true, "failed to delete row from p2ProcessedImfile");
             return count;
         }
@@ -12074,5 +12199,5 @@
     return deleted;
 }
-bool p2DoneImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
+bool p2ProcessedImfilePrintObjects(FILE *stream, psArray *objects, bool mdcf)
 {
     PS_ASSERT_PTR_NON_NULL(objects, false);
@@ -12080,9 +12205,9 @@
     psMetadata *output = psMetadataAlloc();
     for (long i = 0; i < psArrayLength(objects); i++) {
-        psMetadata *md = p2DoneImfileMetadataFromObject(objects->data[i]);
+        psMetadata *md = p2ProcessedImfileMetadataFromObject(objects->data[i]);
         if (!psMetadataAddMetadata(
             output,
             PS_LIST_TAIL,
-            P2DONEIMFILE_TABLE_NAME,
+            P2PROCESSEDIMFILE_TABLE_NAME,
             PS_META_DUPLICATE_OK,
             NULL,
@@ -12107,5 +12232,5 @@
 static void p3PendingExpRowFree(p3PendingExpRow *object);
 
-p3PendingExpRow *p3PendingExpRowAlloc(const char *exp_id, const char *recipe, psS32 p2_version, psS32 p3_version)
+p3PendingExpRow *p3PendingExpRowAlloc(const char *exp_id, psS32 p2_version, psS32 p3_version)
 {
     p3PendingExpRow *object;
@@ -12115,5 +12240,4 @@
 
     object->exp_id = psStringCopy(exp_id);
-    object->recipe = psStringCopy(recipe);
     object->p2_version = p2_version;
     object->p3_version = p3_version;
@@ -12125,5 +12249,4 @@
 {
     psFree(object->exp_id);
-    psFree(object->recipe);
 }
 
@@ -12144,9 +12267,4 @@
         return false;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, "64")) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
-        psFree(md);
-        return false;
-    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, 0)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p2_version");
@@ -12172,5 +12290,5 @@
 }
 
-bool p3PendingExpInsert(psDB * dbh, const char *exp_id, const char *recipe, psS32 p2_version, psS32 p3_version)
+bool p3PendingExpInsert(psDB * dbh, const char *exp_id, psS32 p2_version, psS32 p3_version)
 {
     psMetadata      *md;
@@ -12180,9 +12298,4 @@
     if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, exp_id)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item exp_id");
-        psFree(md);
-        return false;
-    }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, recipe)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
         psFree(md);
         return false;
@@ -12219,5 +12332,5 @@
     return deleted;
 }
-bool p3PendingExpPop(psDB *dbh, char **exp_id, char **recipe, psS32 *p2_version, psS32 *p3_version)
+bool p3PendingExpPop(psDB *dbh, char **exp_id, psS32 *p2_version, psS32 *p3_version)
 {
     psArray         *rowSet;
@@ -12269,10 +12382,4 @@
         return false;
     }
-    *recipe = psMetadataLookupPtr(&status, row, "recipe");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe");
-        psFree(row);
-        return false;
-    }
     *p2_version = psMetadataLookupS32(&status, row, "p2_version");
     if (!status) {
@@ -12295,5 +12402,5 @@
 bool p3PendingExpInsertObject(psDB *dbh, p3PendingExpRow *object)
 {
-    return p3PendingExpInsert(dbh, object->exp_id, object->recipe, object->p2_version, object->p3_version);
+    return p3PendingExpInsert(dbh, object->exp_id, object->p2_version, object->p3_version);
 }
 
@@ -12312,14 +12419,13 @@
 {
     char            exp_id[256];
-    char            recipe[256];
     psS32           p2_version;
     psS32           p3_version;
 
-    if (!p3PendingExpPop(dbh, (char **)&exp_id, (char **)&recipe, &p2_version, &p3_version)) {
+    if (!p3PendingExpPop(dbh, (char **)&exp_id, &p2_version, &p3_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to pop a database row");
         return NULL;
     }
 
-    return p3PendingExpRowAlloc(exp_id, recipe, p2_version, p3_version);
+    return p3PendingExpRowAlloc(exp_id, p2_version, p3_version);
 }
 
@@ -12372,5 +12478,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 P3PENDINGEXP_TABLE_NAME, P3PENDINGEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -12425,9 +12531,4 @@
         return NULL;
     }
-    if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, object->recipe)) {
-        psError(PS_ERR_UNKNOWN, false, "failed to add item recipe");
-        psFree(md);
-        return NULL;
-    }
     if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, object->p2_version)) {
         psError(PS_ERR_UNKNOWN, false, "failed to add item p2_version");
@@ -12448,5 +12549,4 @@
     bool            status;
     char            *exp_id;
-    char            *recipe;
     psS32           p2_version;
     psS32           p3_version;
@@ -12457,9 +12557,4 @@
         return false;
     }
-    recipe = psMetadataLookupPtr(&status, md, "recipe");
-    if (!status) {
-        psError(PS_ERR_UNKNOWN, true, "failed to lookup value for item recipe");
-        return false;
-    }
     p2_version = psMetadataLookupS32(&status, md, "p2_version");
     if (!status) {
@@ -12473,5 +12568,5 @@
     }
 
-    return p3PendingExpRowAlloc(exp_id, recipe, p2_version, p3_version);
+    return p3PendingExpRowAlloc(exp_id, p2_version, p3_version);
 }
 psArray *p3PendingExpSelectRowObjects(psDB *dbh, const psMetadata *where, unsigned long long limit)
@@ -12808,5 +12903,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETRUN_TABLE_NAME, DETRUN_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -13258,5 +13353,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETINPUTEXP_TABLE_NAME, DETINPUTEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -13805,5 +13900,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETPROCESSEDIMFILE_TABLE_NAME, DETPROCESSEDIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -14413,5 +14508,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETSTACKEDIMFILE_TABLE_NAME, DETSTACKEDIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -14940,5 +15035,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETNORMALIZEDSTATIMFILE_TABLE_NAME, DETNORMALIZEDSTATIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -15413,5 +15508,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETNORMALIZEDIMFILE_TABLE_NAME, DETNORMALIZEDIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -15867,5 +15962,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETMASTERFRAME_TABLE_NAME, DETMASTERFRAME_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -16330,5 +16425,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETMASTERIMFILE_TABLE_NAME, DETMASTERIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -16933,5 +17028,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETRESIDIMFILE_TABLE_NAME, DETRESIDIMFILE_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -17593,5 +17688,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETRESIDEXP_TABLE_NAME, DETRESIDEXP_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
@@ -18166,5 +18261,5 @@
                 "DELETE FROM %s ORDER BY %s DESC LIMIT %lld",
                 DETRUNSUMMARY_TABLE_NAME, DETRUNSUMMARY_INDEX_NAME, limit) < 0) {
-        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %s bytes", MAX_STRING_LENGTH);
+        psError(PS_ERR_UNKNOWN, true, "query value attempted to exceed %d bytes", MAX_STRING_LENGTH);
         return false;
     }
