Index: /trunk/psModules/test/camera/Makefile.am
===================================================================
--- /trunk/psModules/test/camera/Makefile.am	(revision 16007)
+++ /trunk/psModules/test/camera/Makefile.am	(revision 16008)
@@ -26,6 +26,6 @@
 	tap_pmFPACellSquish \
 	tap_pmReadoutStack \
-	tap_pmReadoutFake
-
+	tap_pmReadoutFake \
+	tap_pmFPACopy
 
 if BUILD_TESTS
Index: /trunk/psModules/test/camera/tap_pmFPA.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPA.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPA.c	(revision 16008)
@@ -104,5 +104,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
     fpa->hdu = pmHDUAlloc(NULL);
Index: /trunk/psModules/test/camera/tap_pmFPACellSquish.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPACellSquish.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPACellSquish.c	(revision 16008)
@@ -146,5 +146,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
     psArrayRealloc(fpa->chips, NUM_CHIPS);
Index: /trunk/psModules/test/camera/tap_pmFPAExtent.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPAExtent.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPAExtent.c	(revision 16008)
@@ -145,5 +145,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
 
Index: /trunk/psModules/test/camera/tap_pmFPAFlags.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPAFlags.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPAFlags.c	(revision 16008)
@@ -168,5 +168,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
     psArrayRealloc(fpa->chips, NUM_CHIPS);
Index: /trunk/psModules/test/camera/tap_pmFPAHeader.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPAHeader.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPAHeader.c	(revision 16008)
@@ -147,5 +147,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
 
Index: /trunk/psModules/test/camera/tap_pmFPAMaskW.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPAMaskW.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPAMaskW.c	(revision 16008)
@@ -157,5 +157,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
 
Index: /trunk/psModules/test/camera/tap_pmFPAReadWrite.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPAReadWrite.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPAReadWrite.c	(revision 16008)
@@ -147,5 +147,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
 
Index: /trunk/psModules/test/camera/tap_pmFPAUtils.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPAUtils.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPAUtils.c	(revision 16008)
@@ -139,5 +139,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
 
Index: /trunk/psModules/test/camera/tap_pmFPAView.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmFPAView.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmFPAView.c	(revision 16008)
@@ -9,5 +9,4 @@
 */
 
-#define	ERR_TRACE_LEVEL		0
 #define CHIP_ALLOC_NAME        "ChipName"
 #define CELL_ALLOC_NAME        "CellName"
@@ -152,5 +151,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
     fpa->hdu = pmHDUAlloc("fpaExtName");
Index: /trunk/psModules/test/camera/tap_pmHDUUtils.c
===================================================================
--- /trunk/psModules/test/camera/tap_pmHDUUtils.c	(revision 16007)
+++ /trunk/psModules/test/camera/tap_pmHDUUtils.c	(revision 16008)
@@ -148,5 +148,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
     fpa->hdu = pmHDUAlloc("fpaExtName");
Index: /trunk/psModules/test/concepts/tap_pmConceptsAverage.c
===================================================================
--- /trunk/psModules/test/concepts/tap_pmConceptsAverage.c	(revision 16007)
+++ /trunk/psModules/test/concepts/tap_pmConceptsAverage.c	(revision 16008)
@@ -145,5 +145,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
     psArrayRealloc(fpa->chips, NUM_CHIPS);
Index: /trunk/psModules/test/concepts/tap_pmConceptsUpdate.c
===================================================================
--- /trunk/psModules/test/concepts/tap_pmConceptsUpdate.c	(revision 16007)
+++ /trunk/psModules/test/concepts/tap_pmConceptsUpdate.c	(revision 16008)
@@ -81,5 +81,5 @@
     cell->hdu = pmHDUAlloc("cellExtName");
     for (int i = 0 ; i < NUM_READOUTS ; i++) {
-        cell->readouts->data[i] = generateSimpleReadout(cell);
+        cell->readouts->data[i] = psMemDecrRefCounter((psPtr) generateSimpleReadout(cell));
     }
 
