Index: /trunk/psModules/src/astrom/pmConcepts.c
===================================================================
--- /trunk/psModules/src/astrom/pmConcepts.c	(revision 6927)
+++ /trunk/psModules/src/astrom/pmConcepts.c	(revision 6928)
@@ -113,4 +113,5 @@
                          pmChip *chip,  // The chip
                          pmCell *cell,  // The cell
+                         unsigned int *read,     // What's already been read
                          pmConceptSource source, // The source of the concepts to read
                          psDB *db,      // Database handle
@@ -122,15 +123,22 @@
     }
 
-    if (source & PM_CONCEPT_SOURCE_CAMERA || source == PM_CONCEPT_SOURCE_ALL) {
+    if (source & PM_CONCEPT_SOURCE_CAMERA && !(*read & PM_CONCEPT_SOURCE_CAMERA)) {
         pmConceptsReadFromCamera(*specs, cell, target);
-    }
-    if (source & PM_CONCEPT_SOURCE_DEFAULTS || source == PM_CONCEPT_SOURCE_ALL) {
+        *read |= PM_CONCEPT_SOURCE_CAMERA;
+    }
+
+    if (source & PM_CONCEPT_SOURCE_DEFAULTS && !(*read & PM_CONCEPT_SOURCE_DEFAULTS)) {
         pmConceptsReadFromDefaults(*specs, fpa, chip, cell, target);
-    }
-    if (source & PM_CONCEPT_SOURCE_HEADER || source == PM_CONCEPT_SOURCE_ALL) {
+        *read |= PM_CONCEPT_SOURCE_DEFAULTS;
+    }
+
+    if (source & PM_CONCEPT_SOURCE_HEADER && !(*read & PM_CONCEPT_SOURCE_HEADER)) {
         pmConceptsReadFromHeader(*specs, fpa, chip, cell, target);
-    }
-    if (source & PM_CONCEPT_SOURCE_DATABASE || source == PM_CONCEPT_SOURCE_ALL) {
+        *read |= PM_CONCEPT_SOURCE_HEADER;
+    }
+
+    if (source & PM_CONCEPT_SOURCE_DATABASE && !(*read & PM_CONCEPT_SOURCE_DATABASE)) {
         pmConceptsReadFromDatabase(*specs, fpa, chip, cell, db, target);
+        *read |= PM_CONCEPT_SOURCE_DATABASE;
     }
 
@@ -152,14 +160,14 @@
     }
 
-    if (source & PM_CONCEPT_SOURCE_CAMERA || source == PM_CONCEPT_SOURCE_ALL) {
+    if (source & PM_CONCEPT_SOURCE_CAMERA) {
         pmConceptsWriteToCamera(*specs, cell, concepts);
     }
-    if (source & PM_CONCEPT_SOURCE_DEFAULTS || source == PM_CONCEPT_SOURCE_ALL) {
+    if (source & PM_CONCEPT_SOURCE_DEFAULTS) {
         pmConceptsWriteToDefaults(*specs, fpa, chip, cell, concepts);
     }
-    if (source & PM_CONCEPT_SOURCE_HEADER || source == PM_CONCEPT_SOURCE_ALL) {
+    if (source & PM_CONCEPT_SOURCE_HEADER) {
         pmConceptsWriteToHeader(*specs, fpa, chip, cell, concepts);
     }
-    if (source & PM_CONCEPT_SOURCE_DATABASE || source == PM_CONCEPT_SOURCE_ALL) {
+    if (source & PM_CONCEPT_SOURCE_DATABASE) {
         pmConceptsWriteToDatabase(*specs, fpa, chip, cell, db, concepts);
     }
@@ -184,5 +192,5 @@
 {
     psTrace("psModule.concepts", 5, "Reading FPA concepts: %x %x\n", conceptsFPA, fpa->concepts);
-    return conceptsRead(&conceptsFPA, fpa, NULL, NULL, source, db, fpa->concepts);
+    return conceptsRead(&conceptsFPA, fpa, NULL, NULL, &fpa->conceptsRead, source, db, fpa->concepts);
 }
 
@@ -214,6 +222,7 @@
     psTrace("psModule.concepts", 5, "Reading chip concepts: %x %x\n", conceptsChip, chip->concepts);
     pmFPA *fpa = chip->parent;          // FPA to which the chip belongs
-    return conceptsRead(&conceptsChip, fpa, chip, NULL, source, db, chip->concepts) &&
-           ((propagate && conceptsRead(&conceptsFPA, fpa, chip, NULL, source, db, fpa->concepts)) ||
+    return conceptsRead(&conceptsChip, fpa, chip, NULL, &chip->conceptsRead, source, db, chip->concepts) &&
+           ((propagate && conceptsRead(&conceptsFPA, fpa, chip, NULL, &fpa->conceptsRead, source, db,
+                                       fpa->concepts)) ||
             !propagate);
 }
@@ -251,7 +260,9 @@
     pmChip *chip = cell->parent;        // Chip to which the cell belongs
     pmFPA *fpa = chip->parent;          // FPA to which the chip belongs
-    return conceptsRead(&conceptsCell, fpa, chip, cell, source, db, cell->concepts) &&
-           ((propagate && conceptsRead(&conceptsChip, fpa, chip, cell, source, db, chip->concepts) &&
-             conceptsRead(&conceptsFPA, fpa, chip, cell, source, db, fpa->concepts)) || !propagate);
+    return conceptsRead(&conceptsCell, fpa, chip, cell, &cell->conceptsRead, source, db, cell->concepts) &&
+           ((propagate && conceptsRead(&conceptsChip, fpa, chip, cell, &chip->conceptsRead, source, db,
+                                       chip->concepts) &&
+             conceptsRead(&conceptsFPA, fpa, chip, cell, &fpa->conceptsRead, source, db, fpa->concepts)) ||
+            !propagate);
 }
 
@@ -274,4 +285,6 @@
 bool pmConceptsInit(void)
 {
+    conceptsInitialised = true;
+
     bool init = false;                  // Did we initialise anything?
     if (! conceptsFPA) {
@@ -505,6 +518,4 @@
     }
 
-    conceptsInitialised = true;
-
     return init;
 }
