Index: trunk/psModules/src/concepts/pmConcepts.c
===================================================================
--- trunk/psModules/src/concepts/pmConcepts.c	(revision 9216)
+++ trunk/psModules/src/concepts/pmConcepts.c	(revision 9510)
@@ -153,4 +153,11 @@
     }
 
+    if (source & PM_CONCEPT_SOURCE_PHU && !(*read & PM_CONCEPT_SOURCE_PHU)) {
+        if (!pmConceptsReadFromHeader(*specs, fpa, chip, cell, target)) {
+            psError(PS_ERR_UNKNOWN, false, "Error reading concepts from header.\n");
+            success = false;
+        }
+    }
+
     if (source & PM_CONCEPT_SOURCE_HEADER && !(*read & PM_CONCEPT_SOURCE_HEADER)) {
         if (pmConceptsReadFromHeader(*specs, fpa, chip, cell, target)) {
@@ -201,5 +208,5 @@
         pmConceptsWriteToDefaults(*specs, fpa, chip, cell, concepts);
     }
-    if (source & PM_CONCEPT_SOURCE_HEADER) {
+    if (source & (PM_CONCEPT_SOURCE_PHU | PM_CONCEPT_SOURCE_HEADER)) {
         pmConceptsWriteToHeader(*specs, fpa, chip, cell, concepts);
     }
@@ -218,4 +225,24 @@
     psTrace("psModules.concepts", 5, "Blanking FPA concepts: %p %p\n", conceptsFPA, fpa->concepts);
     return conceptsBlank(&conceptsFPA, fpa->concepts);
+}
+
+// Read the concepts for the given set of fpa, chip, cell
+bool pmConceptsRead(pmFPA *fpa,         // FPA for which to read concepts
+                    pmChip *chip,       // Chip for which to read concepts, or NULL
+                    pmCell *cell,       // Cell for which to read concepts, or NULL
+                    pmConceptSource source, // The source of the concepts to read
+                    psDB *db            // Database handle
+                   )
+{
+    PS_ASSERT_PTR_NON_NULL(fpa, false);
+    bool success = conceptsRead(&conceptsFPA, fpa, chip, cell, &fpa->conceptsRead, source, db, fpa->concepts);
+    if (chip) {
+        success |= conceptsRead(&conceptsChip, fpa, chip, cell, &chip->conceptsRead, source, db, chip->concepts);
+    }
+    if (cell) {
+        success |= conceptsRead(&conceptsCell, fpa, chip, cell, &cell->conceptsRead, source, db, cell->concepts);
+    }
+
+    return success;
 }
 
@@ -501,4 +528,26 @@
         }
 
+        // FPA.TIMESYS
+        {
+            psMetadataItem *fpaTimesys = psMetadataItemAllocS32("FPA.TIMESYS", "Time system", -1);
+            pmConceptRegister(fpaTimesys, (pmConceptParseFunc)p_pmConceptParse_TIMESYS,
+                              (pmConceptFormatFunc)p_pmConceptFormat_TIMESYS, PM_FPA_LEVEL_FPA);
+            psFree(fpaTimesys);
+        }
+
+        // FPA.TIME
+        {
+            psTime *time = psTimeAlloc(PS_TIME_TAI); // Blank time
+            // Not particularly distinguishing, but should be good enough
+            time->sec = 0;
+            time->nsec = 0;
+            psMetadataItem *fpaTime = psMetadataItemAlloc("FPA.TIME", PS_DATA_TIME,
+                                      "Time of exposure", time);
+            psFree(time);
+            pmConceptRegister(fpaTime, (pmConceptParseFunc)p_pmConceptParse_TIME,
+                              (pmConceptFormatFunc)p_pmConceptFormat_TIME, PM_FPA_LEVEL_FPA);
+            psFree(fpaTime);
+        }
+
         // Done with FPA level concepts
     }
@@ -675,6 +724,6 @@
         {
             psMetadataItem *cellTimesys = psMetadataItemAllocS32("CELL.TIMESYS", "Time system", -1);
-            pmConceptRegister(cellTimesys, (pmConceptParseFunc)p_pmConceptParse_CELL_TIMESYS,
-                              (pmConceptFormatFunc)p_pmConceptFormat_CELL_TIMESYS, PM_FPA_LEVEL_CELL);
+            pmConceptRegister(cellTimesys, (pmConceptParseFunc)p_pmConceptParse_TIMESYS,
+                              (pmConceptFormatFunc)p_pmConceptFormat_TIMESYS, PM_FPA_LEVEL_CELL);
             psFree(cellTimesys);
         }
@@ -689,6 +738,6 @@
                                        "Time of exposure", time);
             psFree(time);
-            pmConceptRegister(cellTime, (pmConceptParseFunc)p_pmConceptParse_CELL_TIME,
-                              (pmConceptFormatFunc)p_pmConceptFormat_CELL_TIME, PM_FPA_LEVEL_CELL);
+            pmConceptRegister(cellTime, (pmConceptParseFunc)p_pmConceptParse_TIME,
+                              (pmConceptFormatFunc)p_pmConceptFormat_TIME, PM_FPA_LEVEL_CELL);
             psFree(cellTime);
         }
