Index: /branches/rel10_ifa/psModules/src/astrom/Makefile.am
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/Makefile.am	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/Makefile.am	(revision 6575)
@@ -8,4 +8,5 @@
 	pmFPARead.c \
 	pmHDU.c \
+	pmHDUGetLowest.c \
 	pmReadout.c \
 	pmConcepts.c \
@@ -27,4 +28,5 @@
 	pmFPARead.h \
 	pmHDU.h \
+	pmHDUGetLowest.h \
 	pmReadout.h \
 	psAdditionals.h \
Index: /branches/rel10_ifa/psModules/src/astrom/pmConcepts.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConcepts.c	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConcepts.c	(revision 6575)
@@ -83,5 +83,5 @@
         pmConceptsInit();
     }
-    psMetadataIterator *specsIter = psMetadataIteratorAlloc(*specs, PS_LIST_HEAD, NULL); // Iterator on specs
+    psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator on specs
     psMetadataItem *specItem = NULL;    // Item from the specs metadata
     while ((specItem = psMetadataGetAndIncrement(specsIter))) {
@@ -122,5 +122,5 @@
     }
     if (source & PM_CONCEPT_SOURCE_DATABASE || source == PM_CONCEPT_SOURCE_ALL) {
-        pmConceptsReadFromHeader(specs, fpa, chip, cell, db, target);
+        pmConceptsReadFromDatabase(specs, fpa, chip, cell, db, target);
     }
 
@@ -152,5 +152,5 @@
     }
     if (source & PM_CONCEPT_SOURCE_DATABASE || source == PM_CONCEPT_SOURCE_ALL) {
-        pmConceptsWriteToHeader(specs, fpa, chip, cell, db, concepts);
+        pmConceptsWriteToDatabase(specs, fpa, chip, cell, db, concepts);
     }
 
@@ -179,9 +179,10 @@
 // Read the concepts for a given FPA
 bool pmConceptsWriteFPA(pmFPA *fpa,     // FPA for which to write concepts
+                        pmConceptSource source, // The source of the concepts to read
                         psDB *db        // Database handle
                        )
 {
     psTrace("psModule.concepts", 5, "Writing FPA concepts: %x %x\n", conceptsFPA, fpa->concepts);
-    return conceptsWrite(conceptsFPA, fpa, NULL, NULL, db, fpa->concepts);
+    return conceptsWrite(conceptsFPA, fpa, NULL, NULL, source, db, fpa->concepts);
 }
 
@@ -207,4 +208,5 @@
 // Read the concepts for a given FPA
 bool pmConceptsWriteChip(pmChip *chip,  // Chip for which to write concepts
+                         pmConceptSource source, // The source of the concepts to read
                          psDB *db        // Database handle
                         )
@@ -212,5 +214,5 @@
     psTrace("psModule.concepts", 5, "Writing chip concepts: %x %x\n", conceptsChip, chip->concepts);
     pmFPA *fpa = chip->parent;          // FPA to which the chip belongs
-    return conceptsWrite(conceptsChip, fpa, chip, NULL, db, chip->concepts);
+    return conceptsWrite(conceptsChip, fpa, chip, NULL, source, db, chip->concepts);
 }
 
@@ -237,4 +239,5 @@
 // Read the concepts for a given FPA
 bool pmConceptsWriteCell(pmCell *cell,  // FPA for which to write concepts
+                         pmConceptSource source, // The source of the concepts to read
                          psDB *db       // Database handle
                         )
@@ -243,5 +246,5 @@
     pmChip *chip = cell->parent;        // Chip to which the cell belongs
     pmFPA *fpa = chip->parent;          // FPA to which the chip belongs
-    return conceptsWrite(conceptsCell, fpa, chip, cell, db, cell->concepts);
+    return conceptsWrite(conceptsCell, fpa, chip, cell, source, db, cell->concepts);
 }
 
@@ -394,5 +397,5 @@
 
         // CELL.DARKTIME
-        {Read
+        {
             psMetadataItem *cellDarktime = psMetadataItemAllocF32("CELL.DARKTIME",
                                            "Time since flush (sec)", NAN);
@@ -428,5 +431,5 @@
             psMetadataItem *cellXbin = psMetadataItemAllocS32("CELL.XBIN", "Binning in x", 0);
             pmConceptRegister(cellXbin, (pmConceptParseFunc)pmConceptParse_CELL_Binning,
-                              (pmConceptFormatFunc)pmConceptFormat_CELL_Binning, PM_CONCEPT_LEVEL_CELL);
+                              (pmConceptFormatFunc)pmConceptFormat_CELL_XBIN, PM_CONCEPT_LEVEL_CELL);
             psFree(cellXbin);
         }
@@ -436,5 +439,5 @@
             psMetadataItem *cellYbin = psMetadataItemAllocS32("CELL.YBIN", "Binning in y", 0);
             pmConceptRegister(cellYbin, (pmConceptParseFunc)pmConceptParse_CELL_Binning,
-                              (pmConceptFormatFunc)pmConceptFormat_CELL_Binning, PM_CONCEPT_LEVEL_CELL);
+                              (pmConceptFormatFunc)pmConceptFormat_CELL_YBIN, PM_CONCEPT_LEVEL_CELL);
             psFree(cellYbin);
         }
