Index: trunk/psModules/src/concepts/pmConcepts.c
===================================================================
--- trunk/psModules/src/concepts/pmConcepts.c	(revision 10644)
+++ trunk/psModules/src/concepts/pmConcepts.c	(revision 10967)
@@ -37,4 +37,51 @@
     return spec;
 }
+
+psList *pmConceptsList(pmFPALevel level)
+{
+    if (!conceptsInitialised) {
+        pmConceptsInit();
+    }
+
+    // Get the appropriate concepts
+    psMetadata *concepts = NULL;        // Metadata of concepts specs
+    switch (level) {
+    case PM_FPA_LEVEL_FPA:
+        concepts = conceptsFPA;
+        break;
+    case PM_FPA_LEVEL_CHIP:
+        concepts = conceptsChip;
+        break;
+    case PM_FPA_LEVEL_CELL:
+        concepts = conceptsCell;
+        break;
+    default:
+        psError(PS_ERR_IO, true, "Invalid concept level provided: %d\n", level);
+        return NULL;
+    }
+
+    // Pull out the names
+    psList *list = psListAlloc(NULL);   // List of concepts' names
+    psMetadataIterator *iter = psMetadataIteratorAlloc(concepts, PS_LIST_HEAD, NULL); // Iterator
+    psMetadataItem *item;               // Item from iteration
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        psListAdd(list, PS_LIST_TAIL, item->name);
+    }
+    psFree(iter);
+    return list;
+}
+
+
+psList *psMetadataKeys(psMetadata *md)
+{
+    psList *list = psListAlloc(NULL);   // List with the keys
+    psMetadataIterator *iter = psMetadataIteratorAlloc(md, PS_LIST_HEAD, false);
+    psMetadataItem *item;               // Item from iteration
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        psListAdd(list, PS_LIST_TAIL, item->name);
+    }
+    return list;
+}
+
 
 
@@ -246,5 +293,5 @@
         for (long i = 0; i < chips->n; i++) {
             pmChip *chip = chips->data[i]; // Chip of interest
-            if (chip && !chip->hdu) {
+            if (chip) {
                 success |= pmConceptsReadChip(chip, source, false, true, db);
             }
@@ -287,5 +334,5 @@
     bool success = conceptsRead(&conceptsChip, fpa, chip, NULL, &chip->conceptsRead, source, db,
                                 chip->concepts);
-    if (propagateUp && !fpa->hdu) {
+    if (propagateUp) {
         success |= conceptsRead(&conceptsFPA, fpa, chip, NULL, &fpa->conceptsRead, source, db, fpa->concepts);
     }
@@ -294,5 +341,5 @@
         for (long i = 0; i < cells->n; i++) {
             pmCell *cell = cells->data[i];  // Cell of interest
-            if (cell && !cell->hdu) {
+            if (cell) {
                 success |= pmConceptsReadCell(cell, source, false, db);
             }
@@ -341,12 +388,8 @@
                                 cell->concepts);
     if (propagateUp) {
-        if (!chip->hdu) {
-            success |= conceptsRead(&conceptsChip, fpa, chip, cell, &chip->conceptsRead, source, db,
-                                    chip->concepts);
-            if (!fpa->hdu) {
-                success |= conceptsRead(&conceptsFPA, fpa, chip, cell, &fpa->conceptsRead, source, db,
-                                        fpa->concepts);
-            }
-        }
+        success |= conceptsRead(&conceptsChip, fpa, chip, cell, &chip->conceptsRead, source, db,
+                                chip->concepts);
+        success |= conceptsRead(&conceptsFPA, fpa, chip, cell, &fpa->conceptsRead, source, db,
+                                fpa->concepts);
     }
 
