Index: trunk/psModules/src/concepts/pmConceptsRead.c
===================================================================
--- trunk/psModules/src/concepts/pmConceptsRead.c	(revision 8815)
+++ trunk/psModules/src/concepts/pmConceptsRead.c	(revision 8821)
@@ -265,10 +265,16 @@
     PS_ASSERT_PTR_NON_NULL(target, false);
 
-    pmHDU *hdu = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
-    if (!hdu) {
+    pmHDU *hduLow = pmHDUGetLowest(fpa, chip, cell); // The HDU at the lowest level
+    if (!hduLow) {
         psError(PS_ERR_UNKNOWN, true, "Can't find HDU at lowest level");
         return false;
     }
-    psMetadata *cameraFormat = hdu->format; // The camera format
+    pmHDU *hduHigh = pmHDUGetHighest(fpa, chip, cell); // The HDU at the highest level
+    if (!hduHigh) {
+        psError(PS_ERR_UNKNOWN, true, "Can't find HDU at the highest level");
+        return false;
+    }
+    assert(hduLow->format == hduHigh->format); // Just in case....
+    psMetadata *cameraFormat = hduLow->format; // The camera format
     bool mdok = true;                   // Status of MD lookup
     psMetadata *transSpec = psMetadataLookupMD(&mdok, cameraFormat, "TRANSLATION"); // The TRANSLATION spec
@@ -295,5 +301,9 @@
                 psFree(nameSource);
                 if (mdok && strlen(source) && strcasecmp(source, "HEADER") == 0) {
-                    headerItem = psMemIncrRefCounter(psMetadataLookup(hdu->header, conceptItem->data.V));
+                    headerItem = psMetadataLookup(hduLow->header, conceptItem->data.V);
+                    if (!headerItem && hduHigh != hduLow) {
+                        headerItem = psMetadataLookup(hduHigh->header, conceptItem->data.V);
+                    }
+                    psMemIncrRefCounter(headerItem);
                 }
                 // Leave the error handling to pmConceptsFromCamera, which should already have been called
@@ -307,5 +317,9 @@
                 if (keys->n == 1) {
                     // Only one key --- proceed as usual
-                    headerItem = psMemIncrRefCounter(psMetadataLookup(hdu->header, keywords));
+                    headerItem = psMetadataLookup(hduLow->header, keywords);
+                    if (!headerItem && hduHigh != hduLow) {
+                        headerItem = psMetadataLookup(hduHigh->header, keywords);
+                    }
+                    psMemIncrRefCounter(headerItem);
                 } else {
                     psListIterator *keysIter = psListIteratorAlloc(keys, PS_LIST_HEAD, false); // Iterator
@@ -313,5 +327,11 @@
                     psList *values = psListAlloc(NULL); // List containing the values
                     while ((key = psListGetAndIncrement(keysIter))) {
-                        psMetadataItem *value = psMetadataLookup(hdu->header, key);
+                        psMetadataItem *value = psMetadataLookup(hduLow->header, key);
+                        if (!value && hduHigh != hduLow) {
+                            value = psMetadataLookup(hduHigh->header, key);
+                        }
+                        if (!value) {
+                            psWarning("Unable to find header %s --- assuming value is NULL", key);
+                        }
                         psListAdd(values, PS_LIST_TAIL, value);
                     }
