Index: trunk/Ohana/src/libdvo/include/dvodb.h
===================================================================
--- trunk/Ohana/src/libdvo/include/dvodb.h	(revision 39307)
+++ trunk/Ohana/src/libdvo/include/dvodb.h	(revision 39308)
@@ -404,4 +404,12 @@
       IMAGE_Y_UL_FP,
       IMAGE_Y_UR_FP,
+      IMAGE_R_LL,
+      IMAGE_R_LR,
+      IMAGE_R_UL,
+      IMAGE_R_UR,
+      IMAGE_D_LL,
+      IMAGE_D_LR,
+      IMAGE_D_UL,
+      IMAGE_D_UR,
       IMAGE_X_ERR_SYS,
       IMAGE_Y_ERR_SYS,
Index: trunk/Ohana/src/libdvo/src/HostTable.c
===================================================================
--- trunk/Ohana/src/libdvo/src/HostTable.c	(revision 39307)
+++ trunk/Ohana/src/libdvo/src/HostTable.c	(revision 39308)
@@ -63,6 +63,27 @@
 
   // can I access the file for read? (not backup, not readwrite, not verbose)
-  int status = check_file_access (filename, FALSE, FALSE, FALSE);
-  return status;
+  if (!check_file_access (filename, FALSE, FALSE, FALSE)) {
+    free (filename);
+    return FALSE;
+  }
+
+  /* check permission to read file */
+  struct stat filestat;
+
+  int status = stat (filename, &filestat);
+  if (status == 0) { /* file exists, are permissions OK? */
+    uid_t uid = getuid();
+    gid_t gid = getgid();
+
+    if (uid == filestat.st_uid) {
+      if (filestat.st_mode & S_IRUSR) return TRUE;
+    }
+    if (gid == filestat.st_gid) {
+      if (filestat.st_mode & S_IRGRP) return TRUE;
+    }
+    if (filestat.st_mode & S_IROTH) return TRUE;
+  }
+
+  return FALSE;
 }
 
Index: trunk/Ohana/src/libdvo/src/dbExtractImages.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbExtractImages.c	(revision 39307)
+++ trunk/Ohana/src/libdvo/src/dbExtractImages.c	(revision 39308)
@@ -348,4 +348,25 @@
       break;
 
+    case IMAGE_R_LL:
+    case IMAGE_D_LL:
+      XY_to_RD (&x, &y, 0.0, 0.0, &image[N].coords);
+      value.Flt = (field->ID == IMAGE_R_LL) ? x : y;
+      break;
+    case IMAGE_R_LR:
+    case IMAGE_D_LR:
+      XY_to_RD (&x, &y, image[N].NX, 0.0, &image[N].coords);
+      value.Flt = (field->ID == IMAGE_R_LR) ? x : y;
+      break;
+    case IMAGE_R_UL:
+    case IMAGE_D_UL:
+      XY_to_RD (&x, &y, 0.0, image[N].NY, &image[N].coords);
+      value.Flt = (field->ID == IMAGE_R_UL) ? x : y;
+      break;
+    case IMAGE_R_UR:
+    case IMAGE_D_UR:
+      XY_to_RD (&x, &y, image[N].NX, image[N].NY, &image[N].coords);
+      value.Flt = (field->ID == IMAGE_R_UR) ? x : y;
+      break;
+
     case IMAGE_X_ERR_SYS:
       value.Flt = image[N].dXpixSys;
Index: trunk/Ohana/src/libdvo/src/dbFields.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dbFields.c	(revision 39307)
+++ trunk/Ohana/src/libdvo/src/dbFields.c	(revision 39308)
@@ -867,4 +867,13 @@
   if (!strcasecmp (fieldName, "Y_UR_FP"  )) ESCAPE (IMAGE_Y_UR_FP,   OPIHI_FLT);
 
