Index: /trunk/ippdb/Makefile.am
===================================================================
--- /trunk/ippdb/Makefile.am	(revision 8664)
+++ /trunk/ippdb/Makefile.am	(revision 8665)
@@ -29,6 +29,6 @@
     $(top_builddir)/docs/man/man3/p2PendingExpRow.3 \
     $(top_builddir)/docs/man/man3/p2PendingImfileRow.3 \
-    $(top_builddir)/docs/man/man3/p2DoneExpRow.3 \
-    $(top_builddir)/docs/man/man3/p2DoneImfileRow.3 \
+    $(top_builddir)/docs/man/man3/p2ProcessedExpRow.3 \
+    $(top_builddir)/docs/man/man3/p2ProcessedImfileRow.3 \
     $(top_builddir)/docs/man/man3/p3PendingExpRow.3 \
     $(top_builddir)/docs/man/man3/detRunRow.3 \
@@ -45,5 +45,5 @@
 
 
-docs/man/man3/ippdb.3 docs/man/man3/weatherRow.3 docs/man/man3/skyp_transparencyRow.3 docs/man/man3/skyp_absorptionRow.3 docs/man/man3/skyp_emissionRow.3 docs/man/man3/dimmRow.3 docs/man/man3/skyp_irRow.3 docs/man/man3/domeRow.3 docs/man/man3/telescopeRow.3 docs/man/man3/summitExpRow.3 docs/man/man3/pzPendingExpRow.3 docs/man/man3/pzPendingImfileRow.3 docs/man/man3/newExpRow.3 docs/man/man3/newImfileRow.3 docs/man/man3/rawDetrendExpRow.3 docs/man/man3/rawScienceExpRow.3 docs/man/man3/rawImfileRow.3 docs/man/man3/p1PendingExpRow.3 docs/man/man3/p2PendingExpRow.3 docs/man/man3/p2PendingImfileRow.3 docs/man/man3/p2DoneExpRow.3 docs/man/man3/p2DoneImfileRow.3 docs/man/man3/p3PendingExpRow.3 docs/man/man3/detRunRow.3 docs/man/man3/detInputExpRow.3 docs/man/man3/detProcessedImfileRow.3 docs/man/man3/detStackedImfileRow.3 docs/man/man3/detNormalizedStatImfileRow.3 docs/man/man3/detNormalizedImfileRow.3 docs/man/man3/detMasterFrameRow.3 docs/man/man3/detMasterImfileRow.3 docs/man/man3/detResidImfileRow.3 docs/man/man3/detResidExpRow.3 docs/man/man3/detRunSummaryRow.3:
+docs/man/man3/ippdb.3 docs/man/man3/weatherRow.3 docs/man/man3/skyp_transparencyRow.3 docs/man/man3/skyp_absorptionRow.3 docs/man/man3/skyp_emissionRow.3 docs/man/man3/dimmRow.3 docs/man/man3/skyp_irRow.3 docs/man/man3/domeRow.3 docs/man/man3/telescopeRow.3 docs/man/man3/summitExpRow.3 docs/man/man3/pzPendingExpRow.3 docs/man/man3/pzPendingImfileRow.3 docs/man/man3/newExpRow.3 docs/man/man3/newImfileRow.3 docs/man/man3/rawDetrendExpRow.3 docs/man/man3/rawScienceExpRow.3 docs/man/man3/rawImfileRow.3 docs/man/man3/p1PendingExpRow.3 docs/man/man3/p2PendingExpRow.3 docs/man/man3/p2PendingImfileRow.3 docs/man/man3/p2ProcessedExpRow.3 docs/man/man3/p2ProcessedImfileRow.3 docs/man/man3/p3PendingExpRow.3 docs/man/man3/detRunRow.3 docs/man/man3/detInputExpRow.3 docs/man/man3/detProcessedImfileRow.3 docs/man/man3/detStackedImfileRow.3 docs/man/man3/detNormalizedStatImfileRow.3 docs/man/man3/detNormalizedImfileRow.3 docs/man/man3/detMasterFrameRow.3 docs/man/man3/detMasterImfileRow.3 docs/man/man3/detResidImfileRow.3 docs/man/man3/detResidExpRow.3 docs/man/man3/detRunSummaryRow.3:
 	$(DOXYGEN)
 
Index: /trunk/ippdb/configure.ac
===================================================================
--- /trunk/ippdb/configure.ac	(revision 8664)
+++ /trunk/ippdb/configure.ac	(revision 8665)
@@ -1,5 +1,11 @@
+dnl
+dnl This file was generated by glueforge 0.24
+dnl
+dnl Do NOT directly edit this file.
+dnl
+
 AC_PREREQ(2.59)
 
