Index: trunk/psModules/test/concepts/tap_pmConceptsAverage.c
===================================================================
--- trunk/psModules/test/concepts/tap_pmConceptsAverage.c	(revision 15650)
+++ trunk/psModules/test/concepts/tap_pmConceptsAverage.c	(revision 15986)
@@ -82,5 +82,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));
     }
 
@@ -129,10 +129,6 @@
     psArrayRealloc(chip->cells, NUM_CELLS);
     for (int i = 0 ; i < NUM_CELLS ; i++) {
-        chip->cells->data[i] = generateSimpleCell(chip);
-    }
-
-    // XXX: Add code to initialize chip pmConcepts
-
-
+        chip->cells->data[i] = psMemDecrRefCounter((psPtr) generateSimpleCell(chip));
+    }
     return(chip);
 }
@@ -153,43 +149,9 @@
     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);
-}
-
 
 
@@ -219,8 +181,8 @@
 
         for (int fpaID = 0 ; fpaID < NUM_FPAS ; fpaID++) {
-            myFreeFPA(sourceFPA[fpaID]);
+            psFree(sourceFPA[fpaID]);
 	}
         psFree(sources);
-        myFreeFPA(targetFPA);
+        psFree(targetFPA);
         psFree(camera);
         ok(!psMemCheckLeaks (id, NULL, NULL, false), "no memory leaks");
@@ -245,8 +207,8 @@
 
         for (int fpaID = 0 ; fpaID < NUM_FPAS ; fpaID++) {
-            myFreeFPA(sourceFPA[fpaID]);
+            psFree(sourceFPA[fpaID]);
 	}
         psFree(sources);
-        myFreeFPA(targetFPA);
+        psFree(targetFPA);
         psFree(camera);
         ok(!psMemCheckLeaks (id, NULL, NULL, false), "no memory leaks");
@@ -261,4 +223,5 @@
         pmFPA *targetFPA = generateSimpleFPA(camera);
         pmFPA *sourceFPA[NUM_FPAS];
+        psMetadata *cameras[NUM_FPAS];
 
         // Ensure that the FPA.TIME average is computed correctly
@@ -266,5 +229,6 @@
         psF64 actualTime = 0.0;
         for (int fpaID = 0 ; fpaID < NUM_FPAS ; fpaID++) {
-            sourceFPA[fpaID] = generateSimpleFPA(camera);
+            cameras[fpaID] = psMetadataAlloc();
+            sourceFPA[fpaID] = generateSimpleFPA(cameras[fpaID]);
             psTime *fpaTime = psMetadataLookupPtr(NULL, (sourceFPA[fpaID])->concepts, "FPA.TIME");
             // Add a small value to the psTime so that we can test/ensure that pmConceptsAverageFPAs()
@@ -279,11 +243,12 @@
 	    }
 	}
-        ok(pmConceptsAverageFPAs(targetFPA, sources), "pmConceptsAverage(NULL, sources) returned FALSE");
+        // XXX: The memory leak occurs during the following single call
+        ok(pmConceptsAverageFPAs(targetFPA, sources), "pmConceptsAverage(targetFPA, sources) returned TRUE");
         actualTime/= (float) NUM_FPAS;
         psTime *fpaTime = psMetadataLookupPtr(NULL, targetFPA->concepts, "FPA.TIME");
         ok(abs(actualTime - psTimeToMJD(fpaTime)) < 1e-4, "pmConceptsAverageFPAs() calculated the average time correctly");
 
-
-        // Replace the FPA.TIMESYS with a non-conforming value, verify that pmConceptsAverageFPAs() returnes an error        
+        // Replace the FPA.TIMESYS with a non-conforming value, verify that pmConceptsAverageFPAs() returns an error
+
         psTimeType timeSys = psMetadataLookupS32(NULL, sourceFPA[0]->concepts, "FPA.TIMESYS");
         psMetadataAddS32(sourceFPA[NUM_FPAS-1]->concepts, PS_LIST_HEAD, "FPA.TIMESYS", PS_META_REPLACE, NULL, timeSys+10);
@@ -302,13 +267,13 @@
         // Free data, check for memory leaks
         for (int fpaID = 0 ; fpaID < NUM_FPAS ; fpaID++) {
-            myFreeFPA(sourceFPA[fpaID]);
+            psFree(sourceFPA[fpaID]);
+            psFree(cameras[fpaID]);
 	}
         psFree(sources);
-        myFreeFPA(targetFPA);
+//        psFree(filter);
+        psFree(targetFPA);
         psFree(camera);
         ok(!psMemCheckLeaks (id, NULL, NULL, false), "no memory leaks");
     }
-
-
 
     // ----------------------------------------------------------------------
@@ -461,6 +426,6 @@
         psMetadataAddS32(srcCell->concepts, PS_LIST_HEAD, "CELL.Y0", PS_META_REPLACE, NULL, tmpS32);
 
-        myFreeFPA(tgtFPA);
-        myFreeFPA(srcFPA);
+        psFree(tgtFPA);
+        psFree(srcFPA);
         psFree(tgtCamera);
         psFree(srcCamera);