+  if (!strcasecmp (fieldName, "R_LL"  )) ESCAPE (IMAGE_R_LL,   OPIHI_FLT);
+  if (!strcasecmp (fieldName, "R_LR"  )) ESCAPE (IMAGE_R_LR,   OPIHI_FLT);
+  if (!strcasecmp (fieldName, "R_UL"  )) ESCAPE (IMAGE_R_UL,   OPIHI_FLT);
+  if (!strcasecmp (fieldName, "R_UR"  )) ESCAPE (IMAGE_R_UR,   OPIHI_FLT);
+  if (!strcasecmp (fieldName, "D_LL"  )) ESCAPE (IMAGE_D_LL,   OPIHI_FLT);
+  if (!strcasecmp (fieldName, "D_LR"  )) ESCAPE (IMAGE_D_LR,   OPIHI_FLT);
+  if (!strcasecmp (fieldName, "D_UL"  )) ESCAPE (IMAGE_D_UL,   OPIHI_FLT);
+  if (!strcasecmp (fieldName, "D_UR"  )) ESCAPE (IMAGE_D_UR,   OPIHI_FLT);
+
   if (!strcasecmp (fieldName, "dX_SYS"  )) ESCAPE (IMAGE_X_ERR_SYS,  OPIHI_FLT);
   if (!strcasecmp (fieldName, "dY_SYS"  )) ESCAPE (IMAGE_Y_ERR_SYS,  OPIHI_FLT);
Index: trunk/Ohana/src/libdvo/src/dvo_catalog_split.c
===================================================================
--- trunk/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 39307)
+++ trunk/Ohana/src/libdvo/src/dvo_catalog_split.c	(revision 39308)
@@ -815,4 +815,5 @@
 
 /* save_catalog_split writes all data currently in memory to disk */
