Index: trunk/Ohana/src/libautocode/Makefile.Targets
===================================================================
--- trunk/Ohana/src/libautocode/Makefile.Targets	(revision 19130)
+++ trunk/Ohana/src/libautocode/Makefile.Targets	(revision 19185)
@@ -36,4 +36,5 @@
 $(ASRC)/image-ps1-dev-1.$(ARCH).o \
 $(ASRC)/image-ps1-dev-2.$(ARCH).o \
+$(ASRC)/image-ps1-dev-3.$(ARCH).o \
 $(ASRC)/regimage.$(ARCH).o \
 $(ASRC)/detreg.$(ARCH).o \
@@ -89,4 +90,5 @@
 $(AINC)/image-ps1-dev-1.h \
 $(AINC)/image-ps1-dev-2.h \
+$(AINC)/image-ps1-dev-3.h \
 $(AINC)/regimage.h \
 $(AINC)/detreg.h \
Index: trunk/Ohana/src/libautocode/def/image-ps1-dev-3.d
===================================================================
--- trunk/Ohana/src/libautocode/def/image-ps1-dev-3.d	(revision 19185)
+++ trunk/Ohana/src/libautocode/def/image-ps1-dev-3.d	(revision 19185)
@@ -0,0 +1,70 @@
+STRUCT       Image_PS1_DEV_3
+EXTNAME      DVO_IMAGE_PS1_DEV_3
+TYPE         BINTABLE
+SIZE         344
+DESCRIPTION  DVO Image Table 
+
+# elements of the image structure
+
+SUBSTRUCT coords,           COORDS,               Coords,        astrometric data
+SUBFIELD  crval1,           CRVAL1,               double,   	 coordinate at reference pixel
+SUBFIELD  crval2,           CRVAL2,               double,  	 coordinate at reference pixel
+SUBFIELD  crpix1,           CRPIX1,               float,   	 coordinate of reference pixel
+SUBFIELD  crpix2,           CRPIX2,               float,   	 coordinate of reference pixel
+SUBFIELD  cdelt1,           CDELT1,               float,   	 degrees per pixel
+SUBFIELD  cdelt2,           CDELT2,               float,    	 degrees per pixel
+SUBFIELD  pc1_1,            PC1_1,                float,    	 rotation matrix
+SUBFIELD  pc1_2,            PC1_2,                float,    	 rotation matrix
+SUBFIELD  pc2_1,            PC2_1,                float,    	 rotation matrix
+SUBFIELD  pc2_2,            PC2_2,                float,    	 rotation matrix
+SUBFIELD  polyterms,        POLYTERMS,            float[7][2],	 higher order warping terms
+SUBFIELD  ctype,            CTYPE,                char[15],      coordinate type
+SUBFIELD  Npolyterms,       NPOLYTERMS,           char,     	 order of polynomial
+# 120 bytes
+
+FIELD 	  tzero,            TZERO,                e_time,         readout time (row 0)
+FIELD 	  nstar,            NSTAR,                unsigned int,   number of stars on image
+FIELD 	  secz,             SECZ,                 float,      	  airmass,                   mag
+FIELD 	  NX,               NX,                   unsigned short, image width
+FIELD 	  NY,               NY,                   unsigned short, image height
+FIELD 	  apmifit,          APMIFIT,              float,      	  aperture correction,       mag
+FIELD 	  dapmifit,         DAPMIFIT,             float,      	  apmifit error,             mag
+FIELD 	  Mcal,             MCAL,                 float,      	  calibration mag,           mag
+FIELD 	  dMcal,            DMCAL,                float,      	  error on Mcal,             mag
+FIELD 	  Xm,               XM,                   short,      	  image chisq,               10*log(value)
+FIELD 	  photcode,         PHOTCODE,             short,      	  identifier for CCD,
+FIELD 	  exptime,          EXPTIME,              float,          exposure time,             seconds
+FIELD     sidtime,          ST,			  float,          sidereal time of exposure
+FIELD     latitude,         LAT,		  float,          observatory latitude,      degrees
+# 40 bytes
+
+FIELD 	  name,             NAME,                 char[128],      name of original image 
+FIELD 	  detection_limit,  DETECTION_LIMIT,      unsigned char,  detection limit,           10*mag
+FIELD 	  saturation_limit, SATURATION_LIMIT,     unsigned char,  saturation limit,          10*mag
+FIELD 	  cerror,           CERROR,               unsigned char,  astrometric error,         50*arcsec
+FIELD 	  fwhm_x,           FWHM_X,               unsigned char,  PSF x width,               25*arcsec
+FIELD 	  fwhm_y,           FWHM_Y,               unsigned char,  PSF y width,               25*arcsec
+FIELD 	  trate,            TRATE,                unsigned char,  scan rate,                 100 usec/pixel
+FIELD 	  code,             CODE,                 char,           image quality flag
+FIELD 	  ccdnum,           CCDNUM,               unsigned char,  CCD ID number
+FIELD 	  imageID,          IMAGE_ID,             unsigned int,   internal image ID
+FIELD 	  externID,         EXTERN_ID,            unsigned int,   external image ID
+FIELD 	  sourceID,         SOURCE_ID,            unsigned short, analysis source ID
+# 48 bytes 
+
+FIELD 	  order,            ORDER,                short,      	  Mrel 2D polynomical order 
+FIELD 	  Mx,               MX,                   short,      	  Mrel polyterm
+FIELD 	  My,               MY,                   short,      	  Mrel polyterm
+FIELD 	  Mxx,              MXX,                  short,      	  Mrel polyterm
+FIELD 	  Mxy,              MXY,                  short,      	  Mrel polyterm
+FIELD 	  Myy,              MYY,                  short,      	  Mrel polyterm
+FIELD 	  Mxxx,             MXXX,                 short,      	  Mrel polyterm
+FIELD 	  Mxxy,             MXXY,                 short,      	  Mrel polyterm
+FIELD 	  Mxyy,             MXYY,                 short,      	  Mrel polyterm
+FIELD 	  Myyy,             MYYY,                 short,      	  Mrel polyterm
+FIELD 	  Mxxxx,            MXXXX,                short,      	  Mrel polyterm
+FIELD 	  Mxxxy,            MXXXY,                short,      	  Mrel polyterm
+FIELD 	  Mxxyy,            MXXYY,                short,      	  Mrel polyterm
+FIELD 	  Mxyyy,            MXYYY,                short,      	  Mrel polyterm
+FIELD 	  Myyyy,            MYYYY,                short,      	  Mrel polyterm
+# 40 bytes
Index: trunk/Ohana/src/libautocode/def/image.d
===================================================================
--- trunk/Ohana/src/libautocode/def/image.d	(revision 19130)
+++ trunk/Ohana/src/libautocode/def/image.d	(revision 19185)
@@ -2,5 +2,5 @@
 EXTNAME      DVO_IMAGE
 TYPE         BINTABLE
