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;
     }
Index: trunk/ippdb/src/ippdb.h
===================================================================
--- trunk/ippdb/src/ippdb.h	(revision 8543)
+++ trunk/ippdb/src/ippdb.h	(revision 8665)
@@ -1,2 +1,10 @@
+/*
+ *
+ * This file was generated by glueforge 0.24
+ *
+ * Do NOT directly edit this file.
+ *
+ */
+
 #ifndef IPPDB_H
 #define IPPDB_H 1
@@ -4666,43 +4674,41 @@
     bool            mdcf                ///< format as mdconfig or simple
 );
-/** p2DoneExpRow data structure
- *
- * Structure for representing a single row of p2DoneExp table data.
+/** p2ProcessedExpRow data structure
+ *
+ * Structure for representing a single row of p2ProcessedExp table data.
  */
 
 typedef struct {
     char            *exp_id;
-    char            *recipe;
     psS32           p1_version;
     psS32           p2_version;
-} p2DoneExpRow;
-
-/** Creates a new p2DoneExpRow object
- *
- *  @return A new p2DoneExpRow object or NULL on failure.
- */
-
-p2DoneExpRow *p2DoneExpRowAlloc(
+} p2ProcessedExpRow;
+
+/** Creates a new p2ProcessedExpRow object
+ *
+ *  @return A new p2ProcessedExpRow object or NULL on failure.
+ */
+
+p2ProcessedExpRow *p2ProcessedExpRowAlloc(
     const char      *exp_id,
-    const char      *recipe,
     psS32           p1_version,
     psS32           p2_version
 );
 