+// this function cannot shrink the output file sizes
 int dvo_catalog_save_split (Catalog *catalog, char VERBOSE) {
 
@@ -862,9 +863,9 @@
   gfits_modify (&catalog[0].header, "NMEAS",     OFF_T_FMT, 1,  Nmeasure_disk_new);
   gfits_modify (&catalog[0].header, "NMISS",     OFF_T_FMT, 1,  Nmissing_disk_new);
-  gfits_modify (&catalog[0].header, "NSECFILT",  "%d",      1,  Nsecfilt);
+  gfits_modify (&catalog[0].header, "NSECFILT",       "%d", 1,  Nsecfilt);
   gfits_modify (&catalog[0].header, "NLENSING",  OFF_T_FMT, 1,  Nlensing_disk_new);
   gfits_modify (&catalog[0].header, "NLENSOBJ",  OFF_T_FMT, 1,  Nlensobj_disk_new);
   gfits_modify (&catalog[0].header, "NSTARPAR",  OFF_T_FMT, 1,  Nstarpar_disk_new);
-  gfits_modify (&catalog[0].header, "NGALPHOT", OFF_T_FMT, 1,  Ngalphot_disk_new);
+  gfits_modify (&catalog[0].header, "NGALPHOT",  OFF_T_FMT, 1,  Ngalphot_disk_new);
 
   gfits_modify_alt (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
@@ -956,5 +957,4 @@
     }
     if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
-
 
     gfits_free_header (&header);
@@ -1484,5 +1484,4 @@
   int Nsecfilt;
   off_t Naverage_disk_new, Nmeasure_disk_new, Nmissing_disk_new, Nsecfilt_disk_new, Nlensing_disk_new, Nlensobj_disk_new, Nstarpar_disk_new, Ngalphot_disk_new;
-  off_t first, start, Nrows;
 
   ftable.header = &header;
@@ -1491,5 +1490,5 @@
   primary = NULL;
   
-  // skip empty catalogs: it is illegal to have Measures without corresponding Averages
+  // it is illegal to use this function in a partial load mode
   if (catalog[0].Naverage_off > 0) {
     fprintf (stderr, "ERROR: only partial catalog (Average) was loaded\n");
@@ -1525,4 +1524,5 @@
   }
 
+  // skip empty catalogs: it is illegal to have Measures without corresponding Averages
   Naverage_disk_new = catalog[0].Naverage;
   if (Naverage_disk_new == 0) {
@@ -1545,4 +1545,6 @@
   }
 
+  if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
+
   Nmeasure_disk_new = catalog[0].Nmeasure;
   Nmissing_disk_new = catalog[0].Nmissing;
@@ -1554,23 +1556,26 @@
 
   /* make sure header is consistent with data */
-  gfits_modify (&catalog[0].header, "NSTARS",   OFF_T_FMT, 1,  Naverage_disk_new);
-  gfits_modify (&catalog[0].header, "NMEAS",    OFF_T_FMT, 1,  Nmeasure_disk_new);
-  gfits_modify (&catalog[0].header, "NMISS",    OFF_T_FMT, 1,  Nmissing_disk_new);
-  gfits_modify (&catalog[0].header, "NSECFILT", "%d", 1, Nsecfilt);
-  gfits_modify (&catalog[0].header, "NLENSING", OFF_T_FMT, 1,  Nlensing_disk_new);
-  gfits_modify (&catalog[0].header, "NLENSOBJ", OFF_T_FMT, 1,  Nlensobj_disk_new);
-  gfits_modify (&catalog[0].header, "NSTARPAR", OFF_T_FMT, 1,  Nstarpar_disk_new);
-  gfits_modify (&catalog[0].header, "NGALPHOT", OFF_T_FMT, 1, Ngalphot_disk_new);
+  gfits_modify (&catalog[0].header, "NSTARS",    OFF_T_FMT, 1,  Naverage_disk_new);
+  gfits_modify (&catalog[0].header, "NMEAS",     OFF_T_FMT, 1,  Nmeasure_disk_new);
+  gfits_modify (&catalog[0].header, "NMISS",     OFF_T_FMT, 1,  Nmissing_disk_new);
+  gfits_modify (&catalog[0].header, "NSECFILT",       "%d", 1,  Nsecfilt);
+  gfits_modify (&catalog[0].header, "NLENSING",  OFF_T_FMT, 1,  Nlensing_disk_new);
+  gfits_modify (&catalog[0].header, "NLENSOBJ",  OFF_T_FMT, 1,  Nlensobj_disk_new);
+  gfits_modify (&catalog[0].header, "NSTARPAR",  OFF_T_FMT, 1,  Nstarpar_disk_new);
+  gfits_modify (&catalog[0].header, "NGALPHOT",  OFF_T_FMT, 1,  Ngalphot_disk_new);
+
   gfits_modify_alt (&catalog[0].header, "EXTEND",   "%t", 1, TRUE);
   gfits_modify (&catalog[0].header, "OBJID",    "%d", 1, catalog[0].objID);
 
-  /* in split mode, we can save only part of the data */ 
+  /* in split mode, we can save only part of the data, but not using this function (use e.g., dvo_catalog_update_split) */ 
+
+  if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
 
   /*** Average Table ***/
   if ((catalog[0].catflags & DVO_LOAD_AVERAGE) && (catalog[0].average != NULL)) {
 
-    first  = 0;                    // first row in memory to write
-    start  = catalog[0].Naverage_off; // first disk row to write
-    Nrows  = catalog[0].Naverage - first;
+    off_t first  = 0;                    // first row in memory to write
+    off_t start  = catalog[0].Naverage_off; // first disk row to write
+    off_t Nrows  = catalog[0].Naverage - first;
 
     assert (Nrows >= 0);
@@ -1579,9 +1584,18 @@
     assert (catalog[0].Naverage_disk >= catalog[0].Naverage_off);
 
+    /* convert internal to external format : also results in a byte-swapped, scaled output
+       table.  Note that ftable is newly allocated.
+    */
+    
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (start, Nrows, Naverage_disk_new, catalog->catcompress);
+
     /* convert internal to external format */
-    if (!AverageToFtable (&ftable, &catalog[0].average[first], Nrows, catalog[0].catformat, primary, TRUE)) {
-      fprintf (stderr, "trouble converting format\n");
-      goto failure;
-    }
+    if (!AverageToFtable (&ftable, &catalog[0].average[first], Nrows, catalog[0].catformat, primary, swapFromNative)) {
+      fprintf (stderr, "trouble converting format\n");
+      goto failure;
+    }
+
+    if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
 
     if (!dvo_catalog_save_subcat (catalog, &ftable, start, Nrows, catalog[0].Naverage_disk, Naverage_disk_new)) {
@@ -1589,4 +1603,7 @@
       goto failure;
     }
+
+    if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
+
     gfits_free_header (&header);
     gfits_free_table (&ftable);
@@ -1602,12 +1619,12 @@
       goto failure;
     }
-  }
+   }
 
   /*** Measure Table ***/