-AC_INIT([ippdb], [0.0.33], [pan-starrs.ifa.hawaii.edu])
+AC_INIT([ippdb], [0.0.34], [pan-starrs.ifa.hawaii.edu])
 AC_CONFIG_SRCDIR([ippdb.pc.in])
 
Index: /trunk/ippdb/src/ippdb.c
===================================================================
--- /trunk/ippdb/src/ippdb.c	(revision 8664)
+++ /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 8664)
+++ /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
Index: /trunk/ippdb/tests/alloc.c
===================================================================
--- /trunk/ippdb/tests/alloc.c	(revision 8664)
+++ /trunk/ippdb/tests/alloc.c	(revision 8665)
@@ -815,13 +815,46 @@
 
     {
-        p2DoneExpRow    *object;
-
-        object = p2DoneExpRowAlloc("a string", "a string", -32, -32    );
-
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
+        p2ProcessedExpRow *object;
+
+        object = p2ProcessedExpRowAlloc("a string", -32, -32    );
+
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->p1_version == -32) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->p2_version == -32) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(object);
+    }
+
+    {
+        p2ProcessedImfileRow *object;
+
+        object = p2ProcessedImfileRowAlloc("a string", "a string", "a string", "a string", 64.64, 64.64, 64.64, "a string", "a string", -32, -32    );
+
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(object->class_id, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
             psFree(object);
             exit(EXIT_FAILURE);
@@ -831,4 +864,24 @@
             exit(EXIT_FAILURE);
         }
+        if (!object->bg == 64.64) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->bg_stdev == 64.64) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->bg_mean_stdev == 64.64) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(object->b1_uri, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(object->b2_uri, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
         if (!object->p1_version == -32) {
             psFree(object);
@@ -844,54 +897,13 @@
 
     {
-        p2DoneImfileRow *object;
-
-        object = p2DoneImfileRowAlloc("a string", "a string", "a string", "a string", -32, -32    );
-
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->class_id, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->recipe, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (!object->p1_version == -32) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (!object->p2_version == -32) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(object);
-    }
-
-    {
         p3PendingExpRow *object;
 
-        object = p3PendingExpRowAlloc("a string", "a string", -32, -32    );
-
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->recipe, "a string", MAX_STRING_LENGTH)) {
+        object = p3PendingExpRowAlloc("a string", -32, -32    );
+
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
             psFree(object);
             exit(EXIT_FAILURE);
Index: /trunk/ippdb/tests/createtable.c
===================================================================
--- /trunk/ippdb/tests/createtable.c	(revision 8664)
+++ /trunk/ippdb/tests/createtable.c	(revision 8665)
@@ -298,20 +298,20 @@
         }
 
-        if(!p2DoneExpCreateTable(dbh)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        if(!p2DoneImfileCreateTable(dbh)) {
+        if(!p2ProcessedExpCreateTable(dbh)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        if(!p2ProcessedImfileCreateTable(dbh)) {
             exit(EXIT_FAILURE);
         }
Index: /trunk/ippdb/tests/dbcleanup.c
===================================================================
--- /trunk/ippdb/tests/dbcleanup.c	(revision 8664)
+++ /trunk/ippdb/tests/dbcleanup.c	(revision 8665)
@@ -30,6 +30,6 @@
     p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2PendingExp");
     p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2PendingImfile");
-    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2DoneExp");
-    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2DoneImfile");
+    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2ProcessedExp");
+    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2ProcessedImfile");
     p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p3PendingExp");
     p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS detRun");
Index: /trunk/ippdb/tests/dbsetup.c
===================================================================
--- /trunk/ippdb/tests/dbsetup.c	(revision 8664)
+++ /trunk/ippdb/tests/dbsetup.c	(revision 8665)
@@ -70,9 +70,9 @@
     p2PendingImfileCreateTable(dbh);
 
-    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2DoneExp");
-    p2DoneExpCreateTable(dbh);
+    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2ProcessedExp");
+    p2ProcessedExpCreateTable(dbh);
 
-    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2DoneImfile");
-    p2DoneImfileCreateTable(dbh);
+    p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p2ProcessedImfile");
+    p2ProcessedImfileCreateTable(dbh);
 
     p_psDBRunQuery(dbh, "DROP TABLE IF EXISTS p3PendingExp");
Index: /trunk/ippdb/tests/droptable.c
===================================================================
--- /trunk/ippdb/tests/droptable.c	(revision 8664)
+++ /trunk/ippdb/tests/droptable.c	(revision 8665)
@@ -298,20 +298,20 @@
         }
 
-        if (!p2DoneExpDropTable(dbh)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p2DoneImfileDropTable(dbh)) {
+        if (!p2ProcessedExpDropTable(dbh)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p2ProcessedImfileDropTable(dbh)) {
             exit(EXIT_FAILURE);
         }
Index: /trunk/ippdb/tests/insert.c
===================================================================
--- /trunk/ippdb/tests/insert.c	(revision 8664)
+++ /trunk/ippdb/tests/insert.c	(revision 8665)
@@ -298,35 +298,35 @@
         }
 
-        if (!p2DoneExpInsert(dbh, "a string", "a string", -32, -32)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p2DoneImfileInsert(dbh, "a string", "a string", "a string", "a string", -32, -32)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p3PendingExpInsert(dbh, "a string", "a string", -32, -32)) {
+        if (!p2ProcessedExpInsert(dbh, "a string", -32, -32)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p2ProcessedImfileInsert(dbh, "a string", "a string", "a string", "a string", 64.64, 64.64, 64.64, "a string", "a string", -32, -32)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p3PendingExpInsert(dbh, "a string", -32, -32)) {
             exit(EXIT_FAILURE);
         }
Index: /trunk/ippdb/tests/insertfits.c
===================================================================
--- /trunk/ippdb/tests/insertfits.c	(revision 8664)
+++ /trunk/ippdb/tests/insertfits.c	(revision 8665)
@@ -518,31 +518,31 @@
         }
 
-        if (!p2DoneExpInsertFits(dbh, fits)) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!psFitsClose(fits)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-        psFits          *fits;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        // open a temp
-        fits = psFitsOpen(TMP_FILENAME, "r");
-        if (!fits) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p2DoneImfileInsertFits(dbh, fits)) {
+        if (!p2ProcessedExpInsertFits(dbh, fits)) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!psFitsClose(fits)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+        psFits          *fits;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        // open a temp
+        fits = psFitsOpen(TMP_FILENAME, "r");
+        if (!fits) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p2ProcessedImfileInsertFits(dbh, fits)) {
             exit(EXIT_FAILURE);
         }
Index: /trunk/ippdb/tests/insertobject.c
===================================================================
--- /trunk/ippdb/tests/insertobject.c	(revision 8664)
+++ /trunk/ippdb/tests/insertobject.c	(revision 8665)
@@ -425,39 +425,39 @@
     {
         psDB            *dbh;
-        p2DoneExpRow    *object;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        object = p2DoneExpRowAlloc("a string", "a string", -32, -32);
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p2DoneExpInsertObject(dbh, object)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(object);
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-        p2DoneImfileRow *object;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        object = p2DoneImfileRowAlloc("a string", "a string", "a string", "a string", -32, -32);
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p2DoneImfileInsertObject(dbh, object)) {
+        p2ProcessedExpRow *object;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        object = p2ProcessedExpRowAlloc("a string", -32, -32);
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p2ProcessedExpInsertObject(dbh, object)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(object);
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+        p2ProcessedImfileRow *object;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        object = p2ProcessedImfileRowAlloc("a string", "a string", "a string", "a string", 64.64, 64.64, 64.64, "a string", "a string", -32, -32);
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p2ProcessedImfileInsertObject(dbh, object)) {
             exit(EXIT_FAILURE);
         }
@@ -476,5 +476,5 @@
         }
 
-        object = p3PendingExpRowAlloc("a string", "a string", -32, -32);
+        object = p3PendingExpRowAlloc("a string", -32, -32);
         if (!object) {
             exit(EXIT_FAILURE);
Index: /trunk/ippdb/tests/metadatafromobject.c
===================================================================
--- /trunk/ippdb/tests/metadatafromobject.c	(revision 8664)
+++ /trunk/ippdb/tests/metadatafromobject.c	(revision 8665)
@@ -969,20 +969,61 @@
     {
         psMetadata      *md;
-        p2DoneExpRow    *object;
-        bool            status;
-
-        object = p2DoneExpRowAlloc("a string", "a string", -32, -32);
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        md = p2DoneExpMetadataFromObject(object);
-        if (!md) {
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(object);
-
-        if (strncmp(psMetadataLookupPtr(&status, md, "exp_id"), "a string", MAX_STRING_LENGTH)) {
+        p2ProcessedExpRow *object;
+        bool            status;
+
+        object = p2ProcessedExpRowAlloc("a string", -32, -32);
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        md = p2ProcessedExpMetadataFromObject(object);
+        if (!md) {
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(object);
+
+        if (strncmp(psMetadataLookupPtr(&status, md, "exp_id"), "a string", MAX_STRING_LENGTH)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataLookupS32(&status, md, "p1_version") == -32) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataLookupS32(&status, md, "p2_version") == -32) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(md);
+    }
+
+    {
+        psMetadata      *md;
+        p2ProcessedImfileRow *object;
+        bool            status;
+
+        object = p2ProcessedImfileRowAlloc("a string", "a string", "a string", "a string", 64.64, 64.64, 64.64, "a string", "a string", -32, -32);
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        md = p2ProcessedImfileMetadataFromObject(object);
+        if (!md) {
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(object);
+
+        if (strncmp(psMetadataLookupPtr(&status, md, "exp_id"), "a string", MAX_STRING_LENGTH)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(psMetadataLookupPtr(&status, md, "class_id"), "a string", MAX_STRING_LENGTH)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(psMetadataLookupPtr(&status, md, "uri"), "a string", MAX_STRING_LENGTH)) {
             psFree(md);
             exit(EXIT_FAILURE);
@@ -992,4 +1033,24 @@
             exit(EXIT_FAILURE);
         }
+        if (!psMetadataLookupF64(&status, md, "bg") == 64.64) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataLookupF64(&status, md, "bg_stdev") == 64.64) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataLookupF64(&status, md, "bg_mean_stdev") == 64.64) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(psMetadataLookupPtr(&status, md, "b1_uri"), "a string", MAX_STRING_LENGTH)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(psMetadataLookupPtr(&status, md, "b2_uri"), "a string", MAX_STRING_LENGTH)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
         if (!psMetadataLookupS32(&status, md, "p1_version") == -32) {
             psFree(md);
@@ -1006,53 +1067,8 @@
     {
         psMetadata      *md;
-        p2DoneImfileRow *object;
-        bool            status;
-
-        object = p2DoneImfileRowAlloc("a string", "a string", "a string", "a string", -32, -32);
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        md = p2DoneImfileMetadataFromObject(object);
-        if (!md) {
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(object);
-
-        if (strncmp(psMetadataLookupPtr(&status, md, "exp_id"), "a string", MAX_STRING_LENGTH)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(psMetadataLookupPtr(&status, md, "class_id"), "a string", MAX_STRING_LENGTH)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(psMetadataLookupPtr(&status, md, "uri"), "a string", MAX_STRING_LENGTH)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(psMetadataLookupPtr(&status, md, "recipe"), "a string", MAX_STRING_LENGTH)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataLookupS32(&status, md, "p1_version") == -32) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataLookupS32(&status, md, "p2_version") == -32) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(md);
-    }
-
-    {
-        psMetadata      *md;
         p3PendingExpRow *object;
         bool            status;
 
-        object = p3PendingExpRowAlloc("a string", "a string", -32, -32);
+        object = p3PendingExpRowAlloc("a string", -32, -32);
         if (!object) {
             exit(EXIT_FAILURE);
@@ -1067,8 +1083,4 @@
 
         if (strncmp(psMetadataLookupPtr(&status, md, "exp_id"), "a string", MAX_STRING_LENGTH)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(psMetadataLookupPtr(&status, md, "recipe"), "a string", MAX_STRING_LENGTH)) {
             psFree(md);
             exit(EXIT_FAILURE);
Index: /trunk/ippdb/tests/objectfrommetadata.c
===================================================================
--- /trunk/ippdb/tests/objectfrommetadata.c	(revision 8664)
+++ /trunk/ippdb/tests/objectfrommetadata.c	(revision 8665)
@@ -1472,5 +1472,5 @@
     {
         psMetadata      *md;
-        p2DoneExpRow    *object;
+        p2ProcessedExpRow *object;
 
         md = psMetadataAlloc();
@@ -1479,8 +1479,78 @@
             exit(EXIT_FAILURE);
         }
+        if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, -32)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, -32)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+
+        object = p2ProcessedExpObjectFromMetadata(md);
+        if (!object) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(md);
+
+        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->p1_version == -32) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->p2_version == -32) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(object);
+    }
+
+    {
+        psMetadata      *md;
+        p2ProcessedImfileRow *object;
+
+        md = psMetadataAlloc();
+        if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, "a string")) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, "a string")) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, "a string")) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
         if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, "a string")) {
             psFree(md);
             exit(EXIT_FAILURE);
         }
