Index: /trunk/ippTools/src/Makefile.am
===================================================================
--- /trunk/ippTools/src/Makefile.am	(revision 6260)
+++ /trunk/ippTools/src/Makefile.am	(revision 6261)
@@ -1,3 +1,3 @@
-bin_PROGRAMS = pxadmin p2search  p0search
+bin_PROGRAMS = pxadmin p2search p0search
 
 include_HEADERS = pxtools.h
@@ -19,9 +19,9 @@
 AM_CPPFLAGS = -I$(top_srcdir)/src$
 
-#p0search_CFLAGS = $(PSLIB_CFLAGS) $(PSMODULES_CFLAGS) $(METADATADB_CFLAGS) $(pxtools_CFLAGS)
-#p0search_LDADD = $(PSLIB_LIBS) $(PSMODULES_LIBS) $(METADATADB_LIBS) $(top_builddir)/src/libpxtools.la
-#p0search_SOURCES = \
-#    p0search.c \
-#    p0searchConfig.c
+p0search_CFLAGS = $(PSLIB_CFLAGS) $(PSMODULES_CFLAGS) $(METADATADB_CFLAGS) $(pxtools_CFLAGS)
+p0search_LDADD = $(PSLIB_LIBS) $(PSMODULES_LIBS) $(METADATADB_LIBS) $(top_builddir)/src/libpxtools.la
+p0search_SOURCES = \
+    p0search.c \
+    p0searchConfig.c
 
 p2search_CFLAGS = $(PSLIB_CFLAGS) $(PSMODULES_CFLAGS) $(METADATADB_CFLAGS) $(pxtools_CFLAGS)