-/** Creates a new p2DoneExp table
- *
- * @return true on success
- */
-
-bool p2DoneExpCreateTable(
-    psDB            *dbh                ///< Database handle
-);
-
-/** Deletes a p2DoneExp table
- *
- * @return true on success
- */
-
-bool p2DoneExpDropTable(
+/** Creates a new p2ProcessedExp table
+ *
+ * @return true on success
+ */
+
+bool p2ProcessedExpCreateTable(
+    psDB            *dbh                ///< Database handle
+);
+
+/** Deletes a p2ProcessedExp table
+ *
+ * @return true on success
+ */
+
+bool p2ProcessedExpDropTable(
     psDB            *dbh                ///< Database handle
 );
@@ -4715,8 +4721,7 @@
  */
 
-bool p2DoneExpInsert(
+bool p2ProcessedExpInsert(
     psDB            *dbh,               ///< Database handle
     const char      *exp_id,
-    const char      *recipe,
     psS32           p1_version,
     psS32           p2_version
@@ -4728,5 +4733,5 @@
  */
 
-long long p2DoneExpDelete(
+long long p2ProcessedExpDelete(
     psDB            *dbh,               ///< Database handle
     const psMetadata *where,            ///< Row match criteria
@@ -4739,13 +4744,12 @@
  */
 
-bool p2DoneExpPop(
+bool p2ProcessedExpPop(
     psDB            *dbh,               ///< Database handle
     char            **exp_id,
-    char            **recipe,
     psS32           *p1_version,
     psS32           *p2_version
 );
 
-/** Insert a single p2DoneExpRow object into a table
+/** Insert a single p2ProcessedExpRow object into a table
  *
  * This function constructs and inserts a single row based on it's parameters.
@@ -4754,10 +4758,10 @@
  */
 
-bool p2DoneExpInsertObject(
-    psDB            *dbh,               ///< Database handle
-    p2DoneExpRow    *object             ///< p2DoneExpRow object
-);
-
-/** Insert an array of p2DoneExpRow object into a table
+bool p2ProcessedExpInsertObject(
+    psDB            *dbh,               ///< Database handle
+    p2ProcessedExpRow *object             ///< p2ProcessedExpRow object
+);
+
+/** Insert an array of p2ProcessedExpRow object into a table
  *
  * This function constructs and inserts multiple rows based on it's parameters.
@@ -4766,19 +4770,19 @@
  */
 
-bool p2DoneExpInsertObjects(
-    psDB            *dbh,               ///< Database handle
-    psArray         *objects            ///< array of p2DoneExpRow objects
+bool p2ProcessedExpInsertObjects(
+    psDB            *dbh,               ///< Database handle
+    psArray         *objects            ///< array of p2ProcessedExpRow objects
 );
 
 /** Removes the last row from the database and returns it
  *
- * @return A new p2DoneExpRow on success or NULL on failure.
- */
-
-p2DoneExpRow *p2DoneExpPopObject(
-    psDB            *dbh                ///< Database handle
-);
-
-/** Insert data from a binary FITS table p2DoneExpRow into the database
+ * @return A new p2ProcessedExpRow on success or NULL on failure.
+ */
+
+p2ProcessedExpRow *p2ProcessedExpPopObject(
+    psDB            *dbh                ///< Database handle
+);
+
+/** Insert data from a binary FITS table p2ProcessedExpRow into the database
  *
  * This function expects a psFits object with a FITS table as the first
@@ -4790,5 +4794,5 @@
  */
 
-bool p2DoneExpInsertFits(
+bool p2ProcessedExpInsertFits(
     psDB            *dbh,               ///< Database handle
     const psFits    *fits               ///< psFits object
@@ -4803,5 +4807,5 @@
  */
 
-bool p2DoneExpPopFits(
+bool p2ProcessedExpPopFits(
     psDB            *dbh,               ///< Database handle
     psFits          *fits,              ///< psFits object
@@ -4819,5 +4823,5 @@
  */
 
-bool p2DoneExpSelectRowsFits(
+bool p2ProcessedExpSelectRowsFits(
     psDB            *dbh,               ///< Database handle
     psFits          *fits,              ///< psFits object
@@ -4826,22 +4830,22 @@
 );
 
-/** Convert a p2DoneExpRow into an equivalent psMetadata
+/** Convert a p2ProcessedExpRow into an equivalent psMetadata
  *
  * @return A psMetadata pointer or NULL on error
  */
 
-psMetadata *p2DoneExpMetadataFromObject(
-    const p2DoneExpRow *object             ///< fooRow to convert into a psMetadata
+psMetadata *p2ProcessedExpMetadataFromObject(
+    const p2ProcessedExpRow *object             ///< fooRow to convert into a psMetadata
 );
 
 /** Convert a psMetadata into an equivalent fooRow
  *
- * @return A p2DoneExpRow pointer or NULL on error
- */
-
-p2DoneExpRow *p2DoneExpObjectFromMetadata(
+ * @return A p2ProcessedExpRow pointer or NULL on error
+ */
+
+p2ProcessedExpRow *p2ProcessedExpObjectFromMetadata(
     psMetadata      *md                 ///< psMetadata to convert into a fooRow
 );
-/** Selects up to limit rows from the database and returns as p2DoneExpRow objects in a psArray
+/** Selects up to limit rows from the database and returns as p2ProcessedExpRow objects in a psArray
  *
  *  See psDBSelectRows() for documentation on the format of where.
@@ -4850,10 +4854,10 @@
  */
 
-psArray *p2DoneExpSelectRowObjects(
-    psDB            *dbh,               ///< Database handle
-    const psMetadata *where,            ///< Row match criteria
-    unsigned long long limit            ///< Maximum number of elements to return
-);
-/** Deletes a row from the database coresponding to an p2DoneExp
+psArray *p2ProcessedExpSelectRowObjects(
+    psDB            *dbh,               ///< Database handle
+    const psMetadata *where,            ///< Row match criteria
+    unsigned long long limit            ///< Maximum number of elements to return
+);
+/** Deletes a row from the database coresponding to an p2ProcessedExp
  *
  *  Note that a 'where' search psMetadata is constructed from each object and
@@ -4863,7 +4867,7 @@
  */
 
-bool p2DoneExpDeleteObject(
-    psDB            *dbh,               ///< Database handle
-    const p2DoneExpRow *object    ///< Object to delete
+bool p2ProcessedExpDeleteObject(
+    psDB            *dbh,               ///< Database handle
+    const p2ProcessedExpRow *object    ///< Object to delete
 );
 /** Deletes up to limit rows from the database and returns the number of rows actually deleted. 
@@ -4875,10 +4879,10 @@
  */
 
-long long p2DoneExpDeleteRowObjects(
+long long p2ProcessedExpDeleteRowObjects(
     psDB            *dbh,               ///< Database handle
     const psArray   *objects,           ///< Array of objects to delete
     unsigned long long limit            ///< Maximum number of elements to delete 
 );
-/** Formats and prints an array of p2DoneExpRow objects
+/** Formats and prints an array of p2ProcessedExpRow objects
  *
  * When mdcf is set the formated output is in psMetadataConfig
@@ -4888,12 +4892,12 @@
  */
 
-bool p2DoneExpPrintObjects(
+bool p2ProcessedExpPrintObjects(
     FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p2DoneExpRow objects
+    psArray         *objects,           ///< An array of p2ProcessedExpRow objects
     bool            mdcf                ///< format as mdconfig or simple
 );
-/** p2DoneImfileRow data structure
- *
- * Structure for representing a single row of p2DoneImfile table data.
+/** p2ProcessedImfileRow data structure
+ *
+ * Structure for representing a single row of p2ProcessedImfile table data.
  */
 
@@ -4903,37 +4907,47 @@
     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;
-} p2DoneImfileRow;
-
-/** Creates a new p2DoneImfileRow object
- *
- *  @return A new p2DoneImfileRow object or NULL on failure.
- */
-
-p2DoneImfileRow *p2DoneImfileRowAlloc(
+} p2ProcessedImfileRow;
+
+/** Creates a new p2ProcessedImfileRow object
+ *
+ *  @return A new p2ProcessedImfileRow object or NULL on failure.
+ */
+
+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
 );
 
-/** Creates a new p2DoneImfile table
- *
- * @return true on success
- */
-
-bool p2DoneImfileCreateTable(
-    psDB            *dbh                ///< Database handle
-);
-
-/** Deletes a p2DoneImfile table
- *
- * @return true on success
- */
-
-bool p2DoneImfileDropTable(
+/** Creates a new p2ProcessedImfile table
+ *
+ * @return true on success
+ */
+
+bool p2ProcessedImfileCreateTable(
+    psDB            *dbh                ///< Database handle
+);
+
+/** Deletes a p2ProcessedImfile table
+ *
+ * @return true on success
+ */
+
+bool p2ProcessedImfileDropTable(
     psDB            *dbh                ///< Database handle
 );
@@ -4946,5 +4960,5 @@
  */
 
-bool p2DoneImfileInsert(
+bool p2ProcessedImfileInsert(
     psDB            *dbh,               ///< Database handle
     const char      *exp_id,
@@ -4952,4 +4966,9 @@
     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
@@ -4961,5 +4980,5 @@
  */
 
-long long p2DoneImfileDelete(
+long long p2ProcessedImfileDelete(
     psDB            *dbh,               ///< Database handle
     const psMetadata *where,            ///< Row match criteria
@@ -4972,5 +4991,5 @@
  */
 
-bool p2DoneImfilePop(
+bool p2ProcessedImfilePop(
     psDB            *dbh,               ///< Database handle
     char            **exp_id,
@@ -4978,9 +4997,14 @@
     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
 );
 
-/** Insert a single p2DoneImfileRow object into a table
+/** Insert a single p2ProcessedImfileRow object into a table
  *
  * This function constructs and inserts a single row based on it's parameters.
@@ -4989,10 +5013,10 @@
  */
 
-bool p2DoneImfileInsertObject(
-    psDB            *dbh,               ///< Database handle
-    p2DoneImfileRow *object             ///< p2DoneImfileRow object
-);
-
-/** Insert an array of p2DoneImfileRow object into a table
+bool p2ProcessedImfileInsertObject(
+    psDB            *dbh,               ///< Database handle
+    p2ProcessedImfileRow *object             ///< p2ProcessedImfileRow object
+);
+
+/** Insert an array of p2ProcessedImfileRow object into a table
  *
  * This function constructs and inserts multiple rows based on it's parameters.
@@ -5001,19 +5025,19 @@
  */
 
-bool p2DoneImfileInsertObjects(
-    psDB            *dbh,               ///< Database handle
-    psArray         *objects            ///< array of p2DoneImfileRow objects
+bool p2ProcessedImfileInsertObjects(
+    psDB            *dbh,               ///< Database handle
+    psArray         *objects            ///< array of p2ProcessedImfileRow objects
 );
 
 /** Removes the last row from the database and returns it
  *
- * @return A new p2DoneImfileRow on success or NULL on failure.
- */
-
-p2DoneImfileRow *p2DoneImfilePopObject(
-    psDB            *dbh                ///< Database handle
-);
-
-/** Insert data from a binary FITS table p2DoneImfileRow into the database
+ * @return A new p2ProcessedImfileRow on success or NULL on failure.
+ */
+
+p2ProcessedImfileRow *p2ProcessedImfilePopObject(
+    psDB            *dbh                ///< Database handle
+);
+
+/** Insert data from a binary FITS table p2ProcessedImfileRow into the database
  *
  * This function expects a psFits object with a FITS table as the first
@@ -5025,5 +5049,5 @@
  */
 
-bool p2DoneImfileInsertFits(
+bool p2ProcessedImfileInsertFits(
     psDB            *dbh,               ///< Database handle
     const psFits    *fits               ///< psFits object
@@ -5038,5 +5062,5 @@
  */
 
-bool p2DoneImfilePopFits(
+bool p2ProcessedImfilePopFits(
     psDB            *dbh,               ///< Database handle
     psFits          *fits,              ///< psFits object
@@ -5054,5 +5078,5 @@
  */
 
-bool p2DoneImfileSelectRowsFits(
+bool p2ProcessedImfileSelectRowsFits(
     psDB            *dbh,               ///< Database handle
     psFits          *fits,              ///< psFits object
@@ -5061,22 +5085,22 @@
 );
 
-/** Convert a p2DoneImfileRow into an equivalent psMetadata
+/** Convert a p2ProcessedImfileRow into an equivalent psMetadata
  *
  * @return A psMetadata pointer or NULL on error
  */
 
-psMetadata *p2DoneImfileMetadataFromObject(
-    const p2DoneImfileRow *object             ///< fooRow to convert into a psMetadata
+psMetadata *p2ProcessedImfileMetadataFromObject(
+    const p2ProcessedImfileRow *object             ///< fooRow to convert into a psMetadata
 );
 
 /** Convert a psMetadata into an equivalent fooRow
  *
- * @return A p2DoneImfileRow pointer or NULL on error
- */
-
-p2DoneImfileRow *p2DoneImfileObjectFromMetadata(
+ * @return A p2ProcessedImfileRow pointer or NULL on error
+ */
+
+p2ProcessedImfileRow *p2ProcessedImfileObjectFromMetadata(
     psMetadata      *md                 ///< psMetadata to convert into a fooRow
 );
-/** Selects up to limit rows from the database and returns as p2DoneImfileRow objects in a psArray
+/** Selects up to limit rows from the database and returns as p2ProcessedImfileRow objects in a psArray
  *
  *  See psDBSelectRows() for documentation on the format of where.
@@ -5085,10 +5109,10 @@
  */
 
-psArray *p2DoneImfileSelectRowObjects(
-    psDB            *dbh,               ///< Database handle
-    const psMetadata *where,            ///< Row match criteria
-    unsigned long long limit            ///< Maximum number of elements to return
-);
-/** Deletes a row from the database coresponding to an p2DoneImfile
+psArray *p2ProcessedImfileSelectRowObjects(
+    psDB            *dbh,               ///< Database handle
+    const psMetadata *where,            ///< Row match criteria
+    unsigned long long limit            ///< Maximum number of elements to return
+);
+/** Deletes a row from the database coresponding to an p2ProcessedImfile
  *
  *  Note that a 'where' search psMetadata is constructed from each object and
@@ -5098,7 +5122,7 @@
  */
 
-bool p2DoneImfileDeleteObject(
-    psDB            *dbh,               ///< Database handle
-    const p2DoneImfileRow *object    ///< Object to delete
+bool p2ProcessedImfileDeleteObject(
+    psDB            *dbh,               ///< Database handle
+    const p2ProcessedImfileRow *object    ///< Object to delete
 );
 /** Deletes up to limit rows from the database and returns the number of rows actually deleted. 
@@ -5110,10 +5134,10 @@
  */
 
-long long p2DoneImfileDeleteRowObjects(
+long long p2ProcessedImfileDeleteRowObjects(
     psDB            *dbh,               ///< Database handle
     const psArray   *objects,           ///< Array of objects to delete
     unsigned long long limit            ///< Maximum number of elements to delete 
 );
-/** Formats and prints an array of p2DoneImfileRow objects
+/** Formats and prints an array of p2ProcessedImfileRow objects
  *
  * When mdcf is set the formated output is in psMetadataConfig
@@ -5123,7 +5147,7 @@
  */
 
-bool p2DoneImfilePrintObjects(
+bool p2ProcessedImfilePrintObjects(
     FILE            *stream,            ///< a stream
-    psArray         *objects,           ///< An array of p2DoneImfileRow objects
+    psArray         *objects,           ///< An array of p2ProcessedImfileRow objects
     bool            mdcf                ///< format as mdconfig or simple
 );
@@ -5135,5 +5159,4 @@
 typedef struct {
     char            *exp_id;
-    char            *recipe;
     psS32           p2_version;
     psS32           p3_version;
@@ -5147,5 +5170,4 @@
 p3PendingExpRow *p3PendingExpRowAlloc(
     const char      *exp_id,
-    const char      *recipe,
     psS32           p2_version,
     psS32           p3_version
@@ -5180,5 +5202,4 @@
     psDB            *dbh,               ///< Database handle
     const char      *exp_id,
-    const char      *recipe,
     psS32           p2_version,
     psS32           p3_version
@@ -5204,5 +5225,4 @@
     psDB            *dbh,               ///< Database handle
     char            **exp_id,
-    char            **recipe,
     psS32           *p2_version,
     psS32           *p3_version