+        if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg", 0, NULL, 64.64)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_stdev", 0, NULL, 64.64)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataAddF64(md, PS_LIST_TAIL, "bg_mean_stdev", 0, NULL, 64.64)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataAddStr(md, PS_LIST_TAIL, "b1_uri", 0, NULL, "a string")) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+        if (!psMetadataAddStr(md, PS_LIST_TAIL, "b2_uri", 0, NULL, "a string")) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
         if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, -32)) {
             psFree(md);
@@ -1492,5 +1562,5 @@
         }
 
-        object = p2DoneExpObjectFromMetadata(md);
+        object = p2ProcessedImfileObjectFromMetadata(md);
         if (!object) {
             psFree(md);
@@ -1504,8 +1574,36 @@
             exit(EXIT_FAILURE);
         }
+        if (strncmp(object->class_id, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
         if (strncmp(object->recipe, "a string", MAX_STRING_LENGTH)) {
             psFree(object);
             exit(EXIT_FAILURE);
         }
+        if (!object->bg == 64.64) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->bg_stdev == 64.64) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (!object->bg_mean_stdev == 64.64) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(object->b1_uri, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
+        if (strncmp(object->b2_uri, "a string", MAX_STRING_LENGTH)) {
+            psFree(object);
+            exit(EXIT_FAILURE);
+        }
         if (!object->p1_version == -32) {
             psFree(object);
@@ -1522,5 +1620,5 @@
     {
         psMetadata      *md;
-        p2DoneImfileRow *object;
+        p3PendingExpRow *object;
 
         md = psMetadataAlloc();
@@ -1529,26 +1627,14 @@
             exit(EXIT_FAILURE);
         }
-        if (!psMetadataAddStr(md, PS_LIST_TAIL, "class_id", 0, NULL, "a string")) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataAddStr(md, PS_LIST_TAIL, "uri", 0, NULL, "a string")) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, "a string")) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataAddS32(md, PS_LIST_TAIL, "p1_version", 0, NULL, -32)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
         if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, -32)) {
             psFree(md);
             exit(EXIT_FAILURE);
         }