-SIZE         280
+SIZE         344
 DESCRIPTION  DVO Image Table 
 
@@ -40,5 +40,5 @@
 # 40 bytes
 
-FIELD 	  name,             NAME,                 char[64],       name of original image 
+FIELD 	  name,             NAME,                 char[128],      name of original image 
 FIELD 	  detection_limit,  DETECTION_LIMIT,      unsigned char,  detection limit,           10*mag
 FIELD 	  saturation_limit, SATURATION_LIMIT,     unsigned char,  saturation limit,          10*mag
Index: trunk/Ohana/src/libdvo/src/dvo_convert.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert.c	(revision 19185)
@@ -288,4 +288,5 @@
   CONVERT_FORMAT ("DVO_IMAGE_PS1_DEV_1",       PS1_DEV_1,       PS1_DEV_1);
   CONVERT_FORMAT ("DVO_IMAGE_PS1_DEV_2",       PS1_DEV_2,       PS1_DEV_2);
+  CONVERT_FORMAT ("DVO_IMAGE_PS1_DEV_3",       PS1_DEV_3,       PS1_DEV_3);
 # undef CONVERT_FORMAT
 
@@ -321,4 +322,5 @@
       FORMAT_CASE (PS1_DEV_1,       PS1_DEV_1);
       FORMAT_CASE (PS1_DEV_2,       PS1_DEV_2);
+      FORMAT_CASE (PS1_DEV_3,       PS1_DEV_3);
 # undef FORMAT_CASE
 
@@ -370,4 +372,5 @@
       FORMAT_CASE (PS1_DEV_1,       PS1_DEV_1);
       FORMAT_CASE (PS1_DEV_2,       PS1_DEV_2);
+      FORMAT_CASE (PS1_DEV_3,       PS1_DEV_3);
 # undef FORMAT_CASE
 