-  if (catalog[0].measure != NULL) {
-
-    first  = catalog[0].Nmeasure_disk - catalog[0].Nmeasure_off;  // first row in memory to write
-    start  = catalog[0].Nmeasure_disk; // first disk row to write
-    Nrows  = catalog[0].Nmeasure - first;
+  if ((catalog[0].catflags & DVO_LOAD_MEASURE) && (catalog[0].measure != NULL)) {
+
+    off_t first  = 0;                    // first row in memory to write
+    off_t start  = catalog[0].Nmeasure_off; // first disk row to write
+    off_t Nrows  = catalog[0].Nmeasure - first;
 
     assert (Nrows >= 0);
@@ -1616,16 +1633,26 @@
     assert (catalog[0].Nmeasure_disk >= catalog[0].Nmeasure_off);
 
+    if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
+
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (start, Nrows, Nmeasure_disk_new, catalog->catcompress);
+
     // convert to external table format
     // XXX does catalog.measure have averef correctly set up?
-    if (!MeasureToFtable (&ftable, catalog[0].average, &catalog[0].measure[first], Nrows, catalog[0].catformat, TRUE)) {
-      fprintf (stderr, "trouble converting format\n");
-      goto failure;
-    }
+    if (!MeasureToFtable (&ftable, catalog[0].average, &catalog[0].measure[first], Nrows, catalog[0].catformat, swapFromNative)) {
+      fprintf (stderr, "trouble converting format\n");
+      goto failure;
+    }
+
+    if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
 
     // write out Measure table
+    catalog->measure_catalog->catcompress = catalog->catcompress; // XXX this is a bit of a hack, should be done in an api
     if (!dvo_catalog_save_subcat (catalog[0].measure_catalog, &ftable, start, Nrows, catalog[0].Nmeasure_disk, Nmeasure_disk_new)) {
       fprintf (stderr, "trouble writing Measure table\n");
       goto failure;
     }
+    if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
+
     gfits_free_header (&header);
     gfits_free_table (&ftable);
@@ -1636,6 +1663,5 @@
 
   /*** Missing Table ***/
-
-  if (catalog[0].missing != NULL) {
+  if ((catalog[0].catflags & DVO_LOAD_MISSING) && (catalog[0].missing != NULL)) {
 
     if (catalog[0].Nmissing_off != 0) {
@@ -1644,6 +1670,9 @@
     }
 
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (catalog[0].Nmissing_off, catalog[0].Nmissing, Nmissing_disk_new, catalog->catcompress);
+
     // convert to external table format
-    if (!gfits_table_set_Missing (&ftable, catalog[0].missing, catalog[0].Nmissing, TRUE)) {
+    if (!gfits_table_set_Missing (&ftable, catalog[0].missing, catalog[0].Nmissing, swapFromNative)) {
       fprintf (stderr, "trouble converting format\n");
       goto failure;
@@ -1651,4 +1680,5 @@
 
     // write out Missing table (must write out entire table)
+    catalog->missing_catalog->catcompress = catalog->catcompress; // XXX this is a bit of a hack, should be done in an api
     if (!dvo_catalog_save_subcat (catalog[0].missing_catalog, &ftable, 0, catalog[0].Nmissing, catalog[0].Nmissing, catalog[0].Nmissing)) {
       fprintf (stderr, "trouble writing Missing Table\n");
@@ -1660,21 +1690,32 @@
 
   /*** Secfilt Table ***/
-  if (catalog[0].secfilt != NULL) {
-
-    first  = catalog[0].Nsecfilt_disk - catalog[0].Nsecfilt_off;  // first row in memory to write
-    start  = catalog[0].Nsecfilt_disk; // first disk row to write
-    Nrows  = catalog[0].Nsecfilt_mem - first;
-
-    assert (Nrows >= 0);
-    assert (first >= 0);
+  if ((catalog[0].catflags & DVO_LOAD_SECFILT) && (catalog[0].secfilt != NULL)) {
+
+    off_t first  = 0;                    // first row in memory to write
+    off_t start  = catalog[0].Nsecfilt_off; // first disk row to write
+    off_t Nitems = catalog[0].Naverage*Nsecfilt;
+    off_t Nrows  = Nitems - first;
+
+    assert (Nrows >= 0);
+    assert (first >= 0);
+    assert (first <= Nitems);
     assert (catalog[0].Nsecfilt_disk >= catalog[0].Nsecfilt_off);
+    // XXX check these for consistency...
+
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (start, Nrows, Nsecfilt_disk_new, catalog->catcompress);
+
+    if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
 
     // convert to external table format
-    if (!SecFiltToFtable (&ftable, &secfilt[first], Nrows, catalog[0].catformat, TRUE)) {
-      fprintf (stderr, "trouble converting format\n");
-      goto failure;
-    }
+    if (!SecFiltToFtable (&ftable, &secfilt[first], Nrows, catalog[0].catformat, swapFromNative)) {
+      fprintf (stderr, "trouble converting format\n");
+      goto failure;
+    }
+
+    if (OHANA_MEMCHECK) ohana_memcheck_func (TRUE);
 
     // write out SecFilt table
+    catalog->secfilt_catalog->catcompress = catalog->catcompress; // XXX this is a bit of a hack, should be done in an api
     if (!dvo_catalog_save_subcat (catalog[0].secfilt_catalog, &ftable, start, Nrows, catalog[0].Nsecfilt_disk, Nsecfilt_disk_new)) {
       fprintf (stderr, "failure writing SecFilt table\n");
@@ -1686,9 +1727,9 @@
 
   /*** Lensing Table ***/
-  if (catalog[0].lensing != NULL) {
-
-    first  = catalog[0].Nlensing_disk - catalog[0].Nlensing_off;  // first row in memory to write
-    start  = catalog[0].Nlensing_disk; // first disk row to write
-    Nrows  = catalog[0].Nlensing - first;
+  if ((catalog[0].catflags & DVO_LOAD_LENSING) && catalog[0].lensing && Nlensing_disk_new) {
+
+    off_t first  = 0;                    // first row in memory to write
+    off_t start  = catalog[0].Nlensing_off; // first disk row to write
+    off_t Nrows  = catalog[0].Nlensing - first;
 
     assert (Nrows >= 0);
@@ -1697,7 +1738,9 @@
     assert (catalog[0].Nlensing_disk >= catalog[0].Nlensing_off);
 
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (start, Nrows, Nlensing_disk_new, catalog->catcompress);
+
     // convert to external table format
-    // XXX does catalog.lensing have averef correctly set up?
-    if (!LensingToFtable (&ftable, &catalog[0].lensing[first], Nrows, catalog[0].catformat, TRUE)) {
+    if (!LensingToFtable (&ftable, &catalog[0].lensing[first], Nrows, catalog[0].catformat, swapFromNative)) {
       fprintf (stderr, "trouble converting format\n");
       goto failure;
@@ -1705,4 +1748,5 @@
 
     // write out Lensing table
+    catalog->lensing_catalog->catcompress = catalog->catcompress; // XXX this is a bit of a hack, should be done in an api
     if (!dvo_catalog_save_subcat (catalog[0].lensing_catalog, &ftable, start, Nrows, catalog[0].Nlensing_disk, Nlensing_disk_new)) {
       fprintf (stderr, "trouble writing Lensing table\n");
@@ -1714,9 +1758,9 @@
 
   /*** Lensobj Table ***/
-  if (catalog[0].lensobj != NULL) {
-
-    first  = catalog[0].Nlensobj_disk - catalog[0].Nlensobj_off;  // first row in memory to write
-    start  = catalog[0].Nlensobj_disk; // first disk row to write
-    Nrows  = catalog[0].Nlensobj - first;
+  if ((catalog[0].catflags & DVO_LOAD_LENSOBJ) && catalog[0].lensobj && Nlensobj_disk_new) {
+
+    off_t first  = 0;                    // first row in memory to write
+    off_t start  = catalog[0].Nlensobj_off; // first disk row to write
+    off_t Nrows  = catalog[0].Nlensobj - first;
 
     assert (Nrows >= 0);
@@ -1725,7 +1769,9 @@
     assert (catalog[0].Nlensobj_disk >= catalog[0].Nlensobj_off);
 
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (start, Nrows, Nlensobj_disk_new, catalog->catcompress);
+
     // convert to external table format
-    // XXX does catalog.lensobj have averef correctly set up?
-    if (!LensobjToFtable (&ftable, &catalog[0].lensobj[first], Nrows, catalog[0].catformat, TRUE)) {
+    if (!LensobjToFtable (&ftable, &catalog[0].lensobj[first], Nrows, catalog[0].catformat, swapFromNative)) {
       fprintf (stderr, "trouble converting format\n");
       goto failure;
@@ -1733,4 +1779,5 @@
 
     // write out Lensobj table
+    catalog->lensobj_catalog->catcompress = catalog->catcompress; // XXX this is a bit of a hack, should be done in an api
     if (!dvo_catalog_save_subcat (catalog[0].lensobj_catalog, &ftable, start, Nrows, catalog[0].Nlensobj_disk, Nlensobj_disk_new)) {
       fprintf (stderr, "trouble writing Lensobj table\n");
@@ -1742,9 +1789,9 @@
 
   /*** StarPar Table ***/
-  if (catalog[0].starpar != NULL) {
-
-    first  = catalog[0].Nstarpar_disk - catalog[0].Nstarpar_off;  // first row in memory to write
-    start  = catalog[0].Nstarpar_disk; // first disk row to write
-    Nrows  = catalog[0].Nstarpar - first;
+  if ((catalog[0].catflags & DVO_LOAD_STARPAR) && catalog[0].starpar && Nstarpar_disk_new) {
+
+    off_t first  = 0;                    // first row in memory to write
+    off_t start  = catalog[0].Nstarpar_off; // first disk row to write
+    off_t Nrows  = catalog[0].Nstarpar - first;
 
     assert (Nrows >= 0);
@@ -1753,7 +1800,9 @@
     assert (catalog[0].Nstarpar_disk >= catalog[0].Nstarpar_off);
 
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (start, Nrows, Nstarpar_disk_new, catalog->catcompress);
+
     // convert to external table format
-    // XXX does catalog.starpar have averef correctly set up?
-    if (!StarParToFtable (&ftable, &catalog[0].starpar[first], Nrows, catalog[0].catformat, TRUE)) {
+    if (!StarParToFtable (&ftable, &catalog[0].starpar[first], Nrows, catalog[0].catformat, swapFromNative)) {
       fprintf (stderr, "trouble converting format\n");
       goto failure;
@@ -1761,4 +1810,5 @@
 
     // write out StarPar table
+    catalog->starpar_catalog->catcompress = catalog->catcompress; // XXX this is a bit of a hack, should be done in an api
     if (!dvo_catalog_save_subcat (catalog[0].starpar_catalog, &ftable, start, Nrows, catalog[0].Nstarpar_disk, Nstarpar_disk_new)) {
       fprintf (stderr, "trouble writing StarPar table\n");
@@ -1770,9 +1820,9 @@
 
   /*** GalPhot Table ***/
-  if (catalog[0].galphot != NULL) {
-
-    first  = catalog[0].Ngalphot_disk - catalog[0].Ngalphot_off;  // first row in memory to write
-    start  = catalog[0].Ngalphot_disk; // first disk row to write
-    Nrows  = catalog[0].Ngalphot - first;
+  if ((catalog[0].catflags & DVO_LOAD_GALPHOT) && catalog[0].galphot && Ngalphot_disk_new) {
+
+    off_t first  = 0;                    // first row in memory to write
+    off_t start  = catalog[0].Ngalphot_off; // first disk row to write
+    off_t Nrows  = catalog[0].Ngalphot - first;
 
     assert (Nrows >= 0);
@@ -1781,7 +1831,9 @@
     assert (catalog[0].Ngalphot_disk >= catalog[0].Ngalphot_off);
 
+    // if we are going to compress, we need to receive unswapped data -- 
+    int swapFromNative = !output_is_compressed (start, Nrows, Ngalphot_disk_new, catalog->catcompress);
+
     // convert to external table format
-    // XXX does catalog.galphot have averef correctly set up?
-    if (!GalPhotToFtable (&ftable, &catalog[0].galphot[first], Nrows, catalog[0].catformat, TRUE)) {
+    if (!GalPhotToFtable (&ftable, &catalog[0].galphot[first], Nrows, catalog[0].catformat, swapFromNative)) {
       fprintf (stderr, "trouble converting format\n");
       goto failure;
@@ -1789,4 +1841,5 @@
 
     // write out GalPhot table
+    catalog->galphot_catalog->catcompress = catalog->catcompress; // XXX this is a bit of a hack, should be done in an api
     if (!dvo_catalog_save_subcat (catalog[0].galphot_catalog, &ftable, start, Nrows, catalog[0].Ngalphot_disk, Ngalphot_disk_new)) {
       fprintf (stderr, "trouble writing GalPhot table\n");
@@ -1807,4 +1860,6 @@
  failure:
   /* free temp storage */
+  gfits_free_header (&header);
+  gfits_free_table (&ftable);
   if (primary != NULL) {
     free (primary);