Index: /trunk/ippTools/src/chiptool.c
===================================================================
--- /trunk/ippTools/src/chiptool.c	(revision 6260)
+++ /trunk/ippTools/src/chiptool.c	(revision 6261)
@@ -14,15 +14,15 @@
 
     switch (config.mode) {
-        case P2_MODE_QUICK:
+        case PX_MODE_QUICK:
             if (!quickMode(&config)) {
                 exit(EXIT_FAILURE);
             }
             break;
-        case P2_MODE_DEFINE:
+        case PX_MODE_DEFINE:
             if (!defineMode(&config)) {
                 exit(EXIT_FAILURE);
             }
             break;
-        case P2_MODE_PENDING:
+        case PX_MODE_PENDING:
             if (!pendingMode(&config)) {
                 exit(EXIT_FAILURE);
@@ -30,5 +30,5 @@
             break;
     /*
-    if (config.mode == P2_MODE_UPDATE) {
+    if (config.mode == PX_MODE_UPDATE) {
         bool status = p2updatePendingFrames(&config, pendingFrames);
         if (!status) {
@@ -37,5 +37,5 @@
     }
     */
-        case P2_MODE_DONE:
+        case PX_MODE_DONE:
             if (!doneMode(&config)) {
                 exit(EXIT_FAILURE);
Index: /trunk/ippTools/src/chiptoolConfig.c
===================================================================
--- /trunk/ippTools/src/chiptoolConfig.c	(revision 6260)
+++ /trunk/ippTools/src/chiptoolConfig.c	(revision 6261)
@@ -26,5 +26,5 @@
 
     int N;
-    config->mode = P2_MODE_NONE;
+    config->mode = PX_MODE_NONE;
     if ((N = psArgumentGet (argc, argv, "-quick"))) {
         psArgumentRemove (N, &argc, argv);
@@ -32,5 +32,5 @@
             psAbort (argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_QUICK;
+        config->mode = PX_MODE_QUICK;
     }
     if ((N = psArgumentGet (argc, argv, "-define"))) {
@@ -39,5 +39,5 @@
             psAbort (argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_DEFINE;
+        config->mode = PX_MODE_DEFINE;
     }
     if ((N = psArgumentGet (argc, argv, "-pending"))) {
@@ -46,5 +46,5 @@
             psAbort (argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_PENDING;
+        config->mode = PX_MODE_PENDING;
     }
     /*
@@ -54,5 +54,5 @@
             psAbort (argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_UPDATE;
+        config->mode = PX_MODE_UPDATE;
     }
     */
@@ -62,5 +62,5 @@
             psAbort (argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_DONE;
+        config->mode = PX_MODE_DONE;
     }
     
@@ -79,5 +79,5 @@
     psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-url",  0, "define URL", "");
 
-    if (config->mode == P2_MODE_NONE) {
+    if (config->mode == PX_MODE_NONE) {
         fprintf (stderr, "search mode not specified\n");
         psArgumentHelp(config->arguments);
Index: /trunk/ippTools/src/p2updatePending.c
===================================================================
--- /trunk/ippTools/src/p2updatePending.c	(revision 6260)
+++ /trunk/ippTools/src/p2updatePending.c	(revision 6261)
@@ -9,9 +9,9 @@
 
     // select all of the exposures which are still pending
-    psMetadataAddS32 (where, PS_LIST_TAIL, "STATE", 0, "==", P2_MODE_PENDING);
+    psMetadataAddS32 (where, PS_LIST_TAIL, "STATE", 0, "==", PX_MODE_PENDING);
     psArray *exposures = p2PendingExpSelectRowObjects (config->database, where, MAX_ROWS);
 
     // we will now select all of the matching images which are done
-    psMetadataAddS32 (where, PS_LIST_TAIL, "STATE", PS_META_REPLACE, "==", P2_MODE_DONE);
+    psMetadataAddS32 (where, PS_LIST_TAIL, "STATE", PS_META_REPLACE, "==", PX_MODE_DONE);
     for (int i = 0; i < exposures->n; i++) {
 	p2PendingExpRow *exposure = exposures->data[i];
@@ -27,5 +27,5 @@
 	// frame is complete, set exposure state to done
 	// XXX add P2 stats here?
-//	exposure->state = P2_MODE_DONE;
+//	exposure->state = PX_MODE_DONE;
 //	p2PendingExposureUpdateRows (config->database, exposure);
     }
Index: /trunk/ippTools/src/pxadmin.c
===================================================================
--- /trunk/ippTools/src/pxadmin.c	(revision 6260)
+++ /trunk/ippTools/src/pxadmin.c	(revision 6261)
@@ -10,5 +10,5 @@
 
     switch (config.mode) {
-        case P2_MODE_RECREATE:
+        case PX_MODE_RECREATE:
             if (!pxDeleteTables(&config)) {
                 psError(PS_ERR_UNKNOWN, false, "table deletion failed");
@@ -16,5 +16,5 @@
             }
             // fall through
-        case P2_MODE_CREATE:
+        case PX_MODE_CREATE:
             if (!pxCreateTables(&config)) {
                 psError(PS_ERR_UNKNOWN, false, "table creation failed");
@@ -22,5 +22,5 @@
             }
             break;
-        case P2_MODE_DELETE:
+        case PX_MODE_DELETE:
             if (!pxDeleteTables(&config)) {
                 psError(PS_ERR_UNKNOWN, false, "table deletion failed");
Index: /trunk/ippTools/src/pxadminConfig.c
===================================================================
--- /trunk/ippTools/src/pxadminConfig.c	(revision 6260)
+++ /trunk/ippTools/src/pxadminConfig.c	(revision 6261)
@@ -19,5 +19,5 @@
 
     int N;
-    config->mode = P2_MODE_NONE;
+    config->mode = PX_MODE_NONE;
     if ((N = psArgumentGet(argc, argv, "-create"))) {
         psArgumentRemove(N, &argc, argv);
@@ -25,5 +25,5 @@
             psAbort(argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_CREATE;
+        config->mode = PX_MODE_CREATE;
     }
     if ((N = psArgumentGet(argc, argv, "-delete"))) {
@@ -32,5 +32,5 @@
             psAbort(argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_DELETE;
+        config->mode = PX_MODE_DELETE;
     }
     if ((N = psArgumentGet(argc, argv, "-recreate"))) {
@@ -39,5 +39,5 @@
             psAbort(argv[0], "only one mode selection is allowed");
         }
-        config->mode = P2_MODE_RECREATE;
+        config->mode = PX_MODE_RECREATE;
     }
 
@@ -50,5 +50,5 @@
             "delete and recreate the P2 tables", "");
 
-    if (config->mode == P2_MODE_NONE) {
+    if (config->mode == PX_MODE_NONE) {
         fprintf (stderr, "admin mode not specified\n");
         psArgumentHelp(config->arguments);
Index: /trunk/ippTools/src/pxframes.c
===================================================================
--- /trunk/ippTools/src/pxframes.c	(revision 6260)
+++ /trunk/ippTools/src/pxframes.c	(revision 6261)
@@ -67,4 +67,5 @@
 } 
 
+PX_FRAME_PRINT(newFrame, newImfile);
 PX_FRAME_PRINT(rawScienceFrame, rawImfile);
 PX_FRAME_PRINT(p2PendingFrame, p2PendingImfile);
Index: /trunk/ippTools/src/pxtables.c
===================================================================
--- /trunk/ippTools/src/pxtables.c	(revision 6260)
+++ /trunk/ippTools/src/pxtables.c	(revision 6261)
@@ -4,4 +4,12 @@
     PS_ASSERT_PTR_NON_NULL(config, false);
 
+    if (!newExpCreateTable(config->database)) {
+        psError(PS_ERR_UNKNOWN, false, "database access failed");
+        return false;
+    }
+    if (!newImfileCreateTable(config->database)) {
+        psError(PS_ERR_UNKNOWN, false, "database access failed");
+        return false;
+    }
     if (!rawScienceExpCreateTable(config->database)) {
         psError(PS_ERR_UNKNOWN, false, "database access failed");
@@ -9,4 +17,8 @@
     }
     if (!rawImfileCreateTable(config->database)) {
+        psError(PS_ERR_UNKNOWN, false, "database access failed");
+        return false;
+    }
+    if (!p1PendingExpCreateTable(config->database)) {
         psError(PS_ERR_UNKNOWN, false, "database access failed");
         return false;
@@ -67,4 +79,12 @@
     psFree(dbPassword);
 
+    if (!newExpDropTable(config->database)) {
+        psError(PS_ERR_UNKNOWN, false, "database access failed");
+        return false;
+    }
+    if (!newImfileDropTable(config->database)) {
+        psError(PS_ERR_UNKNOWN, false, "database access failed");
+        return false;
+    }
     if (!rawScienceExpDropTable(config->database)) {
         psError(PS_ERR_UNKNOWN, false, "database access failed");
@@ -72,4 +92,8 @@
     }
     if (!rawImfileDropTable(config->database)) {
+        psError(PS_ERR_UNKNOWN, false, "database access failed");
+        return false;
+    }
+    if (!p1PendingExpDropTable(config->database)) {
         psError(PS_ERR_UNKNOWN, false, "database access failed");
         return false;
Index: /trunk/ippTools/src/pxtools.h
===================================================================
--- /trunk/ippTools/src/pxtools.h	(revision 6260)
+++ /trunk/ippTools/src/pxtools.h	(revision 6261)
@@ -16,41 +16,17 @@
 
 typedef enum {
-    P0_MODE_NONE,		      	        
-    P0_MODE_PENDING,			        // grab from new
-    P0_MODE_UPDATE,	                    // grab from new, create raw
-} p0mode;
+    PX_MODE_NONE,                       // grab from raw, output for ppImage
+    PX_MODE_QUICK,                      // grab from raw, output for ppImage
+    PX_MODE_UPDATE,                     // grab from new, create raw
+    PX_MODE_DEFINE,                     // grab from raw, create pending
+    PX_MODE_PENDING,                    // grab from pending, output for ppImage
+    PX_MODE_DONE,                       // set the current state
+    PX_MODE_CREATE,                     // set the current state
+    PX_MODE_DELETE,                     // set the current state
+    PX_MODE_RECREATE,                   // set the current state
+} pxMode;
 
 typedef struct {
-    p0mode mode;
-    psTime *start;
-    psTime *stop;
-    psMetadata *camera;
-    psDB *database;
-    psMetadata *site;
-    psMetadata *recipe;
-    psMetadata *arguments;
-    char *camera_name;
-    char *filter;
-    char *exp_id;
-    char *class;
-    char *class_id;
-    char *url;
-    psMetadata *where;
-} p0Config;
-
-typedef enum {
-    P2_MODE_NONE,		      	// grab from raw, output for ppImage
-    P2_MODE_QUICK,		      	// grab from raw, output for ppImage
-    P2_MODE_DEFINE,			// grab from raw, create pending
-    P2_MODE_PENDING,			// grab from pending, output for ppImage
-//    P2_MODE_UPDATE,			// set the current state
-    P2_MODE_DONE,			// set the current state
-    P2_MODE_CREATE,			// set the current state
-    P2_MODE_DELETE,			// set the current state
-    P2_MODE_RECREATE,		// set the current state
-} p2mode;
-
-typedef struct {
-    p2mode mode;
+    pxMode mode;
     psTime *start;
     psTime *stop;
@@ -133,2 +109,7 @@
 bool p2PendingFramePrint(FILE *stream, pxConfig *config, psArray *frames);
 psArray *p2PendingFrameSearch(pxConfig *config);
+
+bool newFramePrint(FILE *stream, pxConfig *config, psArray *frames);
+psArray *newFrameSearch(pxConfig *config);
+
+bool p0searchConfig(pxConfig *config, int argc, char **argv);
Index: /trunk/ippTools/src/regtoolConfig.c
===================================================================
--- /trunk/ippTools/src/regtoolConfig.c	(revision 6261)
+++ /trunk/ippTools/src/regtoolConfig.c	(revision 6261)
@@ -0,0 +1,144 @@
+#include <pmConfig.h>
+
+#include "pxtools.h"
+
+bool p0searchConfig(pxConfig *config, int argc, char **argv) {
+    PS_ASSERT_PTR_NON_NULL(config, false);
+
+    // Parse the configurations (re-org a la ppImage)
+    config->site    = NULL;             // Site configuration
+    config->camera  = NULL;             // Camera configuration (unused)
+    config->recipe  = NULL;             // Recipe configuration
+    config->camera_name = NULL;         // Camera name
+    config->filter  = NULL;             // Filter name
+    config->exp_id  = NULL;             // Exposure ID
+    config->class   = NULL;             
+    config->class_id = NULL;           
+    config->url     = NULL;
+
+    if (! pmConfigRead(&config->site, &config->camera, &config->recipe, &argc, argv, RECIPE)) {
+        psErrorStackPrint(stderr, "Can't find site configuration!\n");
+        exit(EXIT_FAILURE);
+    }
+
+    // Parse other command-line arguments
+    config->arguments = psMetadataAlloc(); // The arguments, with default values
+
+    int N;
+    config->mode = PX_MODE_NONE;
+    if ((N = psArgumentGet (argc, argv, "-pending"))) {
+        psArgumentRemove (N, &argc, argv);
+        if (config->mode) {
+            psAbort (argv[0], "only one mode selection is allowed");
+        }
+        config->mode = PX_MODE_PENDING;
+    }
+    if ((N = psArgumentGet (argc, argv, "-update"))) {
+        psArgumentRemove (N, &argc, argv);
+        if (config->mode) {
+            psAbort (argv[0], "only one mode selection is allowed");
+        }
+        config->mode = PX_MODE_UPDATE;
+    }
+    
+    // paul's argument parsing convention requires: -key value 
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-pending", 0, "examine pending image table, write ppImage output", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-update",  0, "update pending image table", "");
+
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-inst",  0, "define camera of interest", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-filter",  0, "define filter of interest", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-exp_id",  0, "define exposure ID", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-class",  0, "define class", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-class_id",  0, "define class ID", "");
+    psMetadataAddStr(config->arguments, PS_LIST_TAIL, "-url",  0, "define URL", "");
+
+    if (config->mode == PX_MODE_NONE) {
+        fprintf (stderr, "search mode not specified\n");
+        psArgumentHelp(config->arguments);
+        psFree(config->arguments);
+        exit(EXIT_FAILURE);
+    }
+
+    if (! psArgumentParse(config->arguments, &argc, argv) || argc != 1) {
+        printf("\nPan-STARRS Phase 2 Search Tool\n\n");
+        printf("Usage: %s [mode] [options]\n\n", argv[0]);
+        printf(" [mode] : -quick | -define | -pending | -donee\n\n");
+        psArgumentHelp(config->arguments);
+        psFree(config->arguments);
+        exit(EXIT_FAILURE);
+    }
+
+    bool status;
+    config->camera_name = psMetadataLookupStr(&status, config->arguments,
+        "-inst");
+    config->filter = psMetadataLookupStr(&status, config->arguments, "-filter");
+    config->exp_id = psMetadataLookupStr(&status, config->arguments, "-exp_id");
+    config->class = psMetadataLookupStr(&status, config->arguments, "-class");
+    config->class_id = psMetadataLookupStr(&status, config->arguments,
+        "-class_id");
+    config->url = psMetadataLookupStr(&status, config->arguments, "-url");
+
+    // XXX why is "" being returned when -[foo] isn't specified?
+#define EMPTY_TO_NULL_STRING(var) \
+    if (strcmp(var, "") == 0) { \
+        var = NULL; \
+    }
+
+    EMPTY_TO_NULL_STRING(config->camera_name);
+    EMPTY_TO_NULL_STRING(config->filter);
+    EMPTY_TO_NULL_STRING(config->exp_id);
+    EMPTY_TO_NULL_STRING(config->class);
+    EMPTY_TO_NULL_STRING(config->class_id);
+    EMPTY_TO_NULL_STRING(config->url);
+
+    psMetadata *where = psMetadataAlloc();
+
+    if (config->camera_name != NULL) {
+        if (!psMetadataAddStr(where, PS_LIST_TAIL, "camera", 0, "==",
+            config->camera_name)) {
+            psError(PS_ERR_UNKNOWN, false, "failed to add item camera");
+            psFree(where);
+            return NULL;
+        }
+    }
+    if (config->filter != NULL) {
+        psMetadataAddStr(where, PS_LIST_TAIL, "filter", 0, "==",
+            config->filter);
+    }
+    if (config->exp_id != NULL) {
+        psMetadataAddStr(where, PS_LIST_TAIL, "exp_id", 0, "==",
+            config->exp_id);
+    }
+    if (config->class != NULL) {
+        psMetadataAddStr(where, PS_LIST_TAIL, "class", 0, "==",
+            config->class);
+    }
+    if (config->class_id != NULL) {
+        psMetadataAddStr(where, PS_LIST_TAIL, "class_id", 0, "==",
+             config->class_id);
+    }
+
+    /*
+    // psMetadataConfig does not support times yet
+    if (!psTimeIsZero(config->start) && !psTimeIsZero(config->stop)) {
+        psMetadataAddTime (where, PS_LIST_TAIL, "TIME_START", 0, "<", config->stop);
+        psMetadataAddTime (where, PS_LIST_TAIL, "TIME_STOP", 0, ">", config->start);
+    }
+    */
+
+    if (where->list->n < 1) {
+        psFree(where);
+        where = NULL;
+    }
+
+    config->where = where;
+
+
+    // add the input and output images to the arguments list
+    //psMetadataAddStr (config->arguments, PS_LIST_TAIL, "-output", 0, "Name of the output image", argv[1]);
+
+    // define Database handle, if used
+    config->database = pmConfigDB(config->site);
+
+    return true;
+} 
