Index: trunk/psphot/src/psphotFullForceSummary.c
===================================================================
--- trunk/psphot/src/psphotFullForceSummary.c	(revision 36666)
+++ trunk/psphot/src/psphotFullForceSummary.c	(revision 36718)
@@ -187,12 +187,25 @@
 
     // Convert to an array indexed by ID
-    psArray *sortedTable = psArrayAlloc(4*inTable->n);
+#define MAX_MODEL_TYPE 10
+    psArray *sortedTables = psArrayAlloc(MAX_MODEL_TYPE+1);
     for (int i=0; i<inTable->n; i++) {
         psMetadata *row = inTable->data[i];
         psS32 ID = psMetadataLookupS32(&status, row, "ID");
+        psS32 modelType = psMetadataLookupS32(&status, row, "MODEL_TYPE");
+        // XXX: need to use the lookup table functions to be ready for changes in the model type numbers
+        if (modelType+1 >= MAX_MODEL_TYPE) {
+            psError(PSPHOT_ERR_CONFIG, false, "found modelType %d max allowed is %d", modelType, MAX_MODEL_TYPE);
+            return false;
+        }
+        psArray *sortedTable = sortedTables->data[modelType+1];
+        if (!sortedTable) {
+            sortedTable = psArrayAlloc(4*inTable->n);
+            sortedTables->data[modelType+1] = sortedTable;
+            // dont' free sortedTable the array of tables gets our reference
+        }
         if (ID >= sortedTable->n) {
             sortedTable = psArrayRealloc(sortedTable, 2*ID);
             // Why doesn't psArrayRealloc do this?????
-            sortedTable->n = sortedTable->nalloc;
+                sortedTable->n = sortedTable->nalloc;
         }
         if (sortedTable->data[ID]) {
@@ -202,7 +215,7 @@
         sortedTable->data[ID] = psMemIncrRefCounter(row);
     }
-    psMetadataAddArray(config->arguments, PS_LIST_TAIL, "CFF_TABLE", PS_META_REPLACE, "cff table", sortedTable);
+    psMetadataAddArray(config->arguments, PS_LIST_TAIL, "CFF_TABLES", PS_META_REPLACE, "cff tables", sortedTables);
     psFree(inTable);
-    psFree(sortedTable);
+    psFree(sortedTables);
 
     return true;
