Index: trunk/psModules/src/config/pmConfigRun.c
===================================================================
--- trunk/psModules/src/config/pmConfigRun.c	(revision 23289)
+++ trunk/psModules/src/config/pmConfigRun.c	(revision 23447)
@@ -39,6 +39,9 @@
 }
 
-
-bool pmConfigRunFileAdd(pmConfig *config, const pmFPAfile *file)
+// Add a file to a nominated metadata in the RUN information
+static bool configRunFileAdd(pmConfig *config, // Configuration
+                             const pmFPAfile *file, // File to add
+                             const char *target // Name of metadata to which to add
+                             )
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
@@ -47,5 +50,5 @@
     psMetadata *run = configRun(config);// RUN information
     psAssert(run, "Require run-time information");
-    psMetadata *files = configElement(run, "FILES", "Filerules used during execution");
+    psMetadata *files = configElement(run, target, "Filerules used during execution");
     psAssert(files, "Require list of files");
 
@@ -71,13 +74,35 @@
 }
 
-psArray *pmConfigRunFileGet(pmConfig *config, const char *name)
+bool pmConfigRunFileAddRead(pmConfig *config, const pmFPAfile *file)
 {
     PS_ASSERT_PTR_NON_NULL(config, false);
-    PS_ASSERT_STRING_NON_EMPTY(name, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
 
+    return configRunFileAdd(config, file, "FILES.INPUT");
+}
+
+bool pmConfigRunFileAddWrite(pmConfig *config, const pmFPAfile *file)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    PS_ASSERT_PTR_NON_NULL(file, false);
+
+    return configRunFileAdd(config, file, "FILES.OUTPUT");
+}
+
+// Get an array of filenames from the nominated RUN information
+static psArray *configRunFileGet(pmConfig *config, // Configuration
+                                 const char *name, // Name of file
+                                 const char *source // Source metadata for file
+                                 )
+{
     psMetadata *run = configRun(config);// RUN information
     psAssert(run, "Require run-time information");
-    psMetadata *files = configElement(run, "FILES", "Filerules used during execution");
+    psMetadata *files = configElement(run, source, "Filerules used during execution");
     psAssert(files, "Require list of files");
+
+    if (psListLength(files->list) == 0) {
+        // Can't find anything
+        return NULL;
+    }
 
     psList *list = psListAlloc(NULL);   // List of file names
@@ -104,4 +129,19 @@
 
     return array;
+}
+
+
+psArray *pmConfigRunFileGet(pmConfig *config, const char *name)
+{
+    PS_ASSERT_PTR_NON_NULL(config, false);
+    PS_ASSERT_STRING_NON_EMPTY(name, false);
+
+    // Try the input and output, in turn
+    psArray *files = configRunFileGet(config, name, "FILES.INPUT"); // Files from RUN metadata
+    if (!files) {
+        configRunFileGet(config, name, "FILES.OUTPUT");
+    }
+
+    return files;
 }
 
Index: trunk/psModules/src/config/pmConfigRun.h
===================================================================
--- trunk/psModules/src/config/pmConfigRun.h	(revision 23289)
+++ trunk/psModules/src/config/pmConfigRun.h	(revision 23447)
@@ -6,6 +6,12 @@
 #include <pmFPAfile.h>
 
-/// Add a file to the list of files used in the run-time information
-bool pmConfigRunFileAdd(
+/// Add a file to the list of files read in the run-time information
+bool pmConfigRunFileAddRead(
+    pmConfig *config,                   ///< Configuration
+    const pmFPAfile *file               ///< File to add
+    );
+
+/// Add a file to the list of files written in the run-time information
+bool pmConfigRunFileAddWrite(
     pmConfig *config,                   ///< Configuration
     const pmFPAfile *file               ///< File to add