-
-        object = p2DoneImfileObjectFromMetadata(md);
+        if (!psMetadataAddS32(md, PS_LIST_TAIL, "p3_version", 0, NULL, -32)) {
+            psFree(md);
+            exit(EXIT_FAILURE);
+        }
+
+        object = p3PendingExpObjectFromMetadata(md);
         if (!object) {
             psFree(md);
@@ -1559,66 +1645,4 @@
 
         if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->class_id, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->uri, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->recipe, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (!object->p1_version == -32) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (!object->p2_version == -32) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(object);
-    }
-
-    {
-        psMetadata      *md;
-        p3PendingExpRow *object;
-
-        md = psMetadataAlloc();
-        if (!psMetadataAddStr(md, PS_LIST_TAIL, "exp_id", 0, NULL, "a string")) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataAddStr(md, PS_LIST_TAIL, "recipe", 0, NULL, "a string")) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataAddS32(md, PS_LIST_TAIL, "p2_version", 0, NULL, -32)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-        if (!psMetadataAddS32(md, PS_LIST_TAIL, "p3_version", 0, NULL, -32)) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-
-        object = p3PendingExpObjectFromMetadata(md);
-        if (!object) {
-            psFree(md);
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(md);
-
-        if (strncmp(object->exp_id, "a string", MAX_STRING_LENGTH)) {
-            psFree(object);
-            exit(EXIT_FAILURE);
-        }
-        if (strncmp(object->recipe, "a string", MAX_STRING_LENGTH)) {
             psFree(object);
             exit(EXIT_FAILURE);
Index: /trunk/ippdb/tests/pop.c
===================================================================
--- /trunk/ippdb/tests/pop.c	(revision 8664)
+++ /trunk/ippdb/tests/pop.c	(revision 8665)
@@ -433,5 +433,4 @@
         psDB            *dbh;
         char            exp_id[256];
-        char            recipe[256];
         psS32           p1_version;
         psS32           p2_version;
@@ -442,17 +441,22 @@
         }
 
-        if (!p2DoneExpPop(dbh, (char **)&exp_id, (char **)&recipe, &p1_version, &p2_version)) { 
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-        char            exp_id[256];
-        char            class_id[256];
-        char            uri[256];
-        char            recipe[256];
+        if (!p2ProcessedExpPop(dbh, (char **)&exp_id, &p1_version, &p2_version)) { 
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+        char            exp_id[256];
+        char            class_id[256];
+        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;
@@ -463,15 +467,14 @@
         }
 
-        if (!p2DoneImfilePop(dbh, (char **)&exp_id, (char **)&class_id, (char **)&uri, (char **)&recipe, &p1_version, &p2_version)) { 
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-        char            exp_id[256];
-        char            recipe[256];
+        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)) { 
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+        char            exp_id[256];
         psS32           p2_version;
         psS32           p3_version;
@@ -482,5 +485,5 @@
         }
 
-        if (!p3PendingExpPop(dbh, (char **)&exp_id, (char **)&recipe, &p2_version, &p3_version)) { 
+        if (!p3PendingExpPop(dbh, (char **)&exp_id, &p2_version, &p3_version)) { 
             exit(EXIT_FAILURE);
         }
Index: /trunk/ippdb/tests/popfits.c
===================================================================
--- /trunk/ippdb/tests/popfits.c	(revision 8664)
+++ /trunk/ippdb/tests/popfits.c	(revision 8665)
@@ -518,31 +518,31 @@
         }
 
-        if (!p2DoneExpPopFits(dbh, fits, 1)) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!psFitsClose(fits)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-        psFits          *fits;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        // allocate a temp
-        fits = psFitsOpen(TMP_FILENAME, "w");
-        if (!fits) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p2DoneImfilePopFits(dbh, fits, 1)) {
+        if (!p2ProcessedExpPopFits(dbh, fits, 1)) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!psFitsClose(fits)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+        psFits          *fits;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        // allocate a temp
+        fits = psFitsOpen(TMP_FILENAME, "w");
+        if (!fits) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p2ProcessedImfilePopFits(dbh, fits, 1)) {
             exit(EXIT_FAILURE);
         }