@@ -105,8 +105,6 @@
     }
 
-    //XXX: Should the region be set some other way?  Like through the various config files?
-//    psRegion *region = psRegionAlloc(0.0, TEST_NUM_COLS-1, 0.0, TEST_NUM_ROWS-1);
     psRegion *region = psRegionAlloc(0.0, 0.0, 0.0, 0.0);
-    // You shouldn't have to remove the key from the metadata.  Find out how to simply change the key value.
+    // You shouldn't have to remove the key from the metadata.
     psMetadataRemoveKey(cell->concepts, "CELL.TRIMSEC");
     psMetadataAddPtr(cell->concepts, PS_LIST_TAIL|PS_META_REPLACE, "CELL.TRIMSEC", PS_DATA_REGION, "I am a region", region);
@@ -128,5 +126,5 @@
     psArrayRealloc(chip->cells, NUM_CELLS);
     for (int i = 0 ; i < NUM_CELLS ; i++) {
-        chip->cells->data[i] = generateSimpleCell(chip);
+        chip->cells->data[i] = psMemDecrRefCounter((psPtr) generateSimpleCell(chip));
     }
 
@@ -148,46 +146,15 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
 
     psArrayRealloc(fpa->chips, NUM_CHIPS);
     for (int i = 0 ; i < NUM_CHIPS ; i++) {
-        fpa->chips->data[i] = generateSimpleChip(fpa);
-    }
-
-    // XXX: Eventually, when you finish the pmConcepts tests, add full concept
-    // reading code from wherever.
+        fpa->chips->data[i] = psMemDecrRefCounter((psPtr) generateSimpleChip(fpa));
+    }
     pmConceptsBlankFPA(fpa);
-//    bool mdok;
-//    psMetadata *fileData = psMetadataLookupMetadata(&mdok, fpa->hdu->format, "FILE");
-//    char *fpaNameHdr = psMetadataLookupStr(&mdok, fileData, "FPA.NAME");
-//    psMetadataAddStr(fpa->concepts, PS_LIST_TAIL, "FPA.NAME", PS_META_REPLACE, NULL, fpaNameHdr);
-
     return(fpa);
-}
-
-// XXX: This should only be necessary until the psFree() functions for
-// FPA/chip/cell/readout correctly free all child chips/cells/readouts
-void myFreeCell(pmCell *cell)
-{
-    for (int k = 0 ; k < cell->readouts->n ; k++) {
-        psFree(cell->readouts->data[k]);
-    }
-    psFree(cell);
-}
-
-void myFreeChip(pmChip *chip) {
-    for (int j = 0 ; j < chip->cells->n ; j++) {
-        myFreeCell(chip->cells->data[j]);
-    }
-    psFree(chip);
-}
-
-void myFreeFPA(pmFPA *fpa)
-{
-    for (int i = 0 ; i < fpa->chips->n ; i++) {
-        myFreeChip(fpa->chips->data[i]);
-    }
-    psFree(fpa);
 }
 
@@ -273,5 +240,5 @@
         }
 
-        myFreeFPA(fpa);
+        psFree(fpa);
         psFree(camera);
         ok(!psMemCheckLeaks (id, NULL, NULL, false), "no memory leaks");
Index: /trunk/psModules/test/objects/tap_pmPSF_IO.c
===================================================================
--- /trunk/psModules/test/objects/tap_pmPSF_IO.c	(revision 16007)
+++ /trunk/psModules/test/objects/tap_pmPSF_IO.c	(revision 16008)
@@ -147,5 +147,7 @@
     fpa->toSky = psProjectionAlloc(0.0,0.0,10.0,10.0,PS_PROJ_TAN);
     psMetadataAddS32(fpa->analysis, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
-    psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    if (camera != NULL) {
+        psMetadataAddS32((psMetadata *) fpa->camera, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
+    }
     psMetadataAddS32(fpa->concepts, PS_LIST_HEAD, MISC_NAME, 0, NULL, MISC_NUM);
     psArrayRealloc(fpa->chips, NUM_CHIPS);