Index: trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_1.c	(revision 19185)
@@ -194,5 +194,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name);
+
+    strncpy (out[i].name, in[i].name, 63); // out[128], in[64]
+    out[i].name[63] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
@@ -249,5 +251,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name);
+
+    strncpy (out[i].name, in[i].name, 63); // out[128], in[64]
+    out[i].name[63] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
Index: trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_2.c	(revision 19185)
@@ -200,5 +200,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name);
+
+    strncpy (out[i].name, in[i].name, 63); // out[128], int[64]
+    out[i].name[63] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
@@ -256,5 +258,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name);
+
+    strncpy (out[i].name, in[i].name, 63); // in[128], out[64]
+    out[i].name[63] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
Index: trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_3.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_3.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_PS1_DEV_3.c	(revision 19185)
@@ -3,5 +3,121 @@
 /* convert PS1_DEV_3 formats to internal formats */
 
-// XXX I am not yet ready to commit to a full PS1_DEV_3 release, but we can add photcode here for now
+// XXX EAM I am not yet ready to commit to a full PS1_DEV_3 release, but I am providing image and photcode conversion
+
+Image *Image_PS1_DEV_3_ToInternal (Image_PS1_DEV_3 *in, int Nvalues) {
+
+  int i;
+  Image *out;
+
+  ALLOCATE (out, Image, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
+
+    strncpy (out[i].name, in[i].name, 127); // out[128], in[128]
+    out[i].name[127] = 0; // force termination
+
+    out[i].tzero    	    = in[i].tzero;
+    out[i].nstar    	    = in[i].nstar;
+    out[i].secz	    	    = in[i].secz;
+    out[i].NX	    	    = in[i].NX;
+    out[i].NY	    	    = in[i].NY;
+    out[i].apmifit  	    = in[i].apmifit;
+    out[i].dapmifit 	    = in[i].dapmifit;
+    out[i].Mcal	    	    = in[i].Mcal;
+    out[i].dMcal    	    = in[i].dMcal;
+    out[i].Xm	    	    = in[i].Xm;
+    out[i].photcode   	    = in[i].photcode;
+    out[i].exptime  	    = in[i].exptime;
+    out[i].sidtime  	    = in[i].sidtime;
+    out[i].latitude  	    = in[i].latitude;
+    out[i].detection_limit  = in[i].detection_limit;
+    out[i].saturation_limit = in[i].saturation_limit;
+    out[i].cerror	    = in[i].cerror;
+    out[i].fwhm_x	    = in[i].fwhm_x;
+    out[i].fwhm_y	    = in[i].fwhm_y;
+    out[i].trate	    = in[i].trate;
+    out[i].code		    = in[i].code;
+    out[i].ccdnum	    = in[i].ccdnum;
+    out[i].imageID	    = in[i].imageID;
+    out[i].externID	    = in[i].externID;
+    out[i].sourceID	    = in[i].sourceID;
+
+    out[i].order	    = in[i].order;
+    out[i].Mx		    = in[i].Mx;
+    out[i].My		    = in[i].My;
+    out[i].Mxx		    = in[i].Mxx;
+    out[i].Mxy		    = in[i].Mxy;
+    out[i].Myy		    = in[i].Myy;
+    out[i].Mxxx		    = in[i].Mxxx;
+    out[i].Mxxy		    = in[i].Mxxy;
+    out[i].Mxyy		    = in[i].Mxyy;
+    out[i].Myyy		    = in[i].Myyy;
+    out[i].Mxxxx	    = in[i].Mxxxx;
+    out[i].Mxxxy	    = in[i].Mxxxy;
+    out[i].Mxxyy	    = in[i].Mxxyy;
+    out[i].Mxyyy	    = in[i].Mxyyy;
+    out[i].Myyyy	    = in[i].Myyyy;
+  }
+  return (out);
+}
+
+Image_PS1_DEV_3 *ImageInternalTo_PS1_DEV_3 (Image *in, int Nvalues) {
+
+  int i;
+  Image_PS1_DEV_3 *out;
+
+  ALLOCATE (out, Image_PS1_DEV_3, Nvalues);
+
+  for (i = 0; i < Nvalues; i++) {
+    memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
+
+    strncpy (out[i].name, in[i].name, 127); // out[128], in[128]
+    out[i].name[127] = 0; // force termination
+
+    out[i].tzero    	    = in[i].tzero;
+    out[i].nstar    	    = in[i].nstar;
+    out[i].secz	    	    = in[i].secz;
+    out[i].NX	    	    = in[i].NX;
+    out[i].NY	    	    = in[i].NY;
+    out[i].apmifit  	    = in[i].apmifit;
+    out[i].dapmifit 	    = in[i].dapmifit;
+    out[i].Mcal	    	    = in[i].Mcal;
+    out[i].dMcal    	    = in[i].dMcal;
+    out[i].Xm	    	    = in[i].Xm;
+    out[i].photcode   	    = in[i].photcode;
+    out[i].exptime  	    = in[i].exptime;
+    out[i].sidtime  	    = in[i].sidtime;
+    out[i].latitude  	    = in[i].latitude;
+    out[i].detection_limit  = in[i].detection_limit;
+    out[i].saturation_limit = in[i].saturation_limit;
+    out[i].cerror	    = in[i].cerror;
+    out[i].fwhm_x	    = in[i].fwhm_x;
+    out[i].fwhm_y	    = in[i].fwhm_y;
+    out[i].trate	    = in[i].trate;
+    out[i].code		    = in[i].code;
+    out[i].ccdnum	    = in[i].ccdnum;
+    out[i].imageID	    = in[i].imageID;
+    out[i].externID	    = in[i].externID;
+    out[i].sourceID	    = in[i].sourceID;
+
+    out[i].order	    = in[i].order;
+    out[i].Mx		    = in[i].Mx;
+    out[i].My		    = in[i].My;
+    out[i].Mxx		    = in[i].Mxx;
+    out[i].Mxy		    = in[i].Mxy;
+    out[i].Myy		    = in[i].Myy;
+    out[i].Mxxx		    = in[i].Mxxx;
+    out[i].Mxxy		    = in[i].Mxxy;
+    out[i].Mxyy		    = in[i].Mxyy;
+    out[i].Myyy		    = in[i].Myyy;
+    out[i].Mxxxx	    = in[i].Mxxxx;
+    out[i].Mxxxy	    = in[i].Mxxxy;
+    out[i].Mxxyy	    = in[i].Mxxyy;
+    out[i].Mxyyy	    = in[i].Mxyyy;
+    out[i].Myyyy	    = in[i].Myyyy;
+  }
+  return (out);
+}
 
 PhotCode_PS1_DEV_3 *PhotCode_Internal_To_PS1_DEV_3 (PhotCode *in, int Nvalues) {
Index: trunk/Ohana/src/libdvo/src/dvo_convert_elixir.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_elixir.c	(revision 19185)
@@ -199,5 +199,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name); // out[64], in[32]
+
+    strncpy (out[i].name, in[i].name, 31); // in[32], out[128]
+    out[i].name[31] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
@@ -258,5 +260,6 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strncpy (out[i].name, in[i].name, 31); // out[32], in[64]
+
+    strncpy (out[i].name, in[i].name, 31); // out[32], in[128]
     out[i].name[31] = 0; // force termination
 