Index: /branches/rel10_ifa/psModules/src/astrom/pmConcepts.h
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConcepts.h	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConcepts.h	(revision 6575)
@@ -8,5 +8,5 @@
 
 // Function to call to parse a concept once it has been read
-typedef psMetadataItem* (*pmConceptParseFunc)(psMetadataItem *concept, pmConceptSpec *spec, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
+typedef psMetadataItem* (*pmConceptParseFunc)(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
 // Function to call to format a concept for writing
 typedef psMetadataItem* (*pmConceptFormatFunc)(psMetadataItem *concept, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
Index: /branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.c	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.c	(revision 6575)
@@ -4,4 +4,7 @@
 
 #include "pmFPA.h"
+#include "pmHDU.h"
+#include "pmHDUGetLowest.h"
+#include "pmConcepts.h"
 #include "pmConceptsRead.h"
 
@@ -88,5 +91,5 @@
     default:
         psError(PS_ERR_IO, true, "Concept %s (%s) is not of string type (%x) --- treating as "
-                "undefined.\n", name, item->comment, item->type);
+                "undefined.\n", item->name, item->comment, item->type);
         return psStringCopy("");
     }
@@ -98,44 +101,25 @@
 // since the type is already known.
 static psMetadataItem *parsePlain(psMetadataItem *concept, // The concept to parse
-                                  pmConceptSpec *spec // The concept specification
+                                  psMetadataItem *pattern // The concept pattern
                                  )
 {
-    psMetadataItem *blank = spec->blank;// The blank specification, which carries the name, comment, type
-    switch (blank->type) {
+    switch (pattern->type) {
     case PS_DATA_STRING: {
             psString string = parseString(concept); // Get the string, so I can free it after it goes on the MDI
-            psMetadataItem *item = psMetadataItemAllocStr(blank->name, blank->comment, string);
+            psMetadataItem *item = psMetadataItemAllocStr(pattern->name, pattern->comment, string);
             psFree(string);
             return item;
         }
     case PS_DATA_S32:
-        return psMetadataItemAllocS32(blank->name, blank->comment, parseS32(concept));
+        return psMetadataItemAllocS32(pattern->name, pattern->comment, parseS32(concept));
     case PS_DATA_F32:
-        return psMetadataItemAllocF32(blank->name, blank->comment, parseF32(concept));
+        return psMetadataItemAllocF32(pattern->name, pattern->comment, parseF32(concept));
     case PS_DATA_F64:
-        return psMetadataItemAllocF64(blank->name, blank->comment, parseF64(concept));
+        return psMetadataItemAllocF64(pattern->name, pattern->comment, parseF64(concept));
     default:
         psLogMsg(__func__, PS_LOG_WARN, "Concept %s (%s) is not of a standard type (%x)\n",
-                 blank->name, blank->comment, blank->type);
+                 pattern->name, pattern->comment, pattern->type);
         return NULL;
     }
-}
-
-// Get the lowest HDU
-static pmHDU *getLowestHDU(pmFPA *fpa, // The FPA
-                           pmChip *chip, // The chip, or NULL
-                           pmCell *cell // The cell, or NULL
-                          )
-{
-    pmHDU *hdu = NULL;          // The HDU that's at the lowest level
-    if (cell) {
-        hdu = pmHDUFromCell(cell);
-    } else if (chip) {
-        hdu = pmHDUFromChip(chip);
-    } else if (fpa) {
-        hdu = pmHDUFromFPA(fpa);
-    }
-
-    return hdu;
 }
 
@@ -154,5 +138,5 @@
         psMetadataItem *parsed = NULL;  // The parsed concept
         if (spec->parse) {
-            parsed = spec->parse(concept, spec, cameraFormat, fpa, chip, cell);
+            parsed = spec->parse(concept, spec->blank, cameraFormat, fpa, chip, cell);
         } else {
             parsed = parsePlain(concept, spec->blank);
@@ -160,23 +144,23 @@
 
         // Reformat so that everything's clean
-        if (strcmp(spec->blank->name, parsedItem->name) != 0 ||
-                strcmp(spec->blank->comment, parsedItem->comment) != 0) {
+        if (strcmp(spec->blank->name, parsed->name) != 0 ||
+                strcmp(spec->blank->comment, parsed->comment) != 0) {
             psMetadataItem *cleaned = NULL;     // Item that's been cleaned up --- correct name and comment
-            switch (spec->type) {
+            switch (spec->blank->type) {
             case PS_DATA_STRING:
-                cleaned = psMetadataItemAllocStr(spec->blank->name, spec->blank->comment, concept->data.V);
+                cleaned = psMetadataItemAllocStr(spec->blank->name, spec->blank->comment, parsed->data.V);
                 break;
             case PS_DATA_S32:
-                cleaned = psMetadataItemAllocS32(spec->blank->name, spec->blank->comment, concept->data.S32);
+                cleaned = psMetadataItemAllocS32(spec->blank->name, spec->blank->comment, parsed->data.S32);
                 break;
             case PS_DATA_F32:
-                cleaned = psMetadataItemAllocF32(spec->blank->name, spec->blank->comment, concept->data.F32);
+                cleaned = psMetadataItemAllocF32(spec->blank->name, spec->blank->comment, parsed->data.F32);
                 break;
             case PS_DATA_F64:
-                cleaned = psMetadataItemAllocF64(spec->blank->name, spec->blank->comment, concept->data.F64);
+                cleaned = psMetadataItemAllocF64(spec->blank->name, spec->blank->comment, parsed->data.F64);
                 break;
             default:
                 cleaned = psMetadataItemAlloc(spec->blank->name, concept->type, spec->blank->comment,
-                                              concept->data.V);
+                                              parsed->data.V);
             }
             psFree(parsed);
@@ -201,5 +185,5 @@
 {
     if (cell) {
-        pmHDU *hdu = getLowestHDU(NULL, NULL, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(NULL, NULL, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadata *cellConfig = cell->config; // The camera configuration for this cell
@@ -214,5 +198,5 @@
                 // Check the SOURCE
                 psString nameSource = NULL; // String with the concept name and ".SOURCE" added
-                psStringAppend(nameSource, "%s.SOURCE", name);
+                psStringAppend(&nameSource, "%s.SOURCE", name);
                 bool mdok = true;       // Status of MD lookup
                 psString source = psMetadataLookupStr(&mdok, cell->config, nameSource); // The source
@@ -248,8 +232,10 @@
                                )
 {
-    bool mdok = true;               // Status of MD lookup
+    pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
+    psMetadata *cameraFormat = hdu->format; // The camera format
+    bool mdok = true;                   // Status of MD lookup
     psMetadata *defaults = psMetadataLookupMD(&mdok, cameraFormat, "DEFAULTS"); // The DEFAULTS spec
     if (mdok && defaults) {
-        pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator
@@ -274,8 +260,10 @@
                              )
 {
-    bool mdok = true;               // Status of MD lookup
+    pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
+    psMetadata *cameraFormat = hdu->format; // The camera format
+    bool mdok = true;                   // Status of MD lookup
     psMetadata *transSpec = psMetadataLookupMD(&mdok, cameraFormat, "TRANSLATION"); // The TRANSLATION spec
     if (mdok && transSpec) {
-        pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator
@@ -285,5 +273,5 @@
             psString name = specItem->name; // The concept name
             psString keywords = psMetadataLookupStr(&mdok, transSpec, name); // The FITS keywords
-            if (mdok && strlen(keyword) > 0) {
+            if (mdok && strlen(keywords) > 0) {
                 // In case there are multiple headers
                 psList *keys = psStringSplit(keywords, " ,;"); // List of keywords
@@ -294,6 +282,6 @@
                 } else {
                     psListIterator *keysIter = psListIteratorAlloc(keys, PS_LIST_HEAD, false); // Iterator
-                    psMetadataItem *key = NULL; // Item from iteration
-                    psList *values = psListAlloc(void); // List containing the values
+                    psString key = NULL; // Item from iteration
+                    psList *values = psListAlloc(NULL); // List containing the values
                     while ((key = psListGetAndIncrement(keysIter))) {
                         psMetadataItem *value = psMetadataLookup(hdu->header, key);
@@ -325,8 +313,10 @@
                                )
 {
-    bool mdok = true;               // Status of MD lookup
+    pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
+    psMetadata *cameraFormat = hdu->format; // The camera format
+    bool mdok = true;                   // Status of MD lookup
     psMetadata *dbSpec = psMetadataLookupMD(&mdok, cameraFormat, "DATABSE"); // The DATABASE spec
     if (mdok && dbSpec) {
-        pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator
@@ -338,9 +328,9 @@
             psMetadata *dbLookup = psMetadataLookupMD(&mdok, dbSpec, name);
             if (mdok && dbLookup) {
-                const char *tableName = psMetadataLookupStr(&mdStatus, dbLookup, "TABLE"); // Table name
+                const char *tableName = psMetadataLookupStr(&mdok, dbLookup, "TABLE"); // Table name
                 // Names of the "where" columns
-                const char *givenCols = psMetadataLookupStr(&mdStatus, dbLookup, "GIVENDBCOL");
+                const char *givenCols = psMetadataLookupStr(&mdok, dbLookup, "GIVENDBCOL");
                 // Values of the "where" columns
-                const char *givenPS = psMetadataLookupStr(&mdStatus, dbLookup, "GIVENPS");
+                const char *givenPS = psMetadataLookupStr(&mdok, dbLookup, "GIVENPS");
 
                 // Now, need to get the "given"s
@@ -352,5 +342,5 @@
                         psLogMsg(__func__, PS_LOG_WARN,
                                  "The GIVENDBCOL and GIVENPS entries for %s do not have "
-                                 "the same number of entries --- ignored.\n", concept);
+                                 "the same number of entries --- ignored.\n", name);
                     } else {
                         // Iterators for the lists
@@ -359,22 +349,28 @@
                         char *column = NULL;    // Name of the column
                         while ((column = psListGetAndIncrement(colsIter))) {
-                            char *name = psListGetAndIncrement(valuesIter); // Name for the value
+                            char *dependName = psListGetAndIncrement(valuesIter); // Name for the value
                             if (!strlen(column) || !strlen(name)) {
                                 psLogMsg(__func__, PS_LOG_WARN, "One of the columns or value names for %s is "
-                                         " empty --- ignored.\n", concept);
+                                         " empty --- ignored.\n", name);
                             } else {
                                 // Search for the value name
-                                psMetadataItem *item = pmConceptReadFromHeader(fpa, chip, cell, name);
-                                if (! item) {
-                                    item = pmConceptReadFromDefault(fpa, chip, cell, name);
+                                psMetadataItem *item = NULL; // The value
+                                if (!item && cell) {
+                                    item = psMetadataLookup(cell->concepts, dependName);
+                                }
+                                if (!item && chip) {
+                                    item = psMetadataLookup(chip->concepts, dependName);
+                                }
+                                if (!item && fpa) {
+                                    item = psMetadataLookup(fpa->concepts, dependName);
                                 }
                                 if (! item) {
                                     psLogMsg(__func__, PS_LOG_ERROR, "Unable to find the value name %s for DB"
-                                             " lookup on %s --- ignored.\n", name, concept);
+                                             " lookup on %s --- ignored.\n", dependName, name);
                                 } else {
                                     // We need to create a new psMetadataItem.  I don't think we can't
                                     // simply hack the existing one, since that could conceivably cause
                                     // memory leaks
-                                    psMetadataItem *newItem = psMetadataItemAlloc(concept, item->type,
+                                    psMetadataItem *newItem = psMetadataItemAlloc(name, item->type,
                                                               item->comment,
                                                               item->data.V);
@@ -383,5 +379,5 @@
                                 }
                             }
-                            psFree(name);
+                            psFree(dependName);
                             psFree(column);
                         } // Iterating through the columns
@@ -395,10 +391,10 @@
                         if (dbResult->n == 0) {
                             psLogMsg(__func__, PS_LOG_WARN,
-                                     "Unable to find any rows in DB for %s --- ignored\n", concept);
+                                     "Unable to find any rows in DB for %s --- ignored\n", name);
                         } else {
                             if (dbResult-> n > 1) {
                                 psLogMsg(__func__, PS_LOG_WARN,
                                          "Multiple rows returned in DB lookup for %s --- "
-                                         " using the first one only.\n", concept);
+                                         " using the first one only.\n", name);
                             }
                             conceptItem = (psMetadataItem*)dbResult->data[0];
@@ -406,5 +402,5 @@
 
                         // Now we have the result
-                        conceptParse(spec, headerItem, cameraFormat, target, fpa, chip, cell);
+                        conceptParse(spec, conceptItem, cameraFormat, target, fpa, chip, cell);
 
                     }
@@ -425,5 +421,5 @@
 
 
-#if 0
+#ifdef OLD
 
 psMetadataItem *pmConceptReadFromCamera(pmCell *cell, // The cell
Index: /branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.h
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.h	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConceptsRead.h	(revision 6575)
@@ -4,4 +4,33 @@
 #include "pmFPA.h"
 
+
+bool pmConceptsReadFromCamera(psMetadata *specs, // The concept specifications
+                              pmCell *cell,  // The cell
+                              psMetadata *target // Place into which to read the concepts
+                             );
+bool pmConceptsReadFromDefaults(psMetadata *specs, // The concept specifications
+                                pmFPA *fpa, // The FPA
+                                pmChip *chip, // The chip
+                                pmCell *cell, // The cell
+                                psMetadata *target // Place into which to read the concepts
+                               );
+bool pmConceptsReadFromHeader(psMetadata *specs, // The concept specifications
+                              pmFPA *fpa, // The FPA
+                              pmChip *chip, // The chip
+                              pmCell *cell,  // The cell
+                              psMetadata *target // Place into which to read the concepts
+                             );
+bool pmConceptsReadFromDatabase(psMetadata *specs, // The concept specifications
+                                pmFPA *fpa, // The FPA
+                                pmChip *chip, // The chip
+                                pmCell *cell,  // The cell
+                                psDB *db, // The database handle
+                                psMetadata *target // Place into which to read the concepts
+                               );
+
+
+
+
+#ifdef OLD
 psMetadataItem *pmConceptReadFromCamera(pmCell *cell, // The cell
                                         const char *concept // Name of concept
@@ -61,5 +90,5 @@
                              const char *name // Name of the concept
                             );
-
+#endif
 
 #endif
Index: /branches/rel10_ifa/psModules/src/astrom/pmConceptsStandard.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConceptsStandard.c	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConceptsStandard.c	(revision 6575)
@@ -1,11 +1,11 @@
 #include <stdio.h>
+#include <assert.h>
 
 #include "pslib.h"
 
+#include "pmFPA.h"
 #include "pmConceptsRead.h"
 #include "pmConceptsWrite.h"
-#include "pmFPA.h"
 #include "pmConceptsStandard.h"
-#include "psAdditionals.h"
 
 
@@ -21,10 +21,11 @@
         psLogMsg(__func__, PS_LOG_WARN, "Assuming format for %s is HOURS.\n", pattern->name);
         return M_PI / 12.0;
-    } else if (strcmp(pattern->name, "FPA.DEC") == 0) {
+    }
+    if (strcmp(pattern->name, "FPA.DEC") == 0) {
         psLogMsg(__func__, PS_LOG_WARN, "Assuming format for %s is DEGREES.\n", pattern->name);
         return M_PI / 180.0;
-    } else {
-        psAbort("Should never ever get here.\n");
-    }
+    }
+    psAbort(__func__, "Should never ever get here.\n");
+    return NAN;
 }
 
@@ -73,5 +74,5 @@
     psMetadata *formats = psMetadataLookupMD(&mdok, cameraFormat, "FORMATS");
     if (mdok && formats) {
-        psString format = psMetadataLookupStr(&mdok, formats, blank->name);
+        psString format = psMetadataLookupStr(&mdok, formats, pattern->name);
         if (mdok && strlen(format) > 0) {
             if (strcasecmp(format, "HOURS") == 0) {
@@ -95,5 +96,5 @@
 
 // FPA.RA and FPA.DEC
-psMetadataItem *pmConceptFormat_FPA_Coords(psMetadataItem *concept, psMetadataItem *pattern, pmConceptSpec *spec, psMetadata *cameraFormat)
+psMetadataItem *pmConceptFormat_FPA_Coords(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat)
 {
     assert(concept);
@@ -128,5 +129,5 @@
     int big, medium;
     float small;
-    big = (int)ra;
+    big = (int)coords;
     medium = (int)(60.0*(coords - (double)big));
     small = 3600.0*(coords - (double)big - 60.0 * (double)medium);
@@ -146,5 +147,4 @@
     assert(pattern);
 
-    psMetadata *cellConfig = cell->config; // The cell configuration
     psRegion *trimsec = psAlloc(sizeof(psRegion)); // Make space for a psRegion (usually passed by value)
 
@@ -166,8 +166,6 @@
     assert(cell);
     assert(pattern);
-    psMetadata *cellConfig = cell->config; // The cell configuration
 
     psList *biassecs = psListAlloc(NULL); // List of bias sections
-    psMetadataItem *item = psMetadataItemAlloc("CELL.BIASSEC", PS_DATA_LIST, "Bias sections", biassecs);
     psFree(biassecs);               // Drop reference
 
@@ -215,5 +213,5 @@
 
 // CELL.XBIN and CELL.YBIN
-psMetadataItem *pmConceptParse_CELL_BINNING(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell)
+psMetadataItem *pmConceptParse_CELL_Binning(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell)
 {
     assert(concept);
@@ -226,16 +224,15 @@
                 sscanf(binString, "%d,%*d", &binning) != 1) ||
                 (strcmp(pattern->name, "CELL.YBIN") == 0 && sscanf(binString, "%*d %d", &binning) != 1 &&
-                 sscanf(binString, "%*d,%d", &binning) != 1) {
-                psError(PS_ERR_IO, true, "Unable to parse string to get %s: %s\n", pattern->name, binString)
-                    ;
-                }
-            } else if (concept->type == PS_TYPE_S32) {
-                binning = concept->data.S32;
-            } else {
-                psError(PS_ERR_IO, true, "Note sure how to parse %s of type %x --- assuming 1.\n", pattern->name,
-                        binItem->type);
-            }
-
-            return psMetadataItemAllocS32(pattern->name, pattern->comment, binning);
+                 sscanf(binString, "%*d,%d", &binning) != 1)) {
+            psError(PS_ERR_IO, true, "Unable to parse string to get %s: %s\n", pattern->name, binString);
+        }
+    } else if (concept->type == PS_TYPE_S32) {
+        binning = concept->data.S32;
+    } else {
+        psError(PS_ERR_IO, true, "Note sure how to parse %s of type %x --- assuming 1.\n", pattern->name,
+                concept->type);
+    }
+
+    return psMetadataItemAllocS32(pattern->name, pattern->comment, binning);
 }
 
@@ -247,4 +244,5 @@
 
     psTimeType timeSys = PS_TIME_UTC;   // The time system
+    psString sys = concept->data.V;     // The time system string
     if (concept->type != PS_DATA_STRING || strlen(sys) <= 0) {
         psError(PS_ERR_IO, true, "Can't interpret CELL.TIMESYS --- assuming UTC.\n");
@@ -273,5 +271,5 @@
 
     // Need CELL.TIMESYS first
-    bool mdok = false;                  // Result of MD lookup
+    bool mdok = true;                  // Result of MD lookup
     psTimeType timeSys = psMetadataLookupS32(&mdok, cell->concepts, "CELL.TIMESYS"); // The time system
     if (!mdok) {
@@ -281,5 +279,4 @@
 
     // Get format
-    bool mdok = true;               // Status of MD lookup
     psMetadata *formats = psMetadataLookupMD(&mdok, cameraFormat, "FORMATS");
     if (!mdok || !formats) {
@@ -446,5 +443,5 @@
     psRegion *trimsec = concept->data.V; // The trimsec region
     psString trimsecString = psRegionToString(*trimsec);
-    psMetadataItem *formatted = psMetadataItemAllocStr(trimsecItem->name, trimsecItem->comment,
+    psMetadataItem *formatted = psMetadataItemAllocStr(concept->name, concept->comment,
                                 trimsecString);
     psFree(trimsecString);
@@ -543,5 +540,5 @@
     psFree(sys);
 
-    return success;
+    return newItem;
 }
 
@@ -602,9 +599,9 @@
     }
 
-    psError(PS_ERR_IO, true, "Not sure how to format concept CELL.TIME (%s)\n", dateTimeString);
+    psError(PS_ERR_IO, true, "Not sure how to format concept CELL.TIME\n");
     return NULL;
 }
 
-psMetadataItem *pmConceptFormat_CELL_Positions(psMetadataItem *concept, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell *db)
+psMetadataItem *pmConceptFormat_CELL_Positions(psMetadataItem *concept, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell)
 {
     assert(concept);
@@ -612,5 +609,5 @@
 
     if (concept->type != PS_TYPE_S32) {
-        psError(PS_ERR_IO, true, "Concept %s is not of type S32, as expected.\n", pattern->name);
+        psError(PS_ERR_IO, true, "Concept %s is not of type S32, as expected.\n", concept->name);
         return NULL;
     }
Index: /branches/rel10_ifa/psModules/src/astrom/pmConceptsStandard.h
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConceptsStandard.h	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConceptsStandard.h	(revision 6575)
@@ -5,9 +5,10 @@
 #include "pmFPA.h"
 
+
 psMetadataItem *pmConceptParse_FPA_Coords(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
-psMetadataItem *pmConceptFormat_FPA_Coords(psMetadataItem *concept, psMetadataItem *pattern, pmConceptSpec *spec, psMetadata *cameraFormat);
+psMetadataItem *pmConceptFormat_FPA_Coords(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat);
 psMetadataItem *pmConceptParse_CELL_TRIMSEC(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
 psMetadataItem *pmConceptParse_CELL_BIASSEC(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
-psMetadataItem *pmConceptParse_CELL_BINNING(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
+psMetadataItem *pmConceptParse_CELL_Binning(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
 psMetadataItem *pmConceptParse_CELL_TIMESYS(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
 psMetadataItem *pmConceptParse_CELL_TIME(psMetadataItem *concept, psMetadataItem *pattern, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
@@ -19,5 +20,5 @@
 psMetadataItem *pmConceptFormat_CELL_TIMESYS(psMetadataItem *concept, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
 psMetadataItem *pmConceptFormat_CELL_TIME(psMetadataItem *concept, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
-psMetadataItem *pmConceptFormat_CELL_Positions(psMetadataItem *concept, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell *db);
+psMetadataItem *pmConceptFormat_CELL_Positions(psMetadataItem *concept, psMetadata *cameraFormat, pmFPA *fpa, pmChip *chip, pmCell *cell);
 
 #endif
Index: /branches/rel10_ifa/psModules/src/astrom/pmConceptsWrite.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConceptsWrite.c	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConceptsWrite.c	(revision 6575)
@@ -4,4 +4,7 @@
 
 #include "pmFPA.h"
+#include "pmHDU.h"
+#include "pmHDUGetLowest.h"
+#include "pmConcepts.h"
 #include "pmConceptsRead.h"
 #include "psAdditionals.h"
@@ -89,4 +92,5 @@
         return formatted;
     }
+    return NULL;
 }
 
@@ -127,5 +131,5 @@
 {
     if (cell) {
-        pmHDU *hdu = getLowestHDU(NULL, NULL, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(NULL, NULL, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator
@@ -142,5 +146,5 @@
                 psMetadataItem *formatted = conceptFormat(spec, conceptItem, cameraFormat, NULL, NULL, cell);
                 psString nameSource = NULL; // String with the concept name and ".SOURCE" added
-                psStringAppend(nameSource, "%s.SOURCE", name);
+                psStringAppend(&nameSource, "%s.SOURCE", name);
                 bool mdok = true;       // Status of MD lookup
                 psString source = psMetadataLookupStr(&mdok, cell->config, nameSource); // The source
@@ -149,5 +153,5 @@
                         if (cameraItem->type != PS_DATA_STRING) {
                             psLogMsg(__func__, PS_LOG_WARN, "Concept %s is specified by header, but is not "
-                                     "of type STR --- ignored.\n", conceptItem->name)
+                                     "of type STR --- ignored.\n", conceptItem->name);
                             continue;
                         }
@@ -181,15 +185,17 @@
 
 
-bool pmConceptsWriteToDefault(psMetadata *specs, // The concept specifications
-                              pmFPA *fpa, // The FPA
-                              pmChip *chip, // The chip
-                              pmCell *cell, // The cell
-                              psMetadata *concepts // The concepts
-                             )
-{
-    bool mdok = true;               // Status of MD lookup
+bool pmConceptsWriteToDefaults(psMetadata *specs, // The concept specifications
+                               pmFPA *fpa, // The FPA
+                               pmChip *chip, // The chip
+                               pmCell *cell, // The cell
+                               psMetadata *concepts // The concepts
+                              )
+{
+    pmHDU *hdu = pmHDUGetLowest(NULL, NULL, cell); // The HDU at the lowest level
+    psMetadata *cameraFormat = hdu->format; // The camera format
+    bool mdok = true;                   // Status of MD lookup
     psMetadata *defaults = psMetadataLookupMD(&mdok, cameraFormat, "DEFAULTS"); // The DEFAULTS spec
     if (mdok && defaults) {
-        pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator
@@ -202,5 +208,5 @@
                 psMetadataItem *conceptItem = psMetadataLookup(concepts, name); // The item from the concepts
                 psMetadataItem *formatted = conceptFormat(spec, conceptItem, cameraFormat, fpa, chip, cell);
-                if (! compareConcepts(cameraItem, formatted)) {
+                if (! compareConcepts(defaultItem, formatted)) {
                     psLogMsg(__func__, PS_LOG_WARN, "Concept %s is specified by the DEFAULTS in the camera "
                              "format, but the values don't match.\n");
@@ -222,8 +228,10 @@
                             )
 {
-    bool mdok = true;               // Status of MD lookup
+    pmHDU *hdu = pmHDUGetLowest(NULL, NULL, cell); // The HDU at the lowest level
+    psMetadata *cameraFormat = hdu->format; // The camera format
+    bool mdok = true;                   // Status of MD lookup
     psMetadata *translation = psMetadataLookupMD(&mdok, cameraFormat, "TRANSLATION"); // The TRANSLATION spec
     if (mdok && translation) {
-        pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator
@@ -271,5 +279,5 @@
 }
 
-
+// XXX Warning: This code has not been tested at all
 bool pmConceptsWriteToDatabase(psMetadata *specs, // The concept specifications
                                pmFPA *fpa, // The FPA
@@ -280,8 +288,10 @@
                               )
 {
-    bool mdok = true;               // Status of MD lookup
+    pmHDU *hdu = pmHDUGetLowest(NULL, NULL, cell); // The HDU at the lowest level
+    psMetadata *cameraFormat = hdu->format; // The camera format
+    bool mdok = true;                   // Status of MD lookup
     psMetadata *database = psMetadataLookupMD(&mdok, cameraFormat, "DATABASE"); // The DATABASE spec
     if (mdok && database) {
-        pmHDU *hdu = getLowestHDU(fpa, chip, cell); // The HDU at the lowest level
+        pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
         psMetadata *cameraFormat = hdu->format; // The camera format
         psMetadataIterator *specsIter = psMetadataIteratorAlloc(specs, PS_LIST_HEAD, NULL); // Iterator
@@ -291,5 +301,5 @@
             psString name = specItem->name; // The concept name
 
-            psMetadataItem *dbItem = psMetadataLookup(&mdok, database, name); // The item from the DATABASE
+            psMetadataItem *dbItem = psMetadataLookup(database, name); // The item from the DATABASE
             if (dbItem) {
                 if (dbItem->type != PS_DATA_METADATA) {
@@ -304,9 +314,9 @@
                 psMetadata *dbLookup = dbItem->data.V; // How to look up the value of interest
                 // Name of the table
-                const char *tableName = psMetadataLookupStr(&mdStatus, dbLookup, "TABLE");
+                const char *tableName = psMetadataLookupStr(&mdok, dbLookup, "TABLE");
                 // Name of "where" columns
-                const char *givenCols = psMetadataLookupStr(&mdStatus, dbLookup, "GIVENDBCOL");
+                const char *givenCols = psMetadataLookupStr(&mdok, dbLookup, "GIVENDBCOL");
                 // Values for "where" columns
-                const char *givenPS = psMetadataLookupStr(&mdStatus, dbLookup, "GIVENPS");
+                const char *givenPS = psMetadataLookupStr(&mdok, dbLookup, "GIVENPS");
 
                 // Now, need to get the "given"s
@@ -318,5 +328,5 @@
                         psLogMsg(__func__, PS_LOG_WARN,
                                  "The GIVENDBCOL and GIVENPS entries for %s do not have "
-                                 "the same number of entries --- ignored.\n", concept);
+                                 "the same number of entries --- ignored.\n", name);
                     } else {
                         // Iterators for the lists
@@ -325,18 +335,24 @@
                         char *column = NULL;    // Name of the column
                         while ((column = psListGetAndIncrement(colsIter))) {
-                            char *name = psListGetAndIncrement(valuesIter); // Name for the value
+                            char *dependName = psListGetAndIncrement(valuesIter); // Name for the value
                             if (!strlen(column) || !strlen(name)) {
                                 psLogMsg(__func__, PS_LOG_WARN, "One of the columns or value names for %s is "
-                                         " empty --- ignored.\n", concept);
+                                         " empty --- ignored.\n", name);
                             } else {
                                 // Search for the value name
-                                psMetadataItem *item = pmConceptReadFromHeader(fpa, chip, cell, name);
-                                if (! item) {
-                                    item = pmConceptReadFromDefault(fpa, chip, cell, name);
+                                psMetadataItem *item = NULL; // The value
+                                if (!item && cell) {
+                                    item = psMetadataLookup(cell->concepts, dependName);
+                                }
+                                if (!item && chip) {
+                                    item = psMetadataLookup(chip->concepts, dependName);
+                                }
+                                if (!item && fpa) {
+                                    item = psMetadataLookup(fpa->concepts, dependName);
                                 }
                                 if (! item) {
                                     psLogMsg(__func__, PS_LOG_ERROR,
                                              "Unable to find the value name %s for DB "
-                                             " lookup on %s --- ignored.\n", name, concept);
+                                             " lookup on %s --- ignored.\n", dependName, name);
                                 } else {
                                     // We need to create a new psMetadataItem.  I don't think we can't simply
@@ -346,5 +362,5 @@
                                 }
                             }
-                            psFree(name);
+                            psFree(dependName);
                             psFree(column);
                         } // Iterating through the columns
@@ -357,14 +373,14 @@
                         if (! dbResult || dbResult->n == 0) {
                             psLogMsg(__func__, PS_LOG_WARN, "Unable to find any rows in DB for %s --- "
-                                     "ignored\n", concept->name);
+                                     "ignored\n", name);
                             return false;
                         } else {
                             if (dbResult->n > 1) {
                                 psLogMsg(__func__, PS_LOG_WARN, "Multiple rows returned in DB lookup for %s "
-                                         "--- ignored.\n", concept->name);
+                                         "--- ignored.\n", name);
                             }
                             // Update the DB
                             psMetadata *update = psMetadataAlloc();
-                            psMetadataAddItem(update, concept, PS_LIST_HEAD, 0);
+                            psMetadataAddItem(update, conceptItem, PS_LIST_HEAD, 0);
                             psDBUpdateRows(db, tableName, selection, update);
                             psFree(update);
Index: /branches/rel10_ifa/psModules/src/astrom/pmConceptsWrite.h
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmConceptsWrite.h	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmConceptsWrite.h	(revision 6575)
@@ -4,4 +4,33 @@
 #include "pslib.h"
 #include "pmFPA.h"
+
+
+
+bool pmConceptsWriteToCamera(psMetadata *specs, // The concept specifications
+                             pmCell *cell,   // The cell
+                             psMetadata *concepts // The concepts
+                            );
+bool pmConceptsWriteToDefaults(psMetadata *specs, // The concept specifications
+                               pmFPA *fpa, // The FPA
+                               pmChip *chip, // The chip
+                               pmCell *cell, // The cell
+                               psMetadata *concepts // The concepts
+                              );
+bool pmConceptsWriteToHeader(psMetadata *specs, // The concept specifications
+                             pmFPA *fpa, // The FPA
+                             pmChip *chip, // The chip
+                             pmCell *cell, // The cell
+                             psMetadata *concepts // The concepts
+                            );
+bool pmConceptsWriteToDatabase(psMetadata *specs, // The concept specifications
+                               pmFPA *fpa, // The FPA
+                               pmChip *chip, // The chip
+                               pmCell *cell, // The cell
+                               psDB *db,// The database handle
+                               psMetadata *concepts // The concepts
+                              );
+
+
+#ifdef OLD
 
 // Well, not really "write", but check to make sure it's there and matches
@@ -48,2 +77,4 @@
 
 #endif
+
+#endif
Index: /branches/rel10_ifa/psModules/src/astrom/pmFPAConstruct.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmFPAConstruct.c	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmFPAConstruct.c	(revision 6575)
@@ -4,6 +4,6 @@
 
 #include "pmFPA.h"
+#include "pmConcepts.h"
 #include "pmFPAConstruct.h"
-#include "psAdditionals.h"
 
 //////////////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -147,10 +147,13 @@
         while ((cellName = psListGetAndIncrement(cellNamesIter))) {
             pmCell *cell = pmCellAlloc(chip, cellName); // New cell
+            pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_DEFAULTS, NULL);
             psFree(cell);               // Drop reference
         }
+        pmConceptsReadChip(chip, PM_CONCEPT_SOURCE_DEFAULTS, NULL);
         psFree(chip);                   // Drop reference
         psFree(cellNamesIter);
     }
     psFree(componentsIter);
+    pmConceptsReadFPA(fpa, PM_CONCEPT_SOURCE_DEFAULTS, NULL);
 
     return fpa;
@@ -241,4 +244,5 @@
             }
             cell->config = psMemIncrRefCounter(cellData);
+            pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_CAMERA, NULL);
         }
     }
@@ -291,4 +295,5 @@
                 }
                 cell->config = psMemIncrRefCounter(cellData);
+                pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_CAMERA, NULL);
             }
 
@@ -332,4 +337,5 @@
                 }
                 cell->config = psMemIncrRefCounter(cellData);
+                pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_CAMERA, NULL);
             }
 
Index: /branches/rel10_ifa/psModules/src/astrom/pmFPARead.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmFPARead.c	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmFPARead.c	(revision 6575)
@@ -189,4 +189,6 @@
     }
 
+    pmConceptsReadCell(cell, PM_CONCEPT_SOURCE_HEADER, NULL);
+
     // Having read the cell, we now have to cut it up
     psRegion *trimsec = psMetadataLookupPtr(NULL, cell->concepts, "CELL.TRIMSEC");
@@ -218,4 +220,5 @@
             return false;
         }
+        pmConceptsReadChip(chip, PM_CONCEPT_SOURCE_HEADER, NULL);
     }
 
@@ -236,4 +239,5 @@
             return false;
         }
+        pmConceptsReadFPA(fpa, PM_CONCEPT_SOURCE_HEADER, NULL);
     }
 
Index: /branches/rel10_ifa/psModules/src/astrom/pmHDU.c
===================================================================
--- /branches/rel10_ifa/psModules/src/astrom/pmHDU.c	(revision 6574)
+++ /branches/rel10_ifa/psModules/src/astrom/pmHDU.c	(revision 6575)
@@ -41,4 +41,5 @@
 }
 
+
 // Read the HDU
 // XXX: Add a region specifier?
