Index: trunk/psModules/src/config/pmConfigDump.c
===================================================================
--- trunk/psModules/src/config/pmConfigDump.c	(revision 19047)
+++ trunk/psModules/src/config/pmConfigDump.c	(revision 19399)
@@ -106,75 +106,8 @@
 
 
-bool pmConfigDump(const pmConfig *config, const pmFPA *source, const char *outroot)
+bool pmConfigDump(const pmConfig *config, const pmFPA *source, const char *filename)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_STRING_NON_EMPTY(outroot, false);
-
-    pmFPAview *view = source ? pmFPAviewTop(source) : pmFPAviewAlloc(0);// View to top level
-    if (!view) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to determine top view for FPA.");
-        return false;
-    }
-
-    pmFPALevel level = pmFPAviewLevel(view); // Level for view
-    const char *levelString;    // String for level
-    switch (level) {
-      case PM_FPA_LEVEL_FPA:
-        levelString = "FPA";
-        break;
-      case PM_FPA_LEVEL_CHIP:
-        levelString = "CHIP";
-        break;
-      case PM_FPA_LEVEL_CELL:
-        levelString = "CELL";
-        break;
-      default:
-        psError(PS_ERR_UNKNOWN, false, "Bad FPA level: %x", level);
-        psFree(view);
-        return false;
-    }
-
-    psMetadata *dumpRules = psMetadataLookupMetadata(NULL, config->system, "CONFIG.DUMP"); // Name rules
-    if (!dumpRules) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to find CONFIG.DUMP in system configuration");
-        psFree(view);
-        return false;
-    }
-
-    const char *rule = psMetadataLookupStr(NULL, dumpRules, levelString); // Rule for output file name
-    if (!rule) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to find %s in CONFIG.DUMP in system configuration",
-                levelString);
-        psFree(view);
-        return false;
-    }
-
-    psString ruleCopy = psStringCopy(rule); // Copy of rule, so we can have our way with it
-
-    psStringSubstitute(&ruleCopy, outroot, "{OUTPUT}");
-
-    if (strstr(ruleCopy, "{PROGRAM}")) {
-        // basename() is allowed to muck with the values, so need to copy
-        psString program = psStringCopy(config->program); // Copy of program name
-        const char *progName = basename(program); // Basename of program
-        psStringSubstitute(&ruleCopy, progName, "{PROGRAM}");
-        psFree(program);
-    }
-
-    if (strstr(ruleCopy, "{TIMESTAMP}")) {
-        psTime *time = psTimeGetNow(PS_TIME_UTC); // Current time
-        psString timeString = psTimeToISO(time); // ISO-formatted time
-        psFree(time);
-        psStringSubstitute(&ruleCopy, timeString, "{TIMESTAMP}");
-        psFree(timeString);
-    }
-
-    psString filename = pmFPANameFromRule(ruleCopy, source, view); // Filename for dump
-    psFree(ruleCopy);
-    psFree(view);
-    if (!filename) {
-        psError(PS_ERR_UNKNOWN, false, "Unable to determine dump filename");
-        return false;
-    }
+    PS_ASSERT_STRING_NON_EMPTY(filename, false);
 
     psString resolved = pmConfigConvertFilename(filename, config, true, false); // Resolved filename
@@ -182,10 +115,8 @@
     if (!psMetadataConfigWrite(config->user, resolved)) {
         psError(PS_ERR_IO, false, "Unable to dump configuration to %s", filename);
-        psFree(filename);
         psFree(resolved);
         return false;
     }
 
-    psFree(filename);
     psFree(resolved);
 