Index: trunk/Ohana/src/libdvo/src/dvo_convert_loneos.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_loneos.c	(revision 19185)
@@ -189,5 +189,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name); // out[64], in[32]
+
+    strncpy (out[i].name, in[i].name, 31); // in[32], out[128]
+    out[i].name[31] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
@@ -245,5 +247,6 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strncpy (out[i].name, in[i].name, 31); // out[32], in[64]
+
+    strncpy (out[i].name, in[i].name, 31); // out[32], in[128]
     out[i].name[31] = 0; // force termination
 
Index: trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_0.c	(revision 19185)
@@ -202,5 +202,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name); // out[64], in[32]
+
+    strncpy (out[i].name, in[i].name, 31); // out[128], in[32]
+    out[i].name[31] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
@@ -257,5 +259,6 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strncpy (out[i].name, in[i].name, 31); // out[32], in[64]
+
+    strncpy (out[i].name, in[i].name, 31); // out[32], in[128]
     out[i].name[31] = 0; // force termination
 
Index: trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_convert_panstarrs_DEV_1.c	(revision 19185)
@@ -202,5 +202,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name);
+
+    strncpy (out[i].name, in[i].name, 63); // in[64], out[128]
+    out[i].name[63] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
@@ -257,5 +259,7 @@
   for (i = 0; i < Nvalues; i++) {
     memcpy (&out[i].coords, &in[i].coords, sizeof(Coords));
-    strcpy (out[i].name, in[i].name);
+
+    strncpy (out[i].name, in[i].name, 63); // in[128], out[64]
+    out[i].name[63] = 0; // force termination
 
     out[i].tzero    	    = in[i].tzero;
Index: trunk/Ohana/src/libdvo/src/dvo_image.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_image.c	(revision 19130)
+++ trunk/Ohana/src/libdvo/src/dvo_image.c	(revision 19185)
@@ -195,4 +195,5 @@
   if (db[0].format == DVO_FORMAT_PS1_DEV_1)       gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_DEV_1");
   if (db[0].format == DVO_FORMAT_PS1_DEV_2)       gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_DEV_2");
+  if (db[0].format == DVO_FORMAT_PS1_DEV_3)       gfits_modify (&db[0].header, "FORMAT", "%s", 1, "PS1_DEV_3");
   
   return;
