Index: trunk/psModules/src/concepts/pmConcepts.c
===================================================================
--- trunk/psModules/src/concepts/pmConcepts.c	(revision 15770)
+++ trunk/psModules/src/concepts/pmConcepts.c	(revision 16218)
@@ -739,5 +739,5 @@
         }
 
-	// FPA.PON.TIME
+        // FPA.PON.TIME
         {
             psMetadataItem *item = psMetadataItemAllocF32("FPA.PON.TIME", "Power On Time", NAN);
@@ -1035,7 +1035,42 @@
 
 
-// XXX EAM : Paul, please handle the biassec independently so the
-// psList is copied without a verbose warning.  when this is fixed, you can
-// convert the trace back to a log (psMetadata.c:429)
+// List of concepts not to copy, for each level.
+// Must be NULL-terminated
+static const char *dontCopyConceptsFPA[] = { "FPA.NAME", 0 };
+static const char *dontCopyConceptsChip[] = { "CHIP.NAME", 0 };
+static const char *dontCopyConceptsCell[] = { "CELL.NAME", "CELL.TRIMSEC", "CELL.BIASSEC", 0 };
+
+// Copy concepts from a source container to a target container, avoiding certain entries
+static void copyConcepts(psMetadata *target, // Target metadata container
+                         psMetadata *source, // Source metadata container
+                         const char *dontCopyConcepts[] // Don't copy these concepts
+                         )
+{
+    assert(target);
+    assert(source);
+    assert(dontCopyConcepts);
+
+    psMetadataIterator *iter = psMetadataIteratorAlloc(source, PS_LIST_HEAD, NULL);
+    psMetadataItem *item;               // Item from iteration
+    while ((item = psMetadataGetAndIncrement(iter))) {
+        const char *name = item->name;  // Name of concept
+        bool copyOK = false;            // OK to copy
+        for (int i = 0; dontCopyConcepts[i] && copyOK; i++) {
+            if (strcmp(name, dontCopyConcepts[i]) == 0) {
+                copyOK = false;
+            }
+        }
+        if (!copyOK) {
+            continue;
+        }
+        psMetadataItem *new = psMetadataItemCopy(item); // New item, a copy of the old
+        psMetadataAddItem(target, new, PS_LIST_TAIL, PS_META_REPLACE);
+        psFree(new);                    // Drop reference
+    }
+    psFree(iter);
+
+    return;
+}
+
 
 bool pmFPACopyConcepts(pmFPA *target, const pmFPA *source)
@@ -1045,5 +1080,5 @@
 
     // Copy FPA concepts
-    target->concepts = psMetadataCopy(target->concepts, source->concepts);
+    copyConcepts(target->concepts, source->concepts, dontCopyConceptsFPA);
 
     // Copy chip concepts
@@ -1061,5 +1096,6 @@
             continue;
         }
-        targetChip->concepts = psMetadataCopy(targetChip->concepts, sourceChip->concepts);
+
+        copyConcepts(targetChip->concepts, sourceChip->concepts, dontCopyConceptsChip);
 
         // Copy cell concepts
@@ -1078,18 +1114,5 @@
             }
 
-            psMetadataIterator *iter = psMetadataIteratorAlloc(sourceCell->concepts, PS_LIST_HEAD, NULL);
-            psMetadataItem *item;       // Item from iteration
-            while ((item = psMetadataGetAndIncrement(iter))) {
-                psMetadataItem *new;    // New item, a copy of the old
-                // Don't copy TRIMSEC or BIASSEC
-                if (strcmp(item->name, "CELL.TRIMSEC") != 0 && strcmp(item->name, "CELL.BIASSEC")) {
-                    new = psMetadataItemCopy(item);
-                } else {
-                    new = psMetadataItemAlloc(item->name, item->type, item->comment, NULL);
-                }
-                psMetadataAddItem(targetCell->concepts, new, PS_LIST_TAIL, PS_META_REPLACE);
-                psFree(new);        // Drop reference
-            }
-            psFree(iter);
+            copyConcepts(targetCell->concepts, sourceCell->concepts, dontCopyConceptsCell);
         }
     }