Index: /trunk/ippdb/tests/popobject.c
===================================================================
--- /trunk/ippdb/tests/popobject.c	(revision 8664)
+++ /trunk/ippdb/tests/popobject.c	(revision 8665)
@@ -349,30 +349,30 @@
     {
         psDB            *dbh;
-        p2DoneExpRow    *object;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        object = p2DoneExpPopObject(dbh);
-        if (!object) {
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(object);
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-        p2DoneImfileRow *object;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        object = p2DoneImfilePopObject(dbh);
+        p2ProcessedExpRow *object;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        object = p2ProcessedExpPopObject(dbh);
+        if (!object) {
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(object);
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+        p2ProcessedImfileRow *object;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        object = p2ProcessedImfilePopObject(dbh);
         if (!object) {
             exit(EXIT_FAILURE);
Index: /trunk/ippdb/tests/selectrowsfits.c
===================================================================
--- /trunk/ippdb/tests/selectrowsfits.c	(revision 8664)
+++ /trunk/ippdb/tests/selectrowsfits.c	(revision 8665)
@@ -439,27 +439,27 @@
         }
 
-        if (!p2DoneExpSelectRowsFits(dbh, fits, NULL, 1)) {
-            exit(EXIT_FAILURE);
-        }
-
-        psFree(fits);
-        psDBCleanup(dbh);
-    }
-
-    {
-        psDB            *dbh;
-        psFits          *fits;
-
-        dbh = psDBInit("localhost", "test", NULL, "test");
-        if (!dbh) {
-            exit(EXIT_FAILURE);
-        }
-
-        fits = psFitsOpen(TMP_FILENAME, "w");
-        if (!fits) {
-            exit(EXIT_FAILURE);
-        }
-
-        if (!p2DoneImfileSelectRowsFits(dbh, fits, NULL, 1)) {
+        if (!p2ProcessedExpSelectRowsFits(dbh, fits, NULL, 1)) {
+            exit(EXIT_FAILURE);
+        }
+
+        psFree(fits);
+        psDBCleanup(dbh);
+    }
+
+    {
+        psDB            *dbh;
+        psFits          *fits;
+
+        dbh = psDBInit("localhost", "test", NULL, "test");
+        if (!dbh) {
+            exit(EXIT_FAILURE);
+        }
+
+        fits = psFitsOpen(TMP_FILENAME, "w");
+        if (!fits) {
+            exit(EXIT_FAILURE);
+        }
+
+        if (!p2ProcessedImfileSelectRowsFits(dbh, fits, NULL, 1)) {
             exit(EXIT_FAILURE);
         }
