Revert "temporarily empty repository"

This reverts commit d57ed128cd36e12f5cc1e3304f67bd5c10f0735c.
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..ebe0e5b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,24 @@
+# ignore project files #
+.classpath
+.project
+.settings/
+catalog-v001.xml
+
+# ignore target files #
+target/
+bin/
+build/
+dist/
+apidoc/
+*.swp
+
+# ignore svn files if there
+.svn
+
+# ignore log files #
+*.log
+/logs/*
+*/logs/*
+
+
+
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..dff5f3a
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1 @@
+language: java
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..bcd653c
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+# Apache Taverna Commandline
+
+[![Build Status](https://travis-ci.org/taverna-incubator/incubator-taverna-commandline.svg)](https://travis-ci.org/taverna-incubator/incubator-taverna-commandline)
+
+After building, see taverna-commandline-product/target/apache-taverna-commandline-3.1.0-incubating-SNAPSHOT-dev/apache-taverna-commandline-3.1.0-incubating-SNAPSHOT/ or equivalent
+
diff --git a/pom.xml b/pom.xml
new file mode 100644
index 0000000..0355623
--- /dev/null
+++ b/pom.xml
@@ -0,0 +1,40 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.taverna</groupId>
+		<artifactId>taverna-parent</artifactId>
+		<version>1-incubating-SNAPSHOT</version>
+	</parent>
+	<groupId>org.apache.taverna.commandline</groupId>
+	<artifactId>taverna-commandline</artifactId>
+	<version>3.1.0.incubating-SNAPSHOT</version>
+	<packaging>pom</packaging>
+	<name>Apache Taverna Command Line</name>
+  <properties>
+    <taverna.language.version>0.15.0-incubating-SNAPSHOT</taverna.language.version>
+    <taverna.osgi.version>0.2.0-incubating-SNAPSHOT</taverna.osgi.version>
+    <taverna.engine.version>3.1.0-incubating-SNAPSHOT</taverna.engine.version>
+    <taverna.commonactivities.version>2.1.0-incubating-SNAPSHOT</taverna.commonactivities.version>
+  </properties>
+	<modules>
+    <module>taverna-commandline-api</module>
+    <module>taverna-commandline-common</module>
+    <module>taverna-commandline-launcher</module>
+    <module>taverna-commandline-product</module>
+    <!--
+    <module>taverna-commandline-tests</module>
+    -->
+  </modules>
+  <repositories>
+    <repository>
+      <id>taverna-incubating</id>
+      <name>Apache Taverna incubating Repository</name>
+        <url>http://repository.mygrid.org.uk/artifactory/incubator-snapshot-local/</url>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+      <snapshots />
+    </repository>
+  </repositories>
+</project>
diff --git a/taverna-commandline-api/pom.xml b/taverna-commandline-api/pom.xml
new file mode 100644
index 0000000..98ae247
--- /dev/null
+++ b/taverna-commandline-api/pom.xml
@@ -0,0 +1,12 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.taverna.commandline</groupId>
+		<artifactId>taverna-commandline</artifactId>
+		<version>3.1.0.incubating-SNAPSHOT</version>
+	</parent>
+	<packaging>bundle</packaging>
+	<artifactId>taverna-commandline-api</artifactId>
+	<name>Apache Taverna Commandline API</name>
+</project>
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/ArgumentsParsingException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/ArgumentsParsingException.java
new file mode 100644
index 0000000..eb21cd7
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/ArgumentsParsingException.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+@SuppressWarnings("serial")
+public class ArgumentsParsingException extends Exception {
+
+	public ArgumentsParsingException(String message) {
+		super(message);
+	}
+	
+	public ArgumentsParsingException(String message, Throwable cause) {
+		super(message, cause);
+	}
+}
+
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/CommandLineMasterPasswordException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/CommandLineMasterPasswordException.java
new file mode 100644
index 0000000..0714275
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/CommandLineMasterPasswordException.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+@SuppressWarnings("serial")
+public class CommandLineMasterPasswordException extends Exception {
+
+	public CommandLineMasterPasswordException(String message) {
+		super(message);
+	}
+	
+	public CommandLineMasterPasswordException(String message, Throwable cause) {
+		super(message, cause);
+	}
+}
+
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/DatabaseConfigurationException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/DatabaseConfigurationException.java
new file mode 100644
index 0000000..616fb70
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/DatabaseConfigurationException.java
@@ -0,0 +1,43 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+public class DatabaseConfigurationException extends Exception {
+	
+	private static final long serialVersionUID = -4128248547532355697L;
+
+	public DatabaseConfigurationException() {
+
+	}
+
+	public DatabaseConfigurationException(String message) {
+		super(message);
+	}
+
+	public DatabaseConfigurationException(Throwable cause) {
+		super(cause);
+	}
+
+	public DatabaseConfigurationException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+}
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/InputMismatchException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/InputMismatchException.java
new file mode 100644
index 0000000..da03891
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/InputMismatchException.java
@@ -0,0 +1,61 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+import java.util.Set;
+
+public class InputMismatchException extends InvalidOptionException {	
+	
+	private static final long serialVersionUID = -5368068332397293706L;
+	private final Set<String> expectedInputNames;
+	private final Set<String> providedInputNames;
+	
+	public InputMismatchException(String msg, Set<String> expectedInputNames, Set<String> providedInputNames) {
+		super(msg);
+		this.expectedInputNames = expectedInputNames;
+		this.providedInputNames = providedInputNames;				
+	}
+
+	public String getMessage() {
+		String result = super.getMessage();
+		
+		if (expectedInputNames != null){
+			result += "\n" + expectedInputNames.size() + " inputs were expected";
+			if (expectedInputNames.size()>0) result += " which are:\n";
+			for (String name : expectedInputNames) {
+				result += "'"+name+"' ";			
+			}			
+		}
+		
+		if (providedInputNames != null){
+			result += "\n" + providedInputNames.size()
+					+ " inputs were provided";
+			if (providedInputNames.size() > 0)
+				result += " which are:\n";
+			for (String name : providedInputNames) {
+				result += "'" + name + "' ";
+			}
+		}
+		return result;
+	}
+	
+
+}
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/InvalidOptionException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/InvalidOptionException.java
new file mode 100644
index 0000000..c07a19f
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/InvalidOptionException.java
@@ -0,0 +1,30 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+public class InvalidOptionException extends Exception {
+
+	private static final long serialVersionUID = 2467409785164223258L;
+
+	public InvalidOptionException(String message) {
+		super(message);
+	}
+}
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/OpenDataflowException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/OpenDataflowException.java
new file mode 100644
index 0000000..664ab71
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/OpenDataflowException.java
@@ -0,0 +1,44 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+public class OpenDataflowException extends Exception {
+
+	
+	private static final long serialVersionUID = 4778578311101082197L;
+
+	public OpenDataflowException() {
+		
+	}
+
+	public OpenDataflowException(String message) {
+		super(message);	
+	}
+
+	public OpenDataflowException(Throwable cause) {
+		super(cause);
+	}
+
+	public OpenDataflowException(String message, Throwable cause) {
+		super(message, cause);
+	}
+
+}
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/ReadInputException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/ReadInputException.java
new file mode 100644
index 0000000..226d6ea
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/ReadInputException.java
@@ -0,0 +1,35 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+public class ReadInputException extends Exception {
+		
+	private static final long serialVersionUID = -3494432791254643055L;
+
+	public ReadInputException(String msg) {
+		super(msg); 
+	}
+	
+	public ReadInputException(String msg, Throwable e) {
+		super(msg,e); 
+	}
+	
+}
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/SaveResultsException.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/SaveResultsException.java
new file mode 100644
index 0000000..7ad460d
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/exceptions/SaveResultsException.java
@@ -0,0 +1,34 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester   
+ * 
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ * 
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *    
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *    
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.exceptions;
+
+@SuppressWarnings("serial")
+public class SaveResultsException extends Exception {
+
+	public SaveResultsException(String message) {
+		super(message);
+	}
+	
+	public SaveResultsException(String message, Throwable cause) {
+		super(message, cause);
+	}
+}
+
diff --git a/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/options/CommandLineOptions.java b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/options/CommandLineOptions.java
new file mode 100644
index 0000000..dd8e20f
--- /dev/null
+++ b/taverna-commandline-api/src/main/java/net/sf/taverna/t2/commandline/options/CommandLineOptions.java
@@ -0,0 +1,119 @@
+/*******************************************************************************
+ * Copyright (C) 2013 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.options;
+
+import net.sf.taverna.t2.commandline.exceptions.InvalidOptionException;
+
+/**
+ *
+ *
+ * @author David Withers
+ */
+public interface CommandLineOptions {
+
+	public static final String CREDENTIAL_MANAGER_DIR_OPTION = "cmdir";
+	public static final String CREDENTIAL_MANAGER_PASSWORD_OPTION = "cmpassword";
+
+	public boolean askedForHelp();
+
+	public boolean isProvenanceEnabled();
+
+	public void displayHelp();
+
+	public void displayHelp(boolean showFullText);
+
+	public String[] getArgs();
+
+	/**
+	 *
+	 * @return the port that the database should run on
+	 */
+	public String getDatabasePort();
+
+	/**
+	 *
+	 * @return a path to a properties file that contains database configuration
+	 *         settings
+	 */
+	public String getDatabaseProperties();
+
+	/**
+	 * Returns an array that alternates between a portname and path to a file
+	 * containing the input values. Therefore the array will always contain an
+	 * even number of elements
+	 *
+	 * @return an array of portname and path to files containing individual
+	 *         inputs.
+	 */
+	public String[] getInputFiles();
+
+	public String[] getInputValues();
+
+	public String getLogFile();
+
+	/**
+	 *
+	 * @return the directory to write the results to
+	 */
+	public String getOutputDirectory();
+
+	public boolean getStartDatabase();
+
+	/**
+	 * @return the directory with Credential Manager's files
+	 */
+	public String getCredentialManagerDir();
+
+	public boolean getStartDatabaseOnly() throws InvalidOptionException;
+
+	public String getWorkflow() throws InvalidOptionException;
+
+	public boolean hasDelimiterFor(String inputName);
+
+	public boolean hasInputFiles();
+
+	public boolean hasInputValues();
+
+	public boolean hasLogFile();
+
+	public boolean hasOption(String option);
+	
+	public boolean hasSaveResultsToBundle() ;
+
+	public String inputDelimiter(String inputName);
+
+	public boolean isClientServer();
+
+	public boolean isEmbedded();
+
+	public boolean isInMemory();
+
+	/**
+	 * Save the results to a directory if -outputdir has been explicitly defined,
+	 * or if -outputdoc has not been defined.
+	 *
+	 * @return boolean
+	 */
+	public boolean saveResultsToDirectory();
+
+	public String saveResultsToBundle();
+
+}
\ No newline at end of file
diff --git a/taverna-commandline-common/pom.xml b/taverna-commandline-common/pom.xml
new file mode 100644
index 0000000..17c6a42
--- /dev/null
+++ b/taverna-commandline-common/pom.xml
@@ -0,0 +1,88 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.taverna.commandline</groupId>
+		<artifactId>taverna-commandline</artifactId>
+		<version>3.1.0.incubating-SNAPSHOT</version>
+	</parent>
+	<artifactId>taverna-commandline-common</artifactId>
+	<packaging>bundle</packaging>
+	<name>Apache Taverna Commandline Common</name>
+	<dependencies>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-commandline-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-run-api</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-database-configuration-api</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-api</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-validation</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-validation-structural</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-validation-correctness</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-databundle</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+
+<!--
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>provenanceconnector</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+ -->
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-credential-manager</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>${commons.io.version}</version>
+		</dependency>
+
+		<!-- <dependency> <groupId>uk.org.mygrid.resources.mimeutil</groupId> <artifactId>mime-util</artifactId>
+			<version>2.1.2-2</version> </dependency> -->
+
+		<!-- TEST -->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>${junit.version}</version>
+			<scope>test</scope>
+		</dependency>
+
+	</dependencies>
+
+</project>
diff --git a/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/CommandLineMasterPasswordProvider.java b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/CommandLineMasterPasswordProvider.java
new file mode 100644
index 0000000..048e582
--- /dev/null
+++ b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/CommandLineMasterPasswordProvider.java
@@ -0,0 +1,184 @@
+/*******************************************************************************
+ * Copyright (C) 2008-2010 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline;
+
+import java.io.BufferedReader;
+import java.io.Console;
+import java.io.File;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+
+import net.sf.taverna.t2.commandline.exceptions.CommandLineMasterPasswordException;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+import net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider;
+
+import org.apache.log4j.Logger;
+
+/**
+ * An implementation of {@link MasterPasswordProvider} that reads Credential Manager's
+ * master password from stdin (pipe or terminal) is -cmpassword option is present in command
+ * line arguments. Otherwise it tries to read it from a special file password.txt in a special
+ * directory specified by -cmdir option, if present.
+ *
+ * @author Alex Nenadic
+ */
+public class CommandLineMasterPasswordProvider implements MasterPasswordProvider {
+
+	private static final String CREDENTIAL_MANAGER_MASTER_PASSWORD_OPTION = "cmpassword";
+	private static final String CREDENTIAL_MANAGER_DIRECTORY_OPTION = "cmdir";
+
+	private static Logger logger = Logger.getLogger(CommandLineMasterPasswordProvider.class);
+
+	private String masterPassword = null;
+	private int priority = 200;
+
+	private boolean finishedReadingPassword = false;
+	private final CommandLineOptions commandLineOptions;
+
+	public CommandLineMasterPasswordProvider(CommandLineOptions commandLineOptions) {
+		this.commandLineOptions = commandLineOptions;
+	}
+
+	@Override
+	public String getMasterPassword(boolean firstTime) {
+		if (!finishedReadingPassword) {
+			// -cmpassword option was present in the command line arguments
+			if (commandLineOptions.hasOption(CREDENTIAL_MANAGER_MASTER_PASSWORD_OPTION)) {
+				// Try to read the password from stdin (terminal or pipe)
+				try {
+					masterPassword = getCredentialManagerPasswordFromStdin();
+				} catch (CommandLineMasterPasswordException e) {
+					masterPassword = null;
+				}
+			}
+			// -cmpassword option was not present in the command line arguments
+			// and -cmdir option was there - try to get the master password from
+			// the "special" password file password.txt inside the Cred. Manager directory.
+			else {
+				if (commandLineOptions.hasOption(CREDENTIAL_MANAGER_DIRECTORY_OPTION)) {
+					// Try to read the password from a special file located in
+					// Credential Manager directory (if the dir was not null)
+					try {
+						masterPassword = getCredentialManagerPasswordFromFile();
+					} catch (CommandLineMasterPasswordException ex) {
+						masterPassword = null;
+					}
+				}
+			}
+			finishedReadingPassword = true; // we do not want to attempt to read from stdin several
+											// times
+		}
+		return masterPassword;
+	}
+
+	public void setMasterPassword(String masterPassword) {
+		this.masterPassword = masterPassword;
+		finishedReadingPassword = true;
+	}
+
+	@Override
+	public int getProviderPriority() {
+		return priority;
+	}
+
+	private String getCredentialManagerPasswordFromStdin()
+			throws CommandLineMasterPasswordException {
+
+		String password = null;
+
+		Console console = System.console();
+
+		if (console == null) { // password is being piped in, not entered in the terminal by user
+			BufferedReader buffReader = null;
+			try {
+				buffReader = new BufferedReader(new InputStreamReader(System.in));
+				password = buffReader.readLine();
+			} catch (IOException ex) {
+				// For some reason the error of the exception thrown
+				// does not get printed from the Launcher so print it here as
+				// well as it gives more clue as to what is going wrong.
+				logger.error(
+						"An error occured while trying to read Credential Manager's password that was piped in: "
+								+ ex.getMessage(), ex);
+				throw new CommandLineMasterPasswordException(
+						"An error occured while trying to read Credential Manager's password that was piped in: "
+								+ ex.getMessage(), ex);
+			} finally {
+				try {
+					buffReader.close();
+				} catch (Exception ioe1) {
+					// Ignore
+				}
+			}
+		} else { // read the password from the terminal as entered by the user
+			try {
+				// Block until user enters password
+				char passwordArray[] = console.readPassword("Password for Credential Manager: ");
+				if (passwordArray != null) { // user did not abort input
+					password = new String(passwordArray);
+				} // else password will be null
+
+			} catch (Exception ex) {
+				// For some reason the error of the exception thrown
+				// does not get printed from the Launcher so print it here as
+				// well as it gives more clue as to what is going wrong.
+				logger.error(
+						"An error occured while trying to read Credential Manager's password from the terminal: "
+								+ ex.getMessage(), ex);
+				throw new CommandLineMasterPasswordException(
+						"An error occured while trying to read Credential Manager's password from the terminal: "
+								+ ex.getMessage(), ex);
+			}
+		}
+		return password;
+	}
+
+	private String getCredentialManagerPasswordFromFile() throws CommandLineMasterPasswordException {
+		String password = null;
+		if (commandLineOptions.hasOption(CREDENTIAL_MANAGER_DIRECTORY_OPTION)) {
+			String cmDir = commandLineOptions.getCredentialManagerDir();
+
+			File passwordFile = new File(cmDir, "password.txt");
+			BufferedReader buffReader = null;
+			try {
+				buffReader = new BufferedReader(new FileReader(passwordFile));
+				password = buffReader.readLine();
+			} catch (IOException ioe) {
+				// For some reason the error of the exception thrown
+				// does not get printed from the Launcher so print it here as
+				// well as it gives more clue as to what is going wrong.
+				logger.error("There was an error reading the Credential Manager password from "
+						+ passwordFile.toString() + ": " + ioe.getMessage(), ioe);
+				throw new CommandLineMasterPasswordException(
+						"There was an error reading the Credential Manager password from "
+								+ passwordFile.toString() + ": " + ioe.getMessage(), ioe);
+			} finally {
+				try {
+					buffReader.close();
+				} catch (Exception ioe1) {
+					// Ignore
+				}
+			}
+		}
+		return password;
+	}
+}
diff --git a/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/CommandLineTool.java b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/CommandLineTool.java
new file mode 100644
index 0000000..368527d
--- /dev/null
+++ b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/CommandLineTool.java
@@ -0,0 +1,437 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.sql.SQLException;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+
+import javax.naming.NamingException;
+
+import net.sf.taverna.t2.commandline.data.DatabaseConfigurationHandler;
+import net.sf.taverna.t2.commandline.data.InputsHandler;
+import net.sf.taverna.t2.commandline.data.SaveResultsHandler;
+import net.sf.taverna.t2.commandline.exceptions.DatabaseConfigurationException;
+import net.sf.taverna.t2.commandline.exceptions.InputMismatchException;
+import net.sf.taverna.t2.commandline.exceptions.InvalidOptionException;
+import net.sf.taverna.t2.commandline.exceptions.OpenDataflowException;
+import net.sf.taverna.t2.commandline.exceptions.ReadInputException;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+import net.sf.taverna.t2.security.credentialmanager.CMException;
+import net.sf.taverna.t2.security.credentialmanager.CredentialManager;
+
+import org.apache.log4j.Level;
+import org.apache.log4j.LogManager;
+import org.apache.log4j.Logger;
+import org.apache.log4j.PatternLayout;
+import org.apache.log4j.PropertyConfigurator;
+import org.apache.log4j.RollingFileAppender;
+import org.purl.wf4ever.robundle.Bundle;
+
+import uk.org.taverna.configuration.database.DatabaseConfiguration;
+import uk.org.taverna.configuration.database.DatabaseManager;
+import uk.org.taverna.databundle.DataBundles;
+import uk.org.taverna.platform.execution.api.ExecutionEnvironment;
+import uk.org.taverna.platform.execution.api.InvalidExecutionIdException;
+import uk.org.taverna.platform.execution.api.InvalidWorkflowException;
+import uk.org.taverna.platform.report.State;
+import uk.org.taverna.platform.report.WorkflowReport;
+import uk.org.taverna.platform.run.api.InvalidRunIdException;
+import uk.org.taverna.platform.run.api.RunProfile;
+import uk.org.taverna.platform.run.api.RunProfileException;
+import uk.org.taverna.platform.run.api.RunService;
+import uk.org.taverna.platform.run.api.RunStateException;
+import uk.org.taverna.scufl2.api.common.NamedSet;
+import uk.org.taverna.scufl2.api.container.WorkflowBundle;
+import uk.org.taverna.scufl2.api.core.Workflow;
+import uk.org.taverna.scufl2.api.io.ReaderException;
+import uk.org.taverna.scufl2.api.io.WorkflowBundleIO;
+import uk.org.taverna.scufl2.api.port.InputWorkflowPort;
+import uk.org.taverna.scufl2.api.port.OutputWorkflowPort;
+import uk.org.taverna.scufl2.validation.ValidationException;
+import uk.org.taverna.scufl2.validation.correctness.CorrectnessValidator;
+import uk.org.taverna.scufl2.validation.correctness.ReportCorrectnessValidationListener;
+import uk.org.taverna.scufl2.validation.structural.ReportStructuralValidationListener;
+import uk.org.taverna.scufl2.validation.structural.StructuralValidator;
+
+/**
+ * A utility class that wraps the process of executing a workflow, allowing workflows to be easily
+ * executed independently of the GUI.
+ *
+ * @author Stuart Owen
+ * @author Alex Nenadic
+ */
+public class CommandLineTool {
+	private static boolean BOOTSTRAP_LOGGING = false;
+	private static Logger logger = Logger.getLogger(CommandLineTool.class);
+
+	private RunService runService;
+	private CredentialManager credentialManager;
+	private CommandLineOptions commandLineOptions;
+	private WorkflowBundle workflowBundle;
+	private WorkflowBundleIO workflowBundleIO;
+	private DatabaseConfiguration databaseConfiguration;
+	private DatabaseManager databaseManager;
+
+	public void run() {
+		try {
+			if (BOOTSTRAP_LOGGING)
+				initialiseLogging();
+			int result = setupAndExecute();
+			System.exit(result);
+		} catch (InvalidOptionException | IOException | ReadInputException
+				| InvalidRunIdException | RunStateException
+				| InvalidExecutionIdException | OpenDataflowException
+				| RunProfileException e) {
+			error(e.getMessage());
+		} catch (CMException e) {
+			error("There was an error initializing Taverna's SSLSocketFactory from Credential Manager. "
+					+ e.getMessage());
+		} catch (ReaderException e) {
+			error("There was an error reading the workflow: " + e.getMessage());
+		} catch (ValidationException e) {
+			error("There was an error validating the workflow: " + e.getMessage());
+		} catch (InvalidWorkflowException e) {
+			error("There was an error validating the workflow: " + e.getMessage());
+		} catch (DatabaseConfigurationException e) {
+			error("There was an error configuring the database: " + e.getMessage());
+		}
+		System.exit(1);
+	}
+
+	private void initialiseLogging() {
+		LogManager.resetConfiguration();
+
+		if (System.getProperty("log4j.configuration") == null) {
+			try {
+				PropertyConfigurator.configure(CommandLineTool.class.getClassLoader()
+						.getResource("cl-log4j.properties").toURI().toURL());
+			} catch (MalformedURLException e) {
+				logger.error("There was a serious error reading the default logging configuration",
+						e);
+			} catch (URISyntaxException e) {
+				logger.error("There was a serious error reading the default logging configuration",
+						e);
+			}
+
+		} else {
+			PropertyConfigurator.configure(System.getProperty("log4j.configuration"));
+		}
+
+		if (commandLineOptions.hasLogFile()) {
+			RollingFileAppender appender;
+			try {
+
+				PatternLayout layout = new PatternLayout("%-5p %d{ISO8601} (%c:%L) - %m%n");
+				appender = new RollingFileAppender(layout, commandLineOptions.getLogFile());
+				appender.setMaxFileSize("1MB");
+				appender.setEncoding("UTF-8");
+				appender.setMaxBackupIndex(4);
+				// Let root logger decide level
+				appender.setThreshold(Level.ALL);
+				LogManager.getRootLogger().addAppender(appender);
+			} catch (IOException e) {
+				System.err.println("Could not log to " + commandLineOptions.getLogFile());
+			}
+		}
+	}
+
+	public int setupAndExecute() throws InputMismatchException, InvalidOptionException,
+			CMException, OpenDataflowException, ReaderException, IOException, ValidationException,
+			ReadInputException, InvalidWorkflowException, RunProfileException,
+			InvalidRunIdException, RunStateException, InvalidExecutionIdException, DatabaseConfigurationException {
+
+		if (!commandLineOptions.askedForHelp()) {
+			 setupDatabase(commandLineOptions);
+
+			if (commandLineOptions.getWorkflow() != null) {
+				
+				/* Set context class loader to us, 
+				 * so that things such as JSON-LD caching of
+				 * robundle works.
+				 */
+				
+				Thread.currentThread().setContextClassLoader(getClass().getClassLoader());
+				
+				
+				/*
+				 * Initialise Credential Manager and SSL stuff quite early as
+				 * parsing and validating the workflow may require it
+				 */
+				String credentialManagerDirPath = commandLineOptions.getCredentialManagerDir();
+
+				/*
+				 * If credentialManagerDirPath is null, the Credential Manager
+				 * will be initialized from the default location in
+				 * <TAVERNA_HOME>/security somewhere inside user's home
+				 * directory. This should not be used when running command line
+				 * tool on a server and the Credential Manager dir path should
+				 * always be passed in as we do not want to store the security
+				 * files in user's home directory on the server (we do not even
+				 * know which user the command line tool will be running as).
+				 */
+				if (credentialManagerDirPath != null) {
+					credentialManager.setConfigurationDirectoryPath(new File(
+							credentialManagerDirPath));
+				}
+
+				// Initialise the SSL stuff - set the SSLSocketFactory
+				// to use Taverna's Keystore and Truststore.
+				credentialManager.initializeSSL();
+
+				URL workflowURL = readWorkflowURL(commandLineOptions.getWorkflow());
+
+				workflowBundle = workflowBundleIO.readBundle(workflowURL, null);
+
+				logger.debug("Read the wf bundle");
+
+				validateWorkflowBundle(workflowBundle);
+				logger.debug("Validated the wf bundle");
+
+
+				Set<ExecutionEnvironment> executionEnvironments = runService
+						.getExecutionEnvironments();
+
+				ExecutionEnvironment executionEnvironment = null;
+
+				/*
+				 * Find the right execution environment, e.g. local execution
+				 * with the correct reference service based on command line
+				 * options
+				 */
+				while (executionEnvironments.iterator().hasNext()) {
+					// TODO Choose the right one
+					// take the fist one for now
+					executionEnvironment = executionEnvironments.iterator().next();
+					break;
+				}
+
+				logger.debug("Got the execution environment");
+
+				InputsHandler inputsHandler = new InputsHandler();
+				Map<String, InputWorkflowPort> portMap = new HashMap<String, InputWorkflowPort>();
+
+				Workflow workflow = workflowBundle.getMainWorkflow();
+
+				for (InputWorkflowPort port : workflow.getInputPorts()) {
+					portMap.put(port.getName(), port);
+				}
+				inputsHandler.checkProvidedInputs(portMap, commandLineOptions);
+				logger.debug("Checked inputs");
+
+				Bundle inputs = inputsHandler.registerInputs(portMap, commandLineOptions, null);
+				logger.debug("Registered inputs");
+
+				RunProfile runProfile = new RunProfile(executionEnvironment, workflowBundle, inputs);
+
+				String runId = runService.createRun(runProfile);
+
+				runService.start(runId);
+				logger.debug("Started wf run");
+
+				WorkflowReport report = runService.getWorkflowReport(runId);
+
+				while (!workflowFinished(report)) {
+					try {
+						Thread.sleep(500);
+					} catch (InterruptedException e) {
+						System.err.println("Interrupted while waiting for workflow to finish");
+						return 1;
+					}
+				}
+
+				NamedSet<OutputWorkflowPort> workflowOutputPorts = workflow.getOutputPorts();
+				if (!workflowOutputPorts.isEmpty()) {
+					File outputDir = null;
+
+					if (commandLineOptions.saveResultsToDirectory()) {
+						outputDir = determineOutputDir(commandLineOptions, workflowBundle.getName());
+						outputDir.mkdirs();
+					}
+
+					Path outputs = DataBundles.getOutputs(runService.getDataBundle(runId));
+
+					if (outputDir != null) {
+						SaveResultsHandler saveResultsHandler = new SaveResultsHandler(outputDir);
+
+						for (OutputWorkflowPort outputWorkflowPort : workflowOutputPorts) {
+							String workflowOutputPortName = outputWorkflowPort.getName();
+							Path output = DataBundles.getPort(outputs, workflowOutputPortName);
+							if (!DataBundles.isMissing(output)) {
+								saveResultsHandler.saveResultsForPort(workflowOutputPortName, output);
+							}
+						}
+					}
+				}
+				if (commandLineOptions.saveResultsToBundle() != null) {
+					Path bundlePath = Paths.get(commandLineOptions.saveResultsToBundle());
+					DataBundles.closeAndSaveBundle(runService.getDataBundle(runId), bundlePath);
+					System.out.println("Workflow Run Bundle saved to: " + bundlePath.toAbsolutePath());
+				} else {
+					System.out.println("Workflow Run Bundle: " + runService.getDataBundle(runId).getSource());
+					// For debugging we'll leave it in /tmp for now
+					runService.getDataBundle(runId).setDeleteOnClose(false);
+					DataBundles.closeBundle(runService.getDataBundle(runId));
+				}
+
+				if (report.getState().equals(State.FAILED)) {
+					System.out.println("Workflow failed - see report below.");
+					System.out.println(report);
+				} else if (report.getState().equals(State.COMPLETED)) {
+					System.out.println("Workflow completed.");
+				}
+
+			}
+		} else {
+			commandLineOptions.displayHelp();
+		}
+
+		// wait until user hits CTRL-C before exiting
+		if (commandLineOptions.getStartDatabaseOnly()) {
+			// FIXME: need to do this more gracefully.
+			while (true) {
+				try {
+					Thread.sleep(500);
+				} catch (InterruptedException e) {
+					return 0;
+				}
+			}
+		}
+
+		return 0;
+	}
+
+	private boolean workflowFinished(WorkflowReport report) {
+		State state = report.getState();
+		if (state == State.CANCELLED || state == State.COMPLETED || state == State.FAILED) {
+			return true;
+		}
+		return false;
+	}
+
+	protected void validateWorkflowBundle(WorkflowBundle workflowBundle) throws ValidationException {
+		CorrectnessValidator cv = new CorrectnessValidator();
+		ReportCorrectnessValidationListener rcvl = new ReportCorrectnessValidationListener();
+		cv.checkCorrectness(workflowBundle, true, rcvl);
+		if (rcvl.detectedProblems()) {
+			throw rcvl.getException();
+		}
+
+		StructuralValidator sv = new StructuralValidator();
+		ReportStructuralValidationListener rsvl = new ReportStructuralValidationListener();
+		sv.checkStructure(workflowBundle, rsvl);
+		if (rsvl.detectedProblems()) {
+			throw rcvl.getException();
+		}
+	}
+
+	private void setupDatabase(CommandLineOptions options)
+			throws DatabaseConfigurationException {
+		DatabaseConfigurationHandler dbHandler = new DatabaseConfigurationHandler(
+				options, databaseConfiguration, databaseManager);
+		dbHandler.configureDatabase();
+		try {
+			if (!options.isInMemory())
+				dbHandler.testDatabaseConnection();
+		} catch (NamingException e) {
+			throw new DatabaseConfigurationException(
+					"There was an error trying to setup the database datasource: "
+							+ e.getMessage(), e);
+		} catch (SQLException e) {
+			if (options.isClientServer())
+				throw new DatabaseConfigurationException(
+						"There was an error whilst making a test database connection. If running with -clientserver you should check that a server is running (check -startdb or -dbproperties)",
+						e);
+			if (options.isEmbedded())
+				throw new DatabaseConfigurationException(
+						"There was an error whilst making a test database connection. If running with -embedded you should make sure that another process isn't using the database, or a server running through -startdb",
+						e);
+		}
+	}
+
+	private File determineOutputDir(CommandLineOptions options, String dataflowName) {
+		File result = new File(dataflowName + "_output");
+		int x = 1;
+		while (result.exists()) {
+			result = new File(dataflowName + "_output_" + x);
+			x++;
+		}
+		System.out.println("Outputs will be saved to the directory: "
+				+ result.getAbsolutePath());
+		return result;
+	}
+
+	protected void error(String msg) {
+		System.err.println(msg);
+	}
+
+	private URL readWorkflowURL(String workflowOption) throws OpenDataflowException {
+		try {
+			return new URL(new URL("file:"), workflowOption);
+		} catch (MalformedURLException e) {
+			throw new OpenDataflowException("The was an error processing the URL to the workflow: "
+					+ e.getMessage(), e);
+		}
+	}
+
+	public void setCommandLineOptions(CommandLineOptions commandLineOptions){
+		this.commandLineOptions = commandLineOptions;
+	}
+
+	public void setRunService(RunService runService) {
+		this.runService = runService;
+	}
+
+	public void setCredentialManager(CredentialManager credentialManager) {
+		this.credentialManager = credentialManager;
+	}
+
+	public void setWorkflowBundleIO(WorkflowBundleIO workflowBundleIO) {
+		this.workflowBundleIO = workflowBundleIO;
+	}
+
+	/**
+	 * Sets the databaseConfiguration.
+	 *
+	 * @param databaseConfiguration the new value of databaseConfiguration
+	 */
+	public void setDatabaseConfiguration(DatabaseConfiguration databaseConfiguration) {
+		this.databaseConfiguration = databaseConfiguration;
+	}
+
+	/**
+	 * Sets the databaseManager.
+	 *
+	 * @param databaseManager the new value of databaseManager
+	 */
+	public void setDatabaseManager(DatabaseManager databaseManager) {
+		this.databaseManager = databaseManager;
+	}
+
+}
diff --git a/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/DatabaseConfigurationHandler.java b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/DatabaseConfigurationHandler.java
new file mode 100644
index 0000000..46b6c92
--- /dev/null
+++ b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/DatabaseConfigurationHandler.java
@@ -0,0 +1,154 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.data;
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Properties;
+
+import javax.naming.NamingException;
+
+import net.sf.taverna.t2.commandline.exceptions.DatabaseConfigurationException;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+
+import org.apache.log4j.Logger;
+
+import uk.org.taverna.configuration.database.DatabaseConfiguration;
+import uk.org.taverna.configuration.database.DatabaseManager;
+
+/**
+ * Handles the initialisation and configuration of the data source according to
+ * the command line arguments, or a properties file.
+ * This also handles starting a network based instance of a Derby server, if requested.
+ *
+ * @author Stuart Owen
+ *
+ */
+public class DatabaseConfigurationHandler {
+
+	private static Logger logger = Logger.getLogger(DatabaseConfigurationHandler.class);
+	private final CommandLineOptions options;
+	private final DatabaseConfiguration dbConfig;
+	private final DatabaseManager databaseManager;
+
+	public DatabaseConfigurationHandler(CommandLineOptions options, DatabaseConfiguration databaseConfiguration, DatabaseManager databaseManager) {
+		this.options = options;
+		this.dbConfig = databaseConfiguration;
+		this.databaseManager = databaseManager;
+		databaseConfiguration.disableAutoSave();
+	}
+
+	public void configureDatabase() throws DatabaseConfigurationException {
+		overrideDefaults();
+		useOptions();
+		if (dbConfig.getStartInternalDerbyServer()) {
+			databaseManager.startDerbyNetworkServer();
+			System.out.println("Started Derby Server on Port: "
+					+ dbConfig.getCurrentPort());
+		}
+	}
+
+	public DatabaseConfiguration getDBConfig() {
+		return dbConfig;
+	}
+
+	private void importConfigurationFromStream(InputStream inStr)
+			throws IOException {
+		Properties p = new Properties();
+		p.load(inStr);
+		for (Object key : p.keySet()) {
+			dbConfig.setProperty((String)key, p.getProperty((String)key).trim());
+		}
+	}
+
+	protected void overrideDefaults() throws DatabaseConfigurationException {
+
+		InputStream inStr = DatabaseConfigurationHandler.class.getClassLoader().getResourceAsStream("database-defaults.properties");
+		try {
+			importConfigurationFromStream(inStr);
+		} catch (IOException e) {
+			throw new DatabaseConfigurationException("There was an error reading the default database configuration settings: "+e.getMessage(),e);
+		}
+	}
+
+	protected void readConfigirationFromFile(String filename) throws IOException {
+		FileInputStream fileInputStream = new FileInputStream(filename);
+		importConfigurationFromStream(fileInputStream);
+		fileInputStream.close();
+	}
+
+	public void testDatabaseConnection()
+			throws DatabaseConfigurationException, NamingException, SQLException {
+		//try and get a connection
+		Connection con = null;
+		try {
+			con = databaseManager.getConnection();
+		} finally {
+			if (con!=null)
+				try {
+					con.close();
+				} catch (SQLException e) {
+					logger.warn("There was an SQL error whilst closing the test connection: "+e.getMessage(),e);
+				}
+		}
+	}
+
+	public void useOptions() throws DatabaseConfigurationException {
+
+		if (options.hasOption("port")) {
+			dbConfig.setPort(options.getDatabasePort());
+		}
+
+		if (options.hasOption("startdb")) {
+			dbConfig.setStartInternalDerbyServer(true);
+		}
+
+		if (options.hasOption("inmemory")) {
+			dbConfig.setInMemory(true);
+		}
+
+		if (options.hasOption("embedded")) {
+			dbConfig.setInMemory(false);
+			dbConfig.setDriverClassName("org.apache.derby.jdbc.EmbeddedDriver");
+		}
+
+		if (options.isProvenanceEnabled()) {
+			dbConfig.setProvenanceEnabled(true);
+		}
+
+		if (options.hasOption("clientserver")) {
+			dbConfig.setInMemory(false);
+			dbConfig.setDriverClassName("org.apache.derby.jdbc.ClientDriver");
+			dbConfig.setJDBCUri("jdbc:derby://localhost:" + dbConfig.getPort() + "/t2-database;create=true;upgrade=true");
+		}
+
+		if (options.hasOption("dbproperties")) {
+			try {
+				readConfigirationFromFile(options.getDatabaseProperties());
+			} catch (IOException e) {
+				throw new DatabaseConfigurationException("There was an error reading the database configuration options at "+options.getDatabaseProperties()+" : "+e.getMessage(),e);
+			}
+		}
+	}
+
+}
diff --git a/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/ErrorValueHandler.java b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/ErrorValueHandler.java
new file mode 100644
index 0000000..44faea5
--- /dev/null
+++ b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/ErrorValueHandler.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.data;
+
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.List;
+
+import javax.swing.tree.DefaultMutableTreeNode;
+
+import uk.org.taverna.databundle.DataBundles;
+import uk.org.taverna.databundle.ErrorDocument;
+
+/**
+ * Handles ErrorValues and transforming them into String representations
+ * that can be stored as a file, or within a Baclava document.
+ *
+ * @author Stuart Owen
+ * @author David Withers
+ */
+public class ErrorValueHandler {
+
+	/**
+	 * Creates a string representation of the ErrorValue.
+	 * @throws IOException
+	 */
+	public static String buildErrorValueString(ErrorDocument errorValue) throws IOException {
+
+		String errDocumentString = errorValue.getMessage() + "\n";
+
+		String exceptionMessage = errorValue.getMessage();
+		if (exceptionMessage != null && !exceptionMessage.equals("")) {
+			DefaultMutableTreeNode exceptionMessageNode = new DefaultMutableTreeNode(
+					exceptionMessage);
+			errDocumentString += exceptionMessageNode + "\n";
+			errDocumentString += errorValue.getTrace();
+		}
+
+		List<Path> errorReferences = errorValue.getCausedBy();
+		if (!errorReferences.isEmpty()) {
+			errDocumentString += "Set of cause errors to follow." + "\n";
+		}
+		int errorCounter = 1;
+		for (Path cause : errorReferences) {
+			if (DataBundles.isError(cause)) {
+			errDocumentString += "ErrorValue " + (errorCounter++) + "\n";
+			errDocumentString += buildErrorValueString(DataBundles.getError(cause)) + "\n";
+			}
+		}
+
+		return errDocumentString;
+	}
+
+}
diff --git a/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/InputsHandler.java b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/InputsHandler.java
new file mode 100644
index 0000000..bcaa7fb
--- /dev/null
+++ b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/InputsHandler.java
@@ -0,0 +1,280 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.data;
+
+import java.io.File;
+import java.io.IOException;
+import java.net.MalformedURLException;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import net.sf.taverna.t2.commandline.exceptions.InputMismatchException;
+import net.sf.taverna.t2.commandline.exceptions.InvalidOptionException;
+import net.sf.taverna.t2.commandline.exceptions.ReadInputException;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+import net.sf.taverna.t2.invocation.InvocationContext;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.log4j.Logger;
+import org.jdom.JDOMException;
+import org.purl.wf4ever.robundle.Bundle;
+
+import uk.org.taverna.databundle.DataBundles;
+import uk.org.taverna.scufl2.api.port.InputWorkflowPort;
+
+/**
+ * Handles the reading, or processing, or input values according to arguments provided to the
+ * commandline.
+ * The may be either as direct values, from a file, or from a Baclava document.
+ * Also handles registering the input values with the Data Service, ready to initiate
+ * the workflow run.
+ *
+ * @author Stuart Owen
+ */
+public class InputsHandler {
+
+	private static Logger logger = Logger.getLogger(InputsHandler.class);
+
+	public void checkProvidedInputs(Map<String, InputWorkflowPort> portMap,
+			CommandLineOptions options) throws InputMismatchException {
+		// we dont check for the document
+                Set<String> providedInputNames = new HashSet<String>();
+                for (int i = 0; i < options.getInputFiles().length; i += 2) {
+                        // If it already contains a value for the input port, e.g
+                        // two inputs are provided for the same port
+                        if (providedInputNames.contains(options.getInputFiles()[i])) {
+                                throw new InputMismatchException(
+                                        "Two input values were provided for the same input port "
+                                        + options.getInputFiles()[i] + ".", null, null);
+                        }
+                        providedInputNames.add(options.getInputFiles()[i]);
+                }
+
+                for (int i = 0; i < options.getInputValues().length; i += 2) {
+                        // If it already contains a value for the input port, e.g
+                        // two inputs are provided for the same port
+                        if (providedInputNames.contains(options.getInputValues()[i])) {
+                                throw new InputMismatchException(
+                                        "Two input values were provided for the same input port "
+                                        + options.getInputValues()[i] + ".", null, null);
+                        }
+                        providedInputNames.add(options.getInputValues()[i]);
+                }
+
+                if (portMap.size() * 2 != (options.getInputFiles().length + options.getInputValues().length)) {
+                        throw new InputMismatchException(
+                                    "The number of inputs provided does not match the number of input ports.",
+						portMap.keySet(), providedInputNames);
+                }
+
+                for (String portName : portMap.keySet()) {
+                        if (!providedInputNames.contains(portName)) {
+                                throw new InputMismatchException(
+                                        "The provided inputs does not contain an input for the port '"
+                                        + portName + "'", portMap.keySet(), providedInputNames);
+			}
+		}
+	}
+
+	public Bundle registerInputs(Map<String, InputWorkflowPort> portMap,
+			CommandLineOptions options, InvocationContext context) throws InvalidOptionException,
+			ReadInputException, IOException {
+		Bundle inputDataBundle;
+		inputDataBundle = DataBundles.createBundle();
+		inputDataBundle.setDeleteOnClose(false);
+		System.out.println("Bundle: " + inputDataBundle.getSource());
+		
+		Path inputs = DataBundles.getInputs(inputDataBundle);
+
+		URL url;
+		try {
+			url = new URL("file:");
+		} catch (MalformedURLException e1) {
+			// Should never happen, but just in case:
+			throw new ReadInputException(
+					"The was an internal error setting up the URL to open the inputs. You should contact Taverna support.",
+					e1);
+		}
+
+		if (options.hasInputFiles()) {
+			regesterInputsFromFiles(portMap, options, inputs, url);
+		}
+
+		if (options.hasInputValues()) {
+			registerInputsFromValues(portMap, options, inputs);
+
+		}
+
+		return inputDataBundle;
+	}
+
+	private void registerInputsFromValues(Map<String, InputWorkflowPort> portMap,
+			CommandLineOptions options, Path inputs) throws InvalidOptionException {
+		String[] inputParams = options.getInputValues();
+		for (int i = 0; i < inputParams.length; i = i + 2) {
+			String inputName = inputParams[i];
+			try {
+				String inputValue = inputParams[i + 1];
+				InputWorkflowPort port = portMap.get(inputName);
+
+				if (port == null) {
+					throw new InvalidOptionException("Cannot find an input port named '"
+							+ inputName + "'");
+				}
+
+				Path portPath = DataBundles.getPort(inputs, inputName);
+				if (options.hasDelimiterFor(inputName)) {
+					String delimiter = options.inputDelimiter(inputName);
+					Object value = checkForDepthMismatch(1, port.getDepth(), inputName,
+							inputValue.split(delimiter));
+					setValue(portPath, value);
+				} else {
+					Object value = checkForDepthMismatch(0, port.getDepth(), inputName, inputValue);
+					setValue(portPath, value);
+				}
+
+			} catch (IndexOutOfBoundsException e) {
+				throw new InvalidOptionException("Missing input value for input " + inputName);
+			} catch (IOException e) {
+				throw new InvalidOptionException("Error creating value for input " + inputName);
+			}
+		}
+	}
+
+	private void regesterInputsFromFiles(Map<String, InputWorkflowPort> portMap,
+			CommandLineOptions options, Path inputs, URL url) throws InvalidOptionException {
+		String[] inputParams = options.getInputFiles();
+		for (int i = 0; i < inputParams.length; i = i + 2) {
+			String inputName = inputParams[i];
+			try {
+				URL inputURL = new URL(url, inputParams[i + 1]);
+				InputWorkflowPort port = portMap.get(inputName);
+
+				if (port == null) {
+					throw new InvalidOptionException("Cannot find an input port named '"
+							+ inputName + "'");
+				}
+
+				Path portPath = DataBundles.getPort(inputs, inputName);
+				if (options.hasDelimiterFor(inputName)) {
+					String delimiter = options.inputDelimiter(inputName);
+					Object value = IOUtils.toString(inputURL.openStream()).split(delimiter);
+					value = checkForDepthMismatch(1, port.getDepth(), inputName, value);
+					setValue(portPath, value);
+				} else {
+					Object value = IOUtils.toByteArray(inputURL.openStream());
+					value = checkForDepthMismatch(0, port.getDepth(), inputName, value);
+					setValue(portPath, value);
+				}
+			} catch (IndexOutOfBoundsException e) {
+				throw new InvalidOptionException("Missing input filename for input " + inputName);
+			} catch (IOException e) {
+				throw new InvalidOptionException("Could not read input " + inputName + ": "
+						+ e.getMessage());
+			}
+		}
+	}
+
+	private void setValue(Path port, Object userInput) throws IOException {
+		if (userInput instanceof File) {
+			DataBundles.setReference(port, ((File) userInput).toURI());
+		} else if (userInput instanceof URL) {
+			try {
+				DataBundles.setReference(port, ((URL) userInput).toURI());
+			} catch (URISyntaxException e) {
+				logger.warn(String.format("Error converting %1$s to URI", userInput), e);
+			}
+		} else if (userInput instanceof String) {
+			DataBundles.setStringValue(port, (String) userInput);
+		} else if (userInput instanceof byte[]) {
+			Files.write(port, (byte[]) userInput, StandardOpenOption.TRUNCATE_EXISTING, StandardOpenOption.CREATE);
+		} else if (userInput instanceof List<?>) {
+			DataBundles.createList(port);
+			List<?> list = (List<?>) userInput;
+			for (Object object : list) {
+				setValue(DataBundles.newListItem(port), object);
+			}
+		} else {
+			logger.warn("Unknown input type : " + userInput.getClass().getName());
+		}
+	}
+
+	private Object checkForDepthMismatch(int inputDepth, int portDepth, String inputName,
+			Object inputValue) throws InvalidOptionException {
+		if (inputDepth != portDepth) {
+			if (inputDepth < portDepth) {
+				logger.warn("Wrapping input for '" + inputName + "' from a depth of " + inputDepth
+						+ " to the required depth of " + portDepth);
+				while (inputDepth < portDepth) {
+					List<Object> l = new ArrayList<Object>();
+					l.add(inputValue);
+					inputValue = l;
+					inputDepth++;
+				}
+			} else {
+				String msg = "There is a mismatch between depth of the list for the input port '"
+						+ inputName + "' and the data presented. The input port requires a "
+						+ depthToString(portDepth) + " and the data presented is a "
+						+ depthToString(inputDepth);
+				throw new InvalidOptionException(msg);
+			}
+		}
+
+		return inputValue;
+	}
+
+	private String depthToString(int depth) {
+		switch (depth) {
+		case 0:
+			return "single item";
+		case 1:
+			return "list";
+		case 2:
+			return "list of lists";
+		default:
+			return "list of depth " + depth;
+		}
+	}
+
+	private int getObjectDepth(Object o) {
+		int result = 0;
+		if (o instanceof Iterable) {
+			result++;
+			Iterator i = ((Iterable) o).iterator();
+
+			if (i.hasNext()) {
+				Object child = i.next();
+				result = result + getObjectDepth(child);
+			}
+		}
+		return result;
+	}
+}
diff --git a/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/SaveResultsHandler.java b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/SaveResultsHandler.java
new file mode 100644
index 0000000..1df05c2
--- /dev/null
+++ b/taverna-commandline-common/src/main/java/net/sf/taverna/t2/commandline/data/SaveResultsHandler.java
@@ -0,0 +1,87 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package net.sf.taverna.t2.commandline.data;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.Map;
+
+import uk.org.taverna.databundle.DataBundles;
+
+/**
+ * Handles all recording of results as they are received by the {@link CommandLineResultListener} or
+ * when the workflow enactment has completed.
+ * This includes saving as a Baclava Document, or storing individual results.
+ *
+ * @author Stuart Owen
+ * @see BaclavaHandler
+ * @see CommandLineResultListener
+ */
+public class SaveResultsHandler {
+
+	private final File outputDirectory;
+
+	public SaveResultsHandler(File rootOutputDir) {
+		this.outputDirectory = rootOutputDir;
+	}
+
+	/**
+	 * Given the Data on an output port, saves the data on a disk in the
+	 * output directory.
+	 *
+	 * @param portName
+	 * @param data
+	 * @throws IOException
+	 */
+	public void saveResultsForPort(String portName, Path data) throws IOException {
+		if (DataBundles.isList(data)) {
+			Path outputPath = outputDirectory.toPath().resolve(portName);
+			Files.createDirectories(outputPath);
+			saveList(DataBundles.getList(data), outputPath);
+		} else if (DataBundles.isError(data)) {
+			Files.copy(data, outputDirectory.toPath().resolve(portName + ".error"));
+		} else {
+			Files.copy(data, outputDirectory.toPath().resolve(portName));
+		}
+	}
+
+	private void saveList(List<Path> list, Path destination) throws IOException {
+		int index = 1;
+		for (Path data : list) {
+			if (data != null) {
+				if (DataBundles.isList(data)) {
+					Path outputPath = destination.resolve(String.valueOf(index));
+					Files.createDirectories(outputPath);
+					saveList(DataBundles.getList(data), outputPath);
+				} else if (DataBundles.isError(data)) {
+					Files.copy(data, destination.resolve(String.valueOf(index) + ".error"));
+				} else {
+					Files.copy(data, destination.resolve(String.valueOf(index)));
+				}
+			}
+			index++;
+		}
+	}
+
+}
diff --git a/taverna-commandline-common/src/main/resources/META-INF/spring/taverna-commandline-common-context-osgi.xml b/taverna-commandline-common/src/main/resources/META-INF/spring/taverna-commandline-common-context-osgi.xml
new file mode 100644
index 0000000..e7ae701
--- /dev/null
+++ b/taverna-commandline-common/src/main/resources/META-INF/spring/taverna-commandline-common-context-osgi.xml
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans:beans xmlns="http://www.springframework.org/schema/osgi" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns:beans="http://www.springframework.org/schema/beans"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+                                 http://www.springframework.org/schema/beans/spring-beans.xsd
+                                 http://www.springframework.org/schema/osgi
+                                 http://www.springframework.org/schema/osgi/spring-osgi.xsd">
+
+
+    <service ref="commandLineMasterPasswordProvider" interface="net.sf.taverna.t2.security.credentialmanager.MasterPasswordProvider" />
+
+ 	<reference id="commandLineOptions" interface="net.sf.taverna.t2.commandline.options.CommandLineOptions"/>
+    <reference id="runService" interface="uk.org.taverna.platform.run.api.RunService"/>
+	<reference id="credentialManager" interface="net.sf.taverna.t2.security.credentialmanager.CredentialManager" />
+	<reference id="databaseConfiguration" interface="uk.org.taverna.configuration.database.DatabaseConfiguration" />
+	<reference id="databaseManager" interface="uk.org.taverna.configuration.database.DatabaseManager" />
+
+	<reference id="workflowBundleIO" interface="uk.org.taverna.scufl2.api.io.WorkflowBundleIO" />
+	<reference id="t2flowWorkflowBundleReader" interface="uk.org.taverna.scufl2.api.io.WorkflowBundleReader" filter="(mediaType=application/vnd.taverna.t2flow+xml)"/>
+	<reference id="rdfXMLWorkflowBundleReader" interface="uk.org.taverna.scufl2.api.io.WorkflowBundleReader" filter="(org.springframework.osgi.bean.name=rdfXMLReader)"/>
+
+</beans:beans>
diff --git a/taverna-commandline-common/src/main/resources/META-INF/spring/taverna-commandline-common-context.xml b/taverna-commandline-common/src/main/resources/META-INF/spring/taverna-commandline-common-context.xml
new file mode 100644
index 0000000..52c0f29
--- /dev/null
+++ b/taverna-commandline-common/src/main/resources/META-INF/spring/taverna-commandline-common-context.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://www.springframework.org/schema/beans
+                           http://www.springframework.org/schema/beans/spring-beans.xsd">
+
+	<bean id="commandLineTool" class="net.sf.taverna.t2.commandline.CommandLineTool" init-method="run">
+		<property name="commandLineOptions" ref="commandLineOptions" />
+		<property name="runService" ref="runService" />
+		<property name="credentialManager" ref="credentialManager" />
+		<property name="workflowBundleIO" ref="workflowBundleIO" />
+		<property name="databaseConfiguration" ref="databaseConfiguration" />
+		<property name="databaseManager" ref="databaseManager" />
+	</bean>
+
+	<bean id="commandLineMasterPasswordProvider"
+		class="net.sf.taverna.t2.commandline.CommandLineMasterPasswordProvider">
+		<constructor-arg name="commandLineOptions"
+			ref="commandLineOptions" />
+	</bean>
+</beans>
diff --git a/taverna-commandline-common/src/main/resources/database-defaults.properties b/taverna-commandline-common/src/main/resources/database-defaults.properties
new file mode 100644
index 0000000..1080856
--- /dev/null
+++ b/taverna-commandline-common/src/main/resources/database-defaults.properties
@@ -0,0 +1,11 @@
+in_memory = true
+provenance = false
+connector = derby
+port = 1527 
+dialect = org.hibernate.dialect.DerbyDialect
+start_derby = false
+pool_max_active = 50
+pool_min_idle = 50
+pool_max_idle = 10
+driver = org.apache.derby.jdbc.EmbeddedDriver
+jdbcuri = jdbc:derby:t2-database;create=true;upgrade=true
\ No newline at end of file
diff --git a/taverna-commandline-common/src/main/resources/help.txt b/taverna-commandline-common/src/main/resources/help.txt
new file mode 100644
index 0000000..fb082cc
--- /dev/null
+++ b/taverna-commandline-common/src/main/resources/help.txt
@@ -0,0 +1,87 @@
+By default, the workflow is executed using the -inmemory option, and the
+results are written out to a directory named after the workflow name.
+
+If this directory already exists then a new directory is created, and
+appended with _<n>, where n is incremented to the next available index.
+
+Results are written out to files named after the output port for that result.
+If a result is composed of lists, then a directory is created for the output
+port and individual list items are named after the list element index (with 1
+being the first index). The the output is the result of an error, the filename
+is appended with '.error'.
+
+You can provide your own output directory with the -outputdir option. There
+will be an error if the directory already exists.
+
+You can also record your results to a Baclava document using -outputdoc
+option. The document will be overwritten if it already exists.
+
+Inputs can be provided in three ways. Both -inputfile and -inputvalue options
+can be used together; -inputdoc option must be used on its own. -inputfile and
+-inputvalue options both take two additional arguments, the name of the port
+for the input, and either a file containing the input data, or the input value
+itself respectively.
+
+If one of more of your workflow inputs is a list, you can create a list
+input by using the -inputdelimiter option, which may be used with either
+-inputfile or -inputvalue. This option takes two parameters - an input name
+and the delimiter by which to split the input into a list.
+
+The delimiter may be a simple character, such as a comma or a new-line
+character, or a regular expression. The input string, or file, will then be
+converted into a list being split by the delimiter specified. Make sure to 
+put the delimiter character in quotes as it may be interpreted by the shell 
+as a special character, e.g. ;.
+
+If a list of greater depth (i.e. a list or lists or deeper) is required then
+you will need to use the -inputdoc option.  However, if you provide an input
+of lower depth to that required, then it will automatically be wrapped in one
+or more lists up to the required depth. Providing an input of greater depth
+than that required will result in an error.
+
+If a workflow has a high memory requirement, then it may be better to run it
+using a database to store data rather than storing it in memory, which is the
+default option. There are three options for using a database:
+
+-embedded option, runs with an embedded database. This is slightly faster than
+the -clientserver option (below), but has the limitation that only one
+executeworkflow script may be executed simultaneously.
+
+-clientserver option allows the workflow to be executed backed by the database
+running as a server. By default a database is not started for you, but may be
+started using -startdb option.
+
+-startdb option starts a database. It may be used without providing a workflow
+to allow a database to be started separately, allowing multiple simultaneous
+executeworkflow script runs.
+
+More advanced database configurations can be specified using -dbproperties
+option, allowing you to take full control over the database used. This takes a
+second argument, the filename of the properties file, for which the following
+example contains the default settings:
+
+in_memory = true
+provenance = false
+connector = derby
+port = 1527
+dialect = org.hibernate.dialect.DerbyDialect
+start_derby = false
+driver = org.apache.derby.jdbc.EmbeddedDriver
+jdbcuri = jdbc:derby:t2-database;create=true;upgrade=true
+
+Note that when using -dbproperties together with other options, the other
+options take precedence.
+
+-cmdir option lets you specify an absolute path to a directory where 
+Credential Manager's files (keystore and truststore - containing user's 
+credentials and trusted certificates for accessing secure services) are stored.
+If not specified and the workflow requires access to these files, Taverna will 
+try to find them in the default location in <TAVERNA_HOME>/security somewhere 
+inside user's home directory (depending on the platform).
+
+-cmpassword option can be used to tell Taverna to expect the password for the 
+Credential Manager on standard input. If the password is not piped in, Taverna 
+will prompt you for it in the terminal and block until it is entered. Do not 
+enter your password in the command line! If -cmpassword option is not specified 
+and -cmdir option is used, Taverna will try to find the password in a special 
+file password.txt in the directory specified with -cmdir option.
diff --git a/taverna-commandline-common/src/test/java/net/sf/taverna/t2/commandline/TestDatabaseConfigurationHandler.java b/taverna-commandline-common/src/test/java/net/sf/taverna/t2/commandline/TestDatabaseConfigurationHandler.java
new file mode 100644
index 0000000..4c00e3a
--- /dev/null
+++ b/taverna-commandline-common/src/test/java/net/sf/taverna/t2/commandline/TestDatabaseConfigurationHandler.java
@@ -0,0 +1,21 @@
+package net.sf.taverna.t2.commandline;
+
+import static org.junit.Assert.assertEquals;
+import net.sf.taverna.t2.commandline.data.DatabaseConfigurationHandler;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+//import net.sf.taverna.t2.workbench.reference.config.DataManagementConfiguration;
+
+import org.junit.Ignore;
+import org.junit.Test;
+
+public class TestDatabaseConfigurationHandler {
+
+//	@Test
+//	public void testDefaults() throws Exception {
+//		CommandLineOptions opts = new CommandLineOptions(new String[]{"myworkflow.t2flow"});
+//		DatabaseConfigurationHandler handler = new DatabaseConfigurationHandler(opts);
+//		handler.configureDatabase();
+//		assertEquals("org.apache.derby.jdbc.EmbeddedDriver", DataManagementConfiguration.getInstance().getDriverClassName());
+//		assertEquals(false, DataManagementConfiguration.getInstance().getStartInternalDerbyServer());
+//	}
+}
diff --git a/taverna-commandline-launcher/pom.xml b/taverna-commandline-launcher/pom.xml
new file mode 100644
index 0000000..42208e3
--- /dev/null
+++ b/taverna-commandline-launcher/pom.xml
@@ -0,0 +1,83 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.taverna.commandline</groupId>
+		<artifactId>taverna-commandline</artifactId>
+		<version>3.1.0.incubating-SNAPSHOT</version>
+	</parent>
+	<artifactId>taverna-commandline-launcher</artifactId>
+	<name>Apache Taverna Commandline Launcher</name>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jar-plugin</artifactId>
+				<version>2.4</version>
+				<configuration>
+					<archive>
+						<manifest>
+							<addClasspath>true</addClasspath>
+							<mainClass>uk.org.taverna.commandline.TavernaCommandLine</mainClass>
+							<classpathLayoutType>custom</classpathLayoutType>
+							<customClasspathLayout>../${artifact.groupId}/${artifact.artifactId}-${artifact.baseVersion}${dashClassifier?}.${artifact.extension}</customClasspathLayout>
+						</manifest>
+					</archive>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-commandline-api</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>osgi-launcher</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>taverna-app-configuration-impl</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+
+ 		<dependency>
+			<groupId>org.apache.commons</groupId>
+			<artifactId>com.springsource.org.apache.commons.cli</artifactId>
+			<version>${commons.cli.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+      <version>${commons.io.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>${log4j.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.eclipse</groupId>
+			<artifactId>org.eclipse.osgi</artifactId>
+			<version>${osgi.equinox.version}</version>
+		</dependency>
+    <!-- TODO: replace equinox with:
+    <dependency>
+      <groupId>org.apache.felix</groupId>
+      <artifactId>org.apache.felix.main</artifactId>
+      <version>4.4.1</version>
+    </dependency>
+    -->
+
+
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>${junit.version}</version>
+			<scope>test</scope>
+		</dependency>
+	</dependencies>
+</project>
diff --git a/taverna-commandline-launcher/src/main/java/uk/org/taverna/commandline/CommandLineOptionsImpl.java b/taverna-commandline-launcher/src/main/java/uk/org/taverna/commandline/CommandLineOptionsImpl.java
new file mode 100644
index 0000000..b702e03
--- /dev/null
+++ b/taverna-commandline-launcher/src/main/java/uk/org/taverna/commandline/CommandLineOptionsImpl.java
@@ -0,0 +1,445 @@
+/*******************************************************************************
+ * Copyright (C) 2007 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.commandline;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import net.sf.taverna.t2.commandline.exceptions.ArgumentsParsingException;
+import net.sf.taverna.t2.commandline.exceptions.InvalidOptionException;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+
+import org.apache.commons.cli.CommandLine;
+import org.apache.commons.cli.CommandLineParser;
+import org.apache.commons.cli.GnuParser;
+import org.apache.commons.cli.HelpFormatter;
+import org.apache.commons.cli.Option;
+import org.apache.commons.cli.OptionBuilder;
+import org.apache.commons.cli.Options;
+import org.apache.commons.cli.ParseException;
+import org.apache.commons.io.IOUtils;
+import org.apache.log4j.Logger;
+
+/**
+ * Handles the processing of command line arguments for enacting a workflow.
+ * This class encapsulates all command line options, and exposes them through higher-level
+ * accessors. Upon creation it checks the validity of the command line options and raises an
+ * {@link InvalidOptionException} if they are invalid.
+ *
+ * @author Stuart Owen
+ * @author David Withers
+ */
+public class CommandLineOptionsImpl implements CommandLineOptions {
+
+	private static final String OUTPUTDIR = "outputdir";
+	private static final String BUNDLE = "bundle";
+	private static final Logger logger = Logger.getLogger(CommandLineOptionsImpl.class);
+	private Options options;
+	private CommandLine commandLine;
+
+	public CommandLineOptionsImpl(String[] args) throws ArgumentsParsingException, InvalidOptionException {
+		this.options = intitialiseOptions();
+		this.commandLine = processArgs(args);
+		checkForInvalid();
+	}
+
+	@Override
+	public boolean askedForHelp() {
+		return hasOption("help") || (getArgs().length==0 && getOptions().length==0);
+	}
+
+	@Override
+	public boolean isProvenanceEnabled() {
+		return hasOption("provenance");
+	}
+
+	protected void checkForInvalid() throws InvalidOptionException {
+		if (askedForHelp()) return;
+		if (isProvenanceEnabled()
+				&& !(hasOption("embedded") || hasOption("clientserver") || hasOption("dbproperties")))
+			throw new InvalidOptionException(
+					"You should be running with a database to use provenance");
+		if (isProvenanceEnabled() && hasOption("inmemory"))
+			throw new InvalidOptionException(
+					"You should be running with a database to use provenance");
+		if ((hasOption("inputfile") || hasOption("inputvalue"))
+				&& hasOption("inputdoc"))
+			throw new InvalidOptionException(
+					"You can't provide both -input and -inputdoc arguments");
+
+		if (hasOption("inputdelimiter") && hasOption("inputdoc"))
+			throw new InvalidOptionException("You cannot combine the -inputdelimiter and -inputdoc arguments");
+
+		if (getArgs().length == 0
+				&& !(hasOption("help") || hasOption("startdb")))
+			throw new InvalidOptionException("You must specify a workflow");
+
+		if (hasOption("inmemory") && hasOption("embedded"))
+			throw new InvalidOptionException(
+					"The options -embedded, -clientserver and -inmemory cannot be used together");
+		if (hasOption("inmemory") && hasOption("clientserver"))
+			throw new InvalidOptionException(
+					"The options -embedded, -clientserver and -inmemory cannot be used together");
+		if (hasOption("embedded") && hasOption("clientserver"))
+			throw new InvalidOptionException(
+					"The options -embedded, -clientserver and -inmemory cannot be used together");
+	}
+
+	@Override
+	public void displayHelp() {
+		boolean full = false;
+		if (hasOption("help")) full=true;
+		displayHelp(full);
+	}
+
+	@Override
+	public void displayHelp(boolean showFullText) {
+
+		HelpFormatter formatter = new HelpFormatter();
+		try {
+			formatter
+					.printHelp("executeworkflow [options] [workflow]", options);
+			if (showFullText) {
+				InputStream helpStream = CommandLineOptionsImpl.class
+						.getClassLoader().getResourceAsStream("help.txt");
+				String helpText = IOUtils.toString(helpStream);
+				System.out.println(helpText);
+			}
+
+		} catch (IOException e) {
+			logger.error("Failed to load the help document", e);
+			System.out.println("Failed to load the help document");
+			//System.exit(-1);
+		}
+	}
+
+	@Override
+	public String[] getArgs() {
+		return commandLine.getArgs();
+	}
+
+	/**
+	 *
+	 * @return the port that the database should run on
+	 */
+	@Override
+	public String getDatabasePort() {
+		return getOptionValue("port");
+	}
+
+	/**
+	 *
+	 * @return a path to a properties file that contains database configuration
+	 *         settings
+	 */
+	@Override
+	public String getDatabaseProperties() {
+		return getOptionValue("dbproperties");
+	}
+
+	/**
+	 * Returns an array that alternates between a portname and path to a file
+	 * containing the input values. Therefore the array will always contain an
+	 * even number of elements
+	 *
+	 * @return an array of portname and path to files containing individual
+	 *         inputs.
+	 */
+	@Override
+	public String[] getInputFiles() {
+		if (hasInputFiles()) {
+			return getOptionValues("inputfile");
+		} else {
+			return new String[] {};
+		}
+	}
+
+	@Override
+	public String[] getInputValues() {
+		if (hasInputValues()) {
+			return getOptionValues("inputvalue");
+		} else {
+			return new String[] {};
+		}
+	}
+
+	@Override
+	public String getLogFile() {
+		return getOptionValue("logfile");
+	}
+
+	public Option [] getOptions() {
+		return commandLine.getOptions();
+	}
+
+	private String getOptionValue(String opt) {
+		return commandLine.getOptionValue(opt);
+	}
+
+	private String[] getOptionValues(String arg0) {
+		return commandLine.getOptionValues(arg0);
+	}
+
+	/**
+	 *
+	 * @return the directory to write the results to
+	 */
+	@Override
+	public String getOutputDirectory() {
+		return getOptionValue(OUTPUTDIR);
+	}
+
+	@Override
+	public boolean getStartDatabase() {
+		return hasOption("startdb");
+	}
+
+	/**
+	 * @return the directory with Credential Manager's files
+	 */
+	@Override
+	public String getCredentialManagerDir() {
+		return getOptionValue(CREDENTIAL_MANAGER_DIR_OPTION);
+	}
+
+	@Override
+	public boolean getStartDatabaseOnly() throws InvalidOptionException {
+		return (getStartDatabase() && (getWorkflow() == null));
+	}
+
+	@Override
+	public String getWorkflow() throws InvalidOptionException {
+		if (getArgs().length == 0) {
+			return null;
+		} else if (getArgs().length != 1) {
+			throw new InvalidOptionException(
+					"You should only specify one workflow file");
+		} else {
+			return getArgs()[0];
+		}
+	}
+
+	@Override
+	public boolean hasDelimiterFor(String inputName) {
+		boolean result = false;
+		if (hasOption("inputdelimiter")) {
+			String [] values = getOptionValues("inputdelimiter");
+			for (int i=0;i<values.length;i+=2) {
+				if (values[i].equals(inputName))
+				{
+					result=true;
+					break;
+				}
+			}
+		}
+		return result;
+	}
+
+	@Override
+	public boolean hasInputFiles() {
+		return hasOption("inputfile");
+	}
+
+	@Override
+	public boolean hasInputValues() {
+		return hasOption("inputvalue");
+	}
+
+	@Override
+	public boolean hasLogFile() {
+		return hasOption("logfile");
+	}
+
+	@Override
+	public boolean hasOption(String option) {
+		return commandLine.hasOption(option);
+	}
+
+	@Override
+	public String inputDelimiter(String inputName) {
+		String result = null;
+		if (hasOption("inputdelimiter")) {
+			String [] values = getOptionValues("inputdelimiter");
+			for (int i=0;i<values.length;i+=2) {
+				if (values[i].equals(inputName))
+				{
+					result=values[i+1];
+					break;
+				}
+			}
+		}
+		return result;
+	}
+
+	@SuppressWarnings("static-access")
+	private Options intitialiseOptions() {
+		Option helpOption = new Option("help", "Display comprehensive help information.");
+
+		Option outputOption = OptionBuilder
+				.withArgName("directory")
+				.hasArg()
+				.withDescription(
+						"Save outputs as files in directory, default "
+								+ "is to make a new directory workflowName_output.")
+				.create(OUTPUTDIR);
+
+		Option bundleOption = OptionBuilder.withArgName(BUNDLE).hasArg()
+				.withDescription("Save outputs to a new Workflow Run Bundle (zip).")
+				.create(BUNDLE);
+
+		Option logFileOption = OptionBuilder
+				.withArgName("filename")
+				.hasArg()
+				.withDescription(
+						"The logfile to which more verbose logging will be written to.")
+				.create("logfile");
+
+		Option inputdocOption = OptionBuilder.withArgName("document").hasArg()
+				.withDescription("Load inputs from a Baclava document.").create(
+						"inputdoc");
+
+		Option inputFileOption = OptionBuilder
+				.withArgName("inputname filename").hasArgs(2)
+				.withValueSeparator(' ').withDescription(
+						"Load the named input from file or URL.").create(
+						"inputfile");
+
+		Option inputValueOption = OptionBuilder.withArgName("inputname value")
+				.hasArgs(2).withValueSeparator(' ').withDescription(
+						"Directly use the value for the named input.").create(
+						"inputvalue");
+
+		Option inputDelimiterOption = OptionBuilder
+				.withArgName("inputname delimiter")
+				.hasArgs(2)
+				.withValueSeparator(' ')
+				.withDescription(
+						"Cause an inputvalue or inputfile to be split into a list according to the delimiter. The associated workflow input must be expected to receive a list.")
+				.create("inputdelimiter");
+
+		Option dbProperties = OptionBuilder.withArgName("filename").hasArg()
+				.withDescription(
+						"Load a properties file to configure the database.")
+				.create("dbproperties");
+
+		Option port = OptionBuilder
+				.withArgName("portnumber")
+				.hasArg()
+				.withDescription(
+						"The port that the database is running on. If set requested to start its own internal server, this is the start port that will be used.")
+				.create("port");
+
+		Option embedded = new Option("embedded",
+				"Connect to an embedded Derby database. This can prevent mulitple invocations.");
+		Option clientserver = new Option("clientserver",
+				"Connect as a client to a derby server instance.");
+		Option inMemOption = new Option(
+				"inmemory",
+				"Run the workflow with data stored in-memory rather than in a database (this is the default option). This can give performance inprovements, at the cost of overall memory usage.");
+		Option startDB = new Option("startdb",
+				"Automatically start an internal Derby database server.");
+		Option provenance = new Option("provenance",
+				"Generate provenance information and store it in the database.");
+
+
+		Option credentialManagerDirectory = OptionBuilder.withArgName("directory path").
+		hasArg().withDescription(
+				"Absolute path to a directory where Credential Manager's files (keystore and truststore) are located.")
+		.create(CREDENTIAL_MANAGER_DIR_OPTION);
+		Option credentialManagerPassword = new Option(CREDENTIAL_MANAGER_PASSWORD_OPTION, "Indicate that the master password for Credential Manager will be provided on standard input."); // optional password option, to be read from standard input
+
+		Options options = new Options();
+		options.addOption(helpOption);
+		options.addOption(inputFileOption);
+		options.addOption(inputValueOption);
+		options.addOption(inputDelimiterOption);
+		options.addOption(inputdocOption);
+		options.addOption(outputOption);
+		options.addOption(bundleOption);
+		options.addOption(inMemOption);
+		options.addOption(embedded);
+		options.addOption(clientserver);
+		options.addOption(dbProperties);
+		options.addOption(port);
+		options.addOption(startDB);
+		options.addOption(provenance);
+		options.addOption(logFileOption);
+		options.addOption(credentialManagerDirectory);
+		options.addOption(credentialManagerPassword);
+
+		return options;
+	}
+
+	@Override
+	public boolean isClientServer() {
+		return hasOption("clientserver");
+	}
+
+	@Override
+	public boolean isEmbedded() {
+		return hasOption("embedded");
+	}
+
+	@Override
+	public boolean isInMemory() {
+		return hasOption("inmemory");
+	}
+
+	private CommandLine processArgs(String[] args) throws ArgumentsParsingException {
+		CommandLineParser parser = new GnuParser();
+		CommandLine line = null;
+		try {
+			// parse the command line arguments
+			line = parser.parse(options, args);
+		} catch (ParseException exp) {
+			// oops, something went wrong
+//			System.err.println("Taverna command line arguments' parsing failed. Reason: " + exp.getMessage());
+//			System.exit(1);
+			throw new ArgumentsParsingException("Taverna command line arguments' parsing failed. Reason: " + exp.getMessage(), exp);
+		}
+		return line;
+	}
+
+	/**
+	 * Save the results to a directory if -outputdir has been explicitly defined,
+	 * or if -outputdoc has not been defined.
+	 *
+	 * @return boolean
+	 */
+	@Override
+	public boolean saveResultsToDirectory() {
+		return (options.hasOption(OUTPUTDIR) || !hasSaveResultsToBundle());
+	}
+
+	@Override
+	public String saveResultsToBundle() {
+		if (! hasSaveResultsToBundle()) { 
+			return null;
+		}
+		return getOptionValue(BUNDLE);
+	}
+
+	@Override
+	public boolean hasSaveResultsToBundle() {
+		return hasOption(BUNDLE);
+	}
+
+}
diff --git a/taverna-commandline-launcher/src/main/java/uk/org/taverna/commandline/TavernaCommandLine.java b/taverna-commandline-launcher/src/main/java/uk/org/taverna/commandline/TavernaCommandLine.java
new file mode 100644
index 0000000..426ab98
--- /dev/null
+++ b/taverna-commandline-launcher/src/main/java/uk/org/taverna/commandline/TavernaCommandLine.java
@@ -0,0 +1,143 @@
+/*******************************************************************************
+ * Copyright (C) 2012 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.commandline;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import net.sf.taverna.t2.commandline.exceptions.ArgumentsParsingException;
+import net.sf.taverna.t2.commandline.exceptions.InvalidOptionException;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+
+import uk.org.taverna.commons.profile.xml.jaxb.ApplicationProfile;
+import uk.org.taverna.commons.profile.xml.jaxb.BundleInfo;
+import uk.org.taverna.commons.profile.xml.jaxb.FrameworkConfiguration;
+import uk.org.taverna.configuration.app.ApplicationConfiguration;
+import uk.org.taverna.configuration.app.impl.ApplicationConfigurationImpl;
+import uk.org.taverna.configuration.app.impl.Log4JConfiguration;
+import uk.org.taverna.osgi.OsgiLauncher;
+
+/**
+ * Main entry point for starting the Taverna Command Line Tool.
+ *
+ * @author David Withers
+ */
+public class TavernaCommandLine {
+
+	private static final String COMMANDLINE_BUNDLE_NAME = "org.apache.taverna.commandline.taverna-commandline-common";
+
+	private static File commandlineBundle = null;
+
+	private static ApplicationConfiguration applicationConfiguration = new ApplicationConfigurationImpl();
+
+	private static Log4JConfiguration log4jConfiguration = new Log4JConfiguration();
+
+	/**
+	 * Starts the Taverna Command Line Tool.
+	 *
+	 * @param args
+	 *            Taverna Command Line arguments
+	 */
+	public static void main(final String[] args) {
+		try {
+			CommandLineOptions commandLineOptions = new CommandLineOptionsImpl(args);
+			if (commandLineOptions.askedForHelp()) {
+				commandLineOptions.displayHelp();
+			} else {
+				log4jConfiguration.setApplicationConfiguration(applicationConfiguration);
+				log4jConfiguration.prepareLog4J();
+				setDerbyPaths();
+				OsgiLauncher osgilauncher = new OsgiLauncher(getAppDirectory(), getBundleURIs());
+				setFrameworkConfiguration(osgilauncher);
+				osgilauncher.start();
+				BundleContext context = osgilauncher.getContext();
+				context.registerService("net.sf.taverna.t2.commandline.options.CommandLineOptions",
+						commandLineOptions, null);
+				osgilauncher.startServices(true);
+        if (commandlineBundle == null) {
+          System.err.println("Can't locate command line bundle " + COMMANDLINE_BUNDLE_NAME);
+          System.exit(1);
+        }
+				osgilauncher.startBundle(osgilauncher.installBundle(commandlineBundle.toURI()));
+			}
+		} catch (ArgumentsParsingException e) {
+			System.out.println(e.getMessage());
+		} catch (InvalidOptionException e) {
+			System.out.println(e.getMessage());
+		} catch (BundleException e) {
+			System.out.println(e.getMessage());
+		}
+	}
+
+	/**
+	 * Sets the OSGi Framework configuration.
+	 *
+	 * @param osgilauncher
+	 */
+	private static void setFrameworkConfiguration(OsgiLauncher osgilauncher) {
+		ApplicationProfile applicationProfile = applicationConfiguration.getApplicationProfile();
+		List<FrameworkConfiguration> frameworkConfigurations = applicationProfile
+				.getFrameworkConfiguration();
+		if (!frameworkConfigurations.isEmpty()) {
+			Map<String, String> configurationMap = new HashMap<String, String>();
+			for (FrameworkConfiguration frameworkConfiguration : frameworkConfigurations) {
+				configurationMap.put(frameworkConfiguration.getName(),
+						frameworkConfiguration.getValue());
+			}
+			osgilauncher.setFrameworkConfiguration(configurationMap);
+		}
+	}
+
+	private static List<URI> getBundleURIs() {
+		List<URI> bundleURIs = new ArrayList<URI>();
+		ApplicationProfile applicationProfile = applicationConfiguration.getApplicationProfile();
+		File libDir = new File(applicationConfiguration.getStartupDir(), "lib");
+		if (applicationProfile != null) {
+			for (BundleInfo bundle : applicationProfile.getBundle()) {
+				File bundleFile = new File(libDir, bundle.getFileName());
+				if (bundle.getSymbolicName().equals(COMMANDLINE_BUNDLE_NAME)) {
+					commandlineBundle = bundleFile;
+				} else {
+					bundleURIs.add(bundleFile.toURI());
+				}
+			}
+		}
+		return bundleURIs;
+	}
+
+	private static File getAppDirectory() {
+		return new File(applicationConfiguration.getApplicationHomeDir().getAbsolutePath());
+	}
+
+	private static void setDerbyPaths() {
+		System.setProperty("derby.system.home", getAppDirectory().getAbsolutePath());
+		File logFile = new File(applicationConfiguration.getLogDir(), "derby.log");
+		System.setProperty("derby.stream.error.file", logFile.getAbsolutePath());
+	}
+
+}
diff --git a/taverna-commandline-launcher/src/main/resources/help.txt b/taverna-commandline-launcher/src/main/resources/help.txt
new file mode 100644
index 0000000..fb082cc
--- /dev/null
+++ b/taverna-commandline-launcher/src/main/resources/help.txt
@@ -0,0 +1,87 @@
+By default, the workflow is executed using the -inmemory option, and the
+results are written out to a directory named after the workflow name.
+
+If this directory already exists then a new directory is created, and
+appended with _<n>, where n is incremented to the next available index.
+
+Results are written out to files named after the output port for that result.
+If a result is composed of lists, then a directory is created for the output
+port and individual list items are named after the list element index (with 1
+being the first index). The the output is the result of an error, the filename
+is appended with '.error'.
+
+You can provide your own output directory with the -outputdir option. There
+will be an error if the directory already exists.
+
+You can also record your results to a Baclava document using -outputdoc
+option. The document will be overwritten if it already exists.
+
+Inputs can be provided in three ways. Both -inputfile and -inputvalue options
+can be used together; -inputdoc option must be used on its own. -inputfile and
+-inputvalue options both take two additional arguments, the name of the port
+for the input, and either a file containing the input data, or the input value
+itself respectively.
+
+If one of more of your workflow inputs is a list, you can create a list
+input by using the -inputdelimiter option, which may be used with either
+-inputfile or -inputvalue. This option takes two parameters - an input name
+and the delimiter by which to split the input into a list.
+
+The delimiter may be a simple character, such as a comma or a new-line
+character, or a regular expression. The input string, or file, will then be
+converted into a list being split by the delimiter specified. Make sure to 
+put the delimiter character in quotes as it may be interpreted by the shell 
+as a special character, e.g. ;.
+
+If a list of greater depth (i.e. a list or lists or deeper) is required then
+you will need to use the -inputdoc option.  However, if you provide an input
+of lower depth to that required, then it will automatically be wrapped in one
+or more lists up to the required depth. Providing an input of greater depth
+than that required will result in an error.
+
+If a workflow has a high memory requirement, then it may be better to run it
+using a database to store data rather than storing it in memory, which is the
+default option. There are three options for using a database:
+
+-embedded option, runs with an embedded database. This is slightly faster than
+the -clientserver option (below), but has the limitation that only one
+executeworkflow script may be executed simultaneously.
+
+-clientserver option allows the workflow to be executed backed by the database
+running as a server. By default a database is not started for you, but may be
+started using -startdb option.
+
+-startdb option starts a database. It may be used without providing a workflow
+to allow a database to be started separately, allowing multiple simultaneous
+executeworkflow script runs.
+
+More advanced database configurations can be specified using -dbproperties
+option, allowing you to take full control over the database used. This takes a
+second argument, the filename of the properties file, for which the following
+example contains the default settings:
+
+in_memory = true
+provenance = false
+connector = derby
+port = 1527
+dialect = org.hibernate.dialect.DerbyDialect
+start_derby = false
+driver = org.apache.derby.jdbc.EmbeddedDriver
+jdbcuri = jdbc:derby:t2-database;create=true;upgrade=true
+
+Note that when using -dbproperties together with other options, the other
+options take precedence.
+
+-cmdir option lets you specify an absolute path to a directory where 
+Credential Manager's files (keystore and truststore - containing user's 
+credentials and trusted certificates for accessing secure services) are stored.
+If not specified and the workflow requires access to these files, Taverna will 
+try to find them in the default location in <TAVERNA_HOME>/security somewhere 
+inside user's home directory (depending on the platform).
+
+-cmpassword option can be used to tell Taverna to expect the password for the 
+Credential Manager on standard input. If the password is not piped in, Taverna 
+will prompt you for it in the terminal and block until it is entered. Do not 
+enter your password in the command line! If -cmpassword option is not specified 
+and -cmdir option is used, Taverna will try to find the password in a special 
+file password.txt in the directory specified with -cmdir option.
diff --git a/taverna-commandline-launcher/src/test/java/uk/org/taverna/commandline/TestCommandLineOptionsHandler.java b/taverna-commandline-launcher/src/test/java/uk/org/taverna/commandline/TestCommandLineOptionsHandler.java
new file mode 100644
index 0000000..3e1d0f4
--- /dev/null
+++ b/taverna-commandline-launcher/src/test/java/uk/org/taverna/commandline/TestCommandLineOptionsHandler.java
@@ -0,0 +1,267 @@
+package uk.org.taverna.commandline;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import net.sf.taverna.t2.commandline.exceptions.InvalidOptionException;
+import net.sf.taverna.t2.commandline.options.CommandLineOptions;
+
+import org.junit.Test;
+
+public class TestCommandLineOptionsHandler {
+
+	@Test
+	public void testWorkflowName() throws Exception {
+		CommandLineOptions handler = new CommandLineOptionsImpl(
+				new String[] { "myworkflow.t2flow" });
+		assertEquals("myworkflow.t2flow", handler.getWorkflow());
+	}
+
+	@Test
+	public void shouldShowHelp() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(
+				new String[] { "-help" });
+		assertTrue(options.askedForHelp());
+		options = new CommandLineOptionsImpl(
+				new String[] {});
+		assertTrue(options.askedForHelp());
+		options = new CommandLineOptionsImpl(new String[] { "myworkflow.t2flow" });
+		assertFalse(options.askedForHelp());
+	}
+
+	@Test
+	public void getWorkflow() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(
+				new String[] { "-help" });
+		assertNull(options.getWorkflow());
+		options = new CommandLineOptionsImpl(new String[] { "myworkflow.t2flow" });
+		assertEquals("myworkflow.t2flow", options.getWorkflow());
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void cannotProvideInputFileAndInputDoc() throws Exception {
+		new CommandLineOptionsImpl(new String[] { "-inputfile", "fred", "fred.txt",
+				"-inputdoc", "myworkflow.t2flow" });
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void cannotProvideInputValueAndInputDoc() throws Exception {
+		new CommandLineOptionsImpl(new String[] { "-inputvalue", "fred", "fred.txt",
+				"-inputdoc", "myworkflow.t2flow" });
+	}
+
+	@Test
+	public void canProvideInputValueAndFileTogether() throws Exception {
+		//should not be an error
+		new CommandLineOptionsImpl(new String[] { "-inputvalue", "fred", "abc",
+				"-inputfile","fred2","fred2.txt","myworkflow.t2flow" });
+	}
+
+	@Test
+	public void getInputs() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-inputfile", "fred", "fred.txt", "myworkflow.t2flow" });
+		assertEquals(2, options.getInputFiles().length);
+		assertEquals("fred", options.getInputFiles()[0]);
+		assertEquals("fred.txt", options.getInputFiles()[1]);
+
+		options = new CommandLineOptionsImpl(new String[] { "-inputfile", "fred",
+				"fred.txt", "-inputfile", "fred2", "fred2.txt",
+				"myworkflow.t2flow" });
+		assertEquals(4, options.getInputFiles().length);
+		assertEquals("fred", options.getInputFiles()[0]);
+		assertEquals("fred.txt", options.getInputFiles()[1]);
+		assertEquals("fred2", options.getInputFiles()[2]);
+		assertEquals("fred2.txt", options.getInputFiles()[3]);
+
+		options = new CommandLineOptionsImpl(new String[] { "myworkflow.t2flow" });
+		assertNotNull(options.getInputFiles());
+		assertEquals(0, options.getInputFiles().length);
+
+	}
+
+	@Test
+	public void hasInputValue() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-inputvalue", "fred", "abc", "myworkflow.t2flow" });
+		assertTrue(options.hasInputValues());
+
+		options = new CommandLineOptionsImpl(new String[] { "myworkflow.t2flow" });
+		assertFalse(options.hasInputValues());
+	}
+
+	@Test
+	public void getInputValues() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-inputvalue", "fred", "abc", "myworkflow.t2flow" });
+		assertEquals(2, options.getInputValues().length);
+
+		options = new CommandLineOptionsImpl(new String[] { "myworkflow.t2flow" });
+		assertNotNull(options.getInputValues());
+		assertEquals(0,options.getInputValues().length);
+	}
+
+	@Test
+	public void hasInputs() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-inputfile", "fred", "fred.txt", "myworkflow.t2flow" });
+		assertTrue(options.hasInputFiles());
+
+		options = new CommandLineOptionsImpl(new String[] { "myworkflow.t2flow" });
+		assertFalse(options.hasInputFiles());
+	}
+
+	@Test
+	public void noWorkflowNameButStartDB() throws Exception {
+		// should not throw an error
+		CommandLineOptions options = new CommandLineOptionsImpl(
+				new String[] { "-startdb" });
+		assertTrue(options.getStartDatabase());
+		assertTrue(options.getStartDatabaseOnly());
+	}
+
+	@Test
+	public void workflowNameAndStartDB() throws Exception {
+		// should not throw an error
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-startdb", "myworkflow.t2flow" });
+		assertTrue(options.getStartDatabase());
+		assertFalse(options.getStartDatabaseOnly());
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void provenanceButNoDatabase() throws Exception {
+		new CommandLineOptionsImpl(new String[] { "-provenance",
+				"myworkflow.t2flow" });
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void provenanceButNoDatabase2() throws Exception {
+		new CommandLineOptionsImpl(new String[] { "-provenance", "-inmemory",
+				"myworkflow.t2flow" });
+	}
+
+	@Test
+	public void provenanceDatabase() throws Exception {
+		// should be no errors
+		new CommandLineOptionsImpl(new String[] { "-provenance", "-embedded",
+				"myworkflow.t2flow" });
+		new CommandLineOptionsImpl(new String[] { "-provenance", "-clientserver",
+				"myworkflow.t2flow" });
+		new CommandLineOptionsImpl(new String[] { "-provenance", "-dbproperties",
+				"dbproperties.properties", "myworkflow.t2flow" });
+	}
+
+	@Test
+	public void testHasInputDelimiter() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-inputvalue","in1","1,2,3","-inputdelimiter","in1",",","-inputdelimiter","in2",",","myworkflow.t2flow" });
+		assertTrue(options.hasDelimiterFor("in1"));
+		assertTrue(options.hasDelimiterFor("in2"));
+		assertFalse(options.hasDelimiterFor("in3"));
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void testInputDelimiterInvalidWithInputDoc() throws Exception {
+		new CommandLineOptionsImpl(new String[] {
+				"-inputdoc","doc.xml","-inputdelimiter","in1",",","myworkflow.t2flow" });
+	}
+
+
+	@Test
+	public void testInputDelimiter() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-inputvalue","in1","1,2,3","-inputdelimiter","in1",",","-inputdelimiter","in2","!","myworkflow.t2flow" });
+		assertEquals(",",options.inputDelimiter("in1"));
+		assertEquals("!",options.inputDelimiter("in2"));
+		assertNull(options.inputDelimiter("in3"));
+	}
+
+	@Test
+	public void testInMemory() throws Exception {
+		CommandLineOptions handler = new CommandLineOptionsImpl(new String[] {
+				"-inmemory", "myworkflow.t2flow" });
+		assertTrue(handler.hasOption("inmemory"));
+	}
+
+	@Test
+	public void testEmbedded() throws Exception {
+		CommandLineOptions handler = new CommandLineOptionsImpl(new String[] {
+				"-embedded", "myworkflow.t2flow" });
+		assertTrue(handler.hasOption("embedded"));
+	}
+
+	@Test
+	public void testClientServer() throws Exception {
+		CommandLineOptions handler = new CommandLineOptionsImpl(new String[] {
+				"-clientserver", "myworkflow.t2flow" });
+		assertTrue(handler.hasOption("clientserver"));
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void testInvalidEmbeddedAndClientServer() throws Exception {
+		new CommandLineOptionsImpl(new String[] { "-clientserver", "-embedded",
+				"myworkflow.t2flow" });
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void testInvalidEmbeddedAndMemory() throws Exception {
+		new CommandLineOptionsImpl(new String[] { "-embedded", "-inmemory",
+				"myworkflow.t2flow" });
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	public void testInvalidClientServerAndInMemory() throws Exception {
+		new CommandLineOptionsImpl(new String[] { "-clientserver", "-inmemory",
+				"myworkflow.t2flow" });
+	}
+
+	@Test
+	public void isInMemory() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-inmemory", "myworkflow.t2flow" });
+
+		assertTrue(options.isInMemory());
+		assertFalse(options.isClientServer());
+		assertFalse(options.isEmbedded());
+	}
+
+	@Test
+	public void isClientServer() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-clientserver", "myworkflow.t2flow" });
+
+		assertTrue(options.isClientServer());
+		assertFalse(options.isInMemory());
+		assertFalse(options.isEmbedded());
+	}
+
+	@Test
+	public void hasLogFile() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-logfile","/tmp/logging", "myworkflow.t2flow" });
+
+		assertTrue(options.hasLogFile());
+		assertEquals("/tmp/logging", options.getLogFile());
+	}
+
+	@Test(expected = InvalidOptionException.class)
+	@SuppressWarnings("unused")
+	public void hasLogFileNotValidWithoutWorkflow() throws Exception{
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-logfile","/tmp/logging"});
+	}
+
+	@Test
+	public void isEmbedded() throws Exception {
+		CommandLineOptions options = new CommandLineOptionsImpl(new String[] {
+				"-embedded", "myworkflow.t2flow" });
+
+		assertTrue(options.isEmbedded());
+		assertFalse(options.isInMemory());
+		assertFalse(options.isClientServer());
+	}
+
+}
diff --git a/taverna-commandline-product/pom.xml b/taverna-commandline-product/pom.xml
new file mode 100644
index 0000000..38bcb42
--- /dev/null
+++ b/taverna-commandline-product/pom.xml
@@ -0,0 +1,529 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.taverna.commandline</groupId>
+		<artifactId>taverna-commandline</artifactId>
+		<version>3.1.0.incubating-SNAPSHOT</version>
+	</parent>
+	<artifactId>taverna-command-line-product</artifactId>
+	<name>Apache Taverna Commandline Product</name>
+	<packaging>taverna-application</packaging>
+	<profiles>
+		<profile>
+			<id>developer</id>
+			<activation>
+				<activeByDefault>true</activeByDefault>
+			</activation>
+			<properties>
+				<assembly.descriptor>src/main/assembly/developer-assembly.xml</assembly.descriptor>
+        <!-- See http://updates.taverna.org.uk/ -->
+				<profile.updateSite>https://taverna.incubator.apache.org/updates/commandline/</profile.updateSite>
+				<profile.pluginSite>https://taverna.incubator.apache.org/plugins/commandline/</profile.pluginSite>
+			</properties>
+		</profile>
+		<profile>
+			<id>nightly</id>
+			<properties>
+				<assembly.descriptor>src/main/assembly/nightly-assembly.xml</assembly.descriptor>
+				<profile.updateSite>https://taverna.incubator.apache.org/updates/commandline/</profile.updateSite>
+				<profile.pluginSite>https://taverna.incubator.apache.org/plugins/commandline/</profile.pluginSite>
+			</properties>
+		</profile>
+		<profile>
+			<id>release</id>
+			<properties>
+				<assembly.descriptor>src/main/assembly/release-assembly.xml</assembly.descriptor>
+				<profile.updateSite>https://taverna.incubator.apache.org/updates/commandline/</profile.updateSite>
+				<profile.pluginSite>https://taverna.incubator.apache.org/plugins/commandline/</profile.pluginSite>
+			</properties>
+		</profile>
+	</profiles>
+	<build>
+		<finalName>apache-taverna-commandline-${project.version}</finalName>
+		<plugins>
+			<plugin>
+				<artifactId>maven-assembly-plugin</artifactId>
+				<version>2.4</version>
+				<executions>
+					<execution>
+						<phase>package</phase>
+						<goals>
+							<goal>single</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<descriptors>
+						<descriptor>${assembly.descriptor}</descriptor>
+					</descriptors>
+					<archiverConfig>
+						<directoryMode>493</directoryMode> <!-- 493(dec) = 755(oct) -->
+						<defaultDirectoryMode>493</defaultDirectoryMode>
+					</archiverConfig>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>buildnumber-maven-plugin</artifactId>
+				<version>1.0-beta-3</version>
+				<executions>
+					<execution>
+						<id>buildnumber-validate</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>create</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<format>{0,date,yyyyMMdd}T{0,date,HHmm}</format>
+					<items>
+						<item>timestamp</item>
+					</items>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.taverna.osgi</groupId>
+				<artifactId>taverna-maven-plugin</artifactId>
+				<version>${taverna.osgi.version}</version>
+				<extensions>true</extensions>
+				<configuration>
+					<buildNumber>${buildNumber}</buildNumber>
+					<updateSite>${profile.updateSite}</updateSite>
+					<pluginSite>${profile.pluginSite}</pluginSite>
+					<frameworkConfigurations>
+						<frameworkConfiguration>
+							<name>org.osgi.framework.bootdelegation</name>
+							<value>sun.*,com.sun.*,java.*,javax.*,org.xml.*,org.w3c.*,apple.*,com.apple.*,org.omg.*,org.ietf.jgss.*,org.jcp.xml.dsig.internal.*</value>
+						</frameworkConfiguration>
+						<frameworkConfiguration>
+							<name>org.osgi.framework.system.packages.extra</name>
+              <value>com.sun.org.apache.xml.internal.utils,com.sun.source.util,com.sun.source.tree,org.apache.log4j;version=${log4j.version},net.sf.taverna.t2.commandline.options;version=${project.parent.version}</value>
+						</frameworkConfiguration>
+						<frameworkConfiguration>
+							<name>org.osgi.framework.storage.clean</name>
+							<value>onFirstInit</value>
+						</frameworkConfiguration>
+					</frameworkConfigurations>
+				</configuration>
+			</plugin>
+		</plugins>
+		<pluginManagement>
+			<plugins>
+				<!--This plugin's configuration is used to store Eclipse m2e settings
+					only. It has no influence on the Maven build itself. -->
+				<plugin>
+					<groupId>org.eclipse.m2e</groupId>
+					<artifactId>lifecycle-mapping</artifactId>
+					<version>1.0.0</version>
+					<configuration>
+						<lifecycleMappingMetadata>
+							<pluginExecutions>
+								<pluginExecution>
+									<pluginExecutionFilter>
+										<groupId>org.apache.taverna.osgi</groupId>
+										<artifactId>taverna-maven-plugin</artifactId>
+										<versionRange>[0.3.1-SNAPSHOT,)</versionRange>
+										<goals>
+											<goal>profile-generate</goal>
+										</goals>
+									</pluginExecutionFilter>
+									<action>
+										<execute>
+											<runOnIncremental>false</runOnIncremental>
+										</execute>
+									</action>
+								</pluginExecution>
+							</pluginExecutions>
+						</lifecycleMappingMetadata>
+					</configuration>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+	</build>
+
+	<dependencies>
+
+		<!-- Explicit org.osgi.* with <scope>provided as these are also provided
+			by the felix osgi package. Avoids: Caused by: java.lang.SecurityException:
+			class "org.osgi.framework.hooks.bundle.CollisionHook"'s signer information
+			does not match signer information of other classes in the same package -->
+
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.core</artifactId>
+			<version>${osgi.core.version}</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.osgi</groupId>
+			<artifactId>org.osgi.compendium</artifactId>
+			<version>${osgi.core.version}</version>
+			<scope>provided</scope>
+		</dependency>
+
+                <!-- Invalid manifest header Import-Package: "com.sun.jdmk.comm;resolution:="optional"" : Cannot import a package more than once "com.sun.jdmk.comm"-->
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>${log4j.version}</version>
+			<scope>provided</scope>
+		</dependency>
+
+		<!-- Spring DM -->
+		<dependency>
+			<groupId>net.sourceforge.cglib</groupId>
+			<artifactId>com.springsource.net.sf.cglib</artifactId>
+			<version>${cglib.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.osgi</groupId>
+			<artifactId>spring-osgi-annotation</artifactId>
+			<version>${spring.dm.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.springframework.osgi</groupId>
+			<artifactId>spring-osgi-extender</artifactId>
+			<version>${spring.dm.version}</version>
+		</dependency>
+		<!-- Spring -->
+		<dependency>
+			<groupId>org.springframework</groupId>
+			<artifactId>org.springframework.context</artifactId>
+			<version>${spring.version}</version>
+		</dependency>
+
+		<!-- Java Extension Implementations -->
+		<!-- Appears unrequired dependency>
+			<groupId>javax.xml.bind</groupId>
+			<artifactId>com.springsource.javax.xml.bind</artifactId>
+			<version>2.2.0</version>
+		</dependency-->
+		<dependency>
+			<groupId>javax.activation</groupId>
+			<artifactId>com.springsource.javax.activation</artifactId>
+			<version>${activation.version}</version>
+		</dependency>
+                <!-- The bundle "com.springsource.bsh_2.0.0.b4 " could not be resolved. Reason: Missing Constraint: Import-Package: javax.servlet; version="[2.5.0,3.0.0)" -->
+		<dependency>
+ 			<groupId>javax.servlet</groupId>
+			<artifactId>com.springsource.javax.servlet</artifactId>
+			<version>2.5.0</version>
+		</dependency>
+                <!-- The bundle "com.springsource.org.apache.axis_1.4.0 " could not be resolved. Reason: Missing Constraint: Import-Package: javax.jms; version="[1.1.0,2.0.0)" -->
+		<dependency>
+			<groupId>javax.jms</groupId>
+			<artifactId>com.springsource.javax.jms</artifactId>
+			<version>1.1.0</version>
+		</dependency>
+                <!-- The bundle "com.springsource.javax.xml.rpc_1.1.0 " could not be resolved. Reason: Missing Constraint: Import-Package: javax.xml.soap; version="[1.3.0,2.0.0)" -->
+		<dependency>
+			<groupId>javax.xml.soap</groupId>
+			<artifactId>com.springsource.javax.xml.soap</artifactId>
+			<version>1.3.0</version>
+		</dependency>
+                <!-- The bundle "com.springsource.com.thoughtworks.xstream_1.4.1" could not be resolved. Reason: Missing Constraint: Import-Package: javax.xml.stream; version="[1.0.1,2.0.0)" -->
+		<dependency>
+			<groupId>javax.xml.stream</groupId>
+			<artifactId>com.springsource.javax.xml.stream</artifactId>
+			<version>1.0.1</version>
+		</dependency>
+		<dependency>
+			<groupId>javax.mail</groupId>
+			<artifactId>com.springsource.javax.mail</artifactId>
+			<version>${mail.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>commons-codec</groupId>
+			<artifactId>commons-codec</artifactId>
+			<version>${commons.codec.version}</version>
+		</dependency>
+  <dependency>
+    <groupId>commons-configuration</groupId>
+    <artifactId>commons-configuration</artifactId>
+    <version>1.10</version>
+  </dependency>
+  <dependency>
+      <groupId>com.sun.xml.bind</groupId>
+      <artifactId>jaxb-impl</artifactId>
+      <version>2.2.11</version>
+  </dependency>
+
+
+		<!-- OSGi Enterprise Services -->
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>xml-parser-service</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>xml-transformer-service</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+                <!-- The bundle "uk.org.taverna.commons.taverna-plugin-impl_0.1.0.SNAPSHOT" could not be resolved. Reason: Missing Constraint: Import-Package: org.osgi.service.event; version="[1.3.0,2.0.0)" -->
+		<dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.eventadmin</artifactId>
+			<version>1.3.2</version>
+		</dependency>
+		<!-- Appears unrequired dependency>
+			<groupId>org.apache.felix</groupId>
+			<artifactId>org.apache.felix.configadmin</artifactId>
+			<version>1.6.0</version>
+		</dependency-->
+
+		<!-- Taverna Activities -->
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-dataflow-activity</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-stringconstant-activity</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+
+    <!-- Taverna Common Activities -->
+    <dependency>
+			<groupId>org.apache.taverna.commonactivities</groupId>
+      <artifactId>taverna-beanshell-activity</artifactId>
+			<version>${taverna.commonactivities.version}</version>
+    </dependency>
+    <dependency>
+			<groupId>org.apache.taverna.commonactivities</groupId>
+      <artifactId>taverna-external-tool-activity</artifactId>
+			<version>${taverna.commonactivities.version}</version>
+    </dependency>
+    <!-- VERY broken :(
+    <dependency>
+			<groupId>org.apache.taverna.commonactivities</groupId>
+      <artifactId>taverna-interaction-activity</artifactId>
+			<version>${taverna.commonactivities.version}</version>
+    </dependency>
+    -->
+    <dependency>
+			<groupId>org.apache.taverna.commonactivities</groupId>
+      <artifactId>taverna-rest-activity</artifactId>
+			<version>${taverna.commonactivities.version}</version>
+    </dependency>
+    <dependency>
+			<groupId>org.apache.taverna.commonactivities</groupId>
+      <artifactId>taverna-spreadsheet-import-activity</artifactId>
+			<version>${taverna.commonactivities.version}</version>
+    </dependency>
+    <dependency>
+			<groupId>org.apache.taverna.commonactivities</groupId>
+      <artifactId>taverna-wsdl-activity</artifactId>
+			<version>${taverna.commonactivities.version}</version>
+    </dependency>
+    <dependency>
+			<groupId>org.apache.taverna.commonactivities</groupId>
+      <artifactId>taverna-xpath-activity</artifactId>
+			<version>${taverna.commonactivities.version}</version>
+    </dependency>
+
+
+		<!-- Taverna Commandline -->
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-commandline-common</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>${project.parent.groupId}</groupId>
+			<artifactId>taverna-commandline-launcher</artifactId>
+			<version>${project.parent.version}</version>
+		</dependency>
+
+		<!-- Taverna Platform -->
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-capability-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-run-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-execution-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-execution-local</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-database-configuration-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-services-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+
+		<!-- Taverna OSGi -->
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>taverna-configuration-impl</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>taverna-app-configuration-impl</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>taverna-download-impl</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>taverna-plugin-impl</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.osgi</groupId>
+			<artifactId>taverna-update-impl</artifactId>
+			<version>${taverna.osgi.version}</version>
+		</dependency>
+
+		<!-- Scufl2 -->
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-rdfxml</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-t2flow</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-validation-structural</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-validation-correctness</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+
+		<!-- Data bundle -->
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-databundle</artifactId>
+			<version>${taverna.language.version}</version>
+		</dependency>
+		<!-- HTTP client needed by Data Bundle -->
+		<!-- Appears unrequired dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpclient-osgi</artifactId>
+			<version>4.2.5</version>
+		</dependency-->
+		<!-- Appears unrequired dependency>
+			<groupId>org.apache.httpcomponents</groupId>
+			<artifactId>httpcore-osgi</artifactId>
+			<version>4.2.5</version>
+		</dependency-->
+		<!-- Jena bundle needed by jsonld-java-jena -->
+		<!-- See https://github.com/stain/jena/tree/jena-bundle/jena-bundle -->
+		<dependency>
+			<groupId>org.apache.jena</groupId>
+			<artifactId>jena-osgi</artifactId>
+			<version>2.12.2-SNAPSHOT</version>
+		</dependency>
+		<!-- slf4j implementation -->
+                <!-- The bundle "org.purl.wf4ever.robundle_0.3.1 " could not be resolved. Reason: Missing Constraint: Import-Package: org.slf4j; version="[1.7.0,2.0.0)"-->
+		<dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-api</artifactId>
+      <version>${slf4j.version}</version>
+		</dependency>
+
+    <!-- Appears unrequired: -->
+    <dependency>
+			<groupId>org.slf4j</groupId>
+			<artifactId>slf4j-log4j12</artifactId>
+      <version>${slf4j.version}</version>
+		</dependency>
+
+		<!-- Taverna Security -->
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-credential-manager-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+
+		<!-- Taverna Workflow Engine -->
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-workflowmodel-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-workflowmodel-core-extensions</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-reference-impl</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>taverna-reference-types</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+
+		<!-- Taverna Provenance -->
+		<!--dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>provenance-derby</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.engine</groupId>
+			<artifactId>provenance-mysql</artifactId>
+			<version>${taverna.engine.version}</version>
+		</dependency-->
+                <!-- The bundle "org.purl.wf4ever.robundle_0.3.1 " could not be resolved. Reason: Missing Constraint: Import-Package: com.fasterxml.jackson.annotation; version="[2.3.0,3.0.0)"-->
+		<dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-core</artifactId>
+            <version>2.3.0</version>
+    </dependency>
+		<dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-annotations</artifactId>
+            <version>2.3.0</version>
+    </dependency>
+		<dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+            <version>2.3.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>nu.validator.htmlparser</groupId>
+      <artifactId>htmlparser</artifactId>
+      <version>${htmlparser.version}</version>
+    </dependency>
+
+
+
+	</dependencies>
+
+</project>
diff --git a/taverna-commandline-product/src/main/assembly/dependencies-component.xml b/taverna-commandline-product/src/main/assembly/dependencies-component.xml
new file mode 100644
index 0000000..0e8640e
--- /dev/null
+++ b/taverna-commandline-product/src/main/assembly/dependencies-component.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<component
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/component/1.1.2"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/component/1.1.2 http://maven.apache.org/xsd/component-1.1.2.xsd">
+
+	<fileSets>
+		<fileSet>
+			<directory>src/main/etc</directory>
+			<fileMode>0755</fileMode>
+			<outputDirectory></outputDirectory>
+			<filtered>true</filtered>
+		</fileSet>
+		<fileSet>
+			<directory>${project.build.directory}/taverna-tmp</directory>
+			<fileMode>0755</fileMode>
+			<outputDirectory></outputDirectory>
+		</fileSet>
+	</fileSets>
+
+</component>
\ No newline at end of file
diff --git a/taverna-commandline-product/src/main/assembly/developer-assembly.xml b/taverna-commandline-product/src/main/assembly/developer-assembly.xml
new file mode 100644
index 0000000..ae2a7c3
--- /dev/null
+++ b/taverna-commandline-product/src/main/assembly/developer-assembly.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assembly
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+	<id>dev</id>
+	<formats>
+		<format>dir</format>
+	</formats>
+	<componentDescriptors>
+		<componentDescriptor>dependencies-component.xml</componentDescriptor>
+	</componentDescriptors>
+</assembly>
diff --git a/taverna-commandline-product/src/main/assembly/nightly-assembly.xml b/taverna-commandline-product/src/main/assembly/nightly-assembly.xml
new file mode 100644
index 0000000..f82e793
--- /dev/null
+++ b/taverna-commandline-product/src/main/assembly/nightly-assembly.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assembly
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+	<id>nightly</id>
+	<baseDirectory>taverna-command-line-${project.version}-${buildNumber}-nightly</baseDirectory>
+	<formats>
+		<!-- <format>dir</format> -->
+		<format>zip</format>
+	</formats>
+	<componentDescriptors>
+		<componentDescriptor>dependencies-component.xml</componentDescriptor>
+	</componentDescriptors>
+</assembly>
diff --git a/taverna-commandline-product/src/main/assembly/release-assembly.xml b/taverna-commandline-product/src/main/assembly/release-assembly.xml
new file mode 100644
index 0000000..61da752
--- /dev/null
+++ b/taverna-commandline-product/src/main/assembly/release-assembly.xml
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<assembly
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+	<id>release</id>
+	<baseDirectory>taverna-command-line-${project.version}</baseDirectory>
+	<formats>
+		<!-- <format>dir</format> -->
+		<format>zip</format>
+	</formats>
+	<componentDescriptors>
+		<componentDescriptor>dependencies-component.xml</componentDescriptor>
+	</componentDescriptors>
+</assembly>
diff --git a/taverna-commandline-product/src/main/etc/conf/log4j.properties b/taverna-commandline-product/src/main/etc/conf/log4j.properties
new file mode 100644
index 0000000..5014f2b
--- /dev/null
+++ b/taverna-commandline-product/src/main/etc/conf/log4j.properties
@@ -0,0 +1,14 @@
+# By default, WARN (our external libraries)
+log4j.rootLogger=INFO, CONSOLE
+
+# Get rid of some xml sec warnings
+log4j.logger.org.apache.ws.security=ERROR
+log4j.logger.org.apache.commons.httpclient=ERROR
+
+# Default output to console is restrictive
+log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
+log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
+log4j.appender.CONSOLE.layout.ConversionPattern=%-5p %d{ISO8601} (%c:%L) - %m%n
+
+# Output WARN and above to console -
+log4j.appender.CONSOLE.Threshold=ERROR
\ No newline at end of file
diff --git a/taverna-commandline-product/src/main/etc/conf/logging.properties b/taverna-commandline-product/src/main/etc/conf/logging.properties
new file mode 100644
index 0000000..b03a43f
--- /dev/null
+++ b/taverna-commandline-product/src/main/etc/conf/logging.properties
@@ -0,0 +1,10 @@
+handlers = java.util.logging.ConsoleHandler, java.util.logging.FileHandler
+
+.level = ALL
+
+java.util.logging.ConsoleHandler.level = WARNING
+java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
+
+java.util.logging.FileHandler.level = ALL
+java.util.logging.FileHandler.count = 5
+java.util.logging.FileHandler.limit = 1048576
diff --git a/taverna-commandline-product/src/main/etc/conf/taverna.app.properties b/taverna-commandline-product/src/main/etc/conf/taverna.app.properties
new file mode 100644
index 0000000..91522d4
--- /dev/null
+++ b/taverna-commandline-product/src/main/etc/conf/taverna.app.properties
@@ -0,0 +1,2 @@
+taverna.app.name=taverna-cl-3.0.0
+taverna.app.title=Taverna Command Line 3.0.0
diff --git a/taverna-commandline-product/src/main/etc/executeworkflow.bat b/taverna-commandline-product/src/main/etc/executeworkflow.bat
new file mode 100644
index 0000000..2e18831
--- /dev/null
+++ b/taverna-commandline-product/src/main/etc/executeworkflow.bat
@@ -0,0 +1,17 @@
+@ECHO OFF
+
+REM Taverna startup script
+
+REM distribution directory
+set TAVERNA_HOME=%~dp0
+
+
+REM 1 GB memory, 400 MB for classes
+set ARGS=-Xmx1g -XX:MaxPermSize=400m
+
+REM Taverna system properties
+set ARGS=%ARGS% "-Dlog4j.configuration=file:///%TAVERNA_HOME%conf/log4j.properties"
+set ARGS=%ARGS% "-Djava.util.logging.config.file=%TAVERNA_HOME%conf/logging.properties"
+set ARGS=%ARGS% "-Dtaverna.app.startup=%TAVERNA_HOME%."
+
+java %ARGS% -jar "%TAVERNA_HOME%lib\/lib/org.apache.taverna.commandline/taverna-commandline-launcher-3.1.0.incubating-SNAPSHOT.jar" %*
diff --git a/taverna-commandline-product/src/main/etc/executeworkflow.sh b/taverna-commandline-product/src/main/etc/executeworkflow.sh
new file mode 100644
index 0000000..5ef0916
--- /dev/null
+++ b/taverna-commandline-product/src/main/etc/executeworkflow.sh
@@ -0,0 +1,25 @@
+#!/bin/sh
+
+set -e
+
+## resolve links - $0 may be a symlink
+prog="$0"
+
+real_path() {
+    readlink -m "$1" 2>/dev/null || python -c 'import os,sys;print os.path.realpath(sys.argv[1])' "$1"
+}
+
+realprog=`real_path "$prog"`
+taverna_home=`dirname "$realprog"`
+javabin=java
+if test -x "$JAVA_HOME/bin/java"; then
+    javabin="$JAVA_HOME/bin/java"
+fi
+
+# 1 GB memory, 400 MB for classes
+exec "$javabin" -Xmx1g -XX:MaxPermSize=400m \
+  "-Dlog4j.configuration=file://$taverna_home/conf/log4j.properties " \
+  "-Djava.util.logging.config.file=$taverna_home/conf/logging.properties " \
+  "-Dtaverna.app.startup=$taverna_home" \
+  -jar "$taverna_home/lib/org.apache.taverna.commandline/taverna-commandline-launcher-3.1.0.incubating-SNAPSHOT.jar" \
+  ${1+"$@"}
diff --git a/taverna-commandline-tests/pom.xml b/taverna-commandline-tests/pom.xml
new file mode 100644
index 0000000..e28c4a0
--- /dev/null
+++ b/taverna-commandline-tests/pom.xml
@@ -0,0 +1,71 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.apache.taverna.commandline</groupId>
+		<artifactId>taverna-commandline</artifactId>
+		<version>3.1.0-incubating-SNAPSHOT</version>
+	</parent>
+	<artifactId>taverna-command-line-tests</artifactId>
+	<name>Apache Taverna Commandline Tests</name>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>2.12</version>
+				<configuration>
+					<systemPropertyVariables>
+						<buildDirectory>${project.build.directory}</buildDirectory>
+					</systemPropertyVariables>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<dependencies>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-t2flow</artifactId>
+			<version>${taverna.language.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.taverna.language</groupId>
+			<artifactId>taverna-scufl2-rdfxml</artifactId>
+			<version>${taverna.language.version}</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.8.1</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>commons-io</groupId>
+			<artifactId>commons-io</artifactId>
+			<version>2.2</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- Optional for scufl2-xdfxml -->
+		<dependency>
+			<groupId>com.sun.xml.bind</groupId>
+			<artifactId>jaxb-impl</artifactId>
+			<version>2.2.4-1</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- Required by scufl2-xdfxml, see SCUFL2-122 -->
+		<dependency>
+			<groupId>org.jdom</groupId>
+			<artifactId>com.springsource.org.jdom</artifactId>
+			<version>1.1.0</version>
+			<scope>test</scope>
+		</dependency>
+		<!-- <dependency>
+			<groupId>org.jdom</groupId>
+			<artifactId>jdom</artifactId>
+			<version>1.1.2</version>
+			<scope>test</scope>
+		</dependency> -->
+	</dependencies>
+</project>
diff --git a/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/TavernaCommandLineTest.java b/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/TavernaCommandLineTest.java
new file mode 100644
index 0000000..07df1c3
--- /dev/null
+++ b/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/TavernaCommandLineTest.java
@@ -0,0 +1,485 @@
+/*******************************************************************************
+ * Copyright (C) 2012 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.commandline;
+
+import static org.junit.Assert.assertArrayEquals;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+import static org.junit.Assume.assumeTrue;
+
+import java.io.File;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.PrintStream;
+import java.net.URI;
+import java.net.URL;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.List;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import org.apache.commons.io.FileUtils;
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.io.comparator.NameFileComparator;
+import org.junit.Before;
+import org.junit.Ignore;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import uk.org.taverna.commandline.WorkflowTestSuite.Workflows;
+import uk.org.taverna.scufl2.api.container.WorkflowBundle;
+import uk.org.taverna.scufl2.api.io.WorkflowBundleIO;
+import uk.org.taverna.scufl2.rdfxml.RDFXMLReader;
+
+/**
+ * Regression tests for Taverna Command Line Tool.
+ *
+ * @author David Withers
+ */
+@RunWith(WorkflowTestSuite.class)
+public class TavernaCommandLineTest {
+
+	private static String baseVersion = "2.4.0";
+	private static boolean baseVersionReleased = true;
+
+	private static String testVersion = "3.0.1-SNAPSHOT";
+	private static boolean testVersionReleased = false;
+	private static boolean testVersionSupportsScufl2 = true;
+
+	private static String script = "executeworkflow.sh";
+	private static String baseName = "taverna-commandline-" + baseVersion;
+	private static String testName = "taverna-command-line-" + testVersion;
+	private static String releasedLocation = "https://launchpad.net/taverna/t2/";
+	private static String unreleasedLocation = "http://build.mygrid.org.uk/ci/job/t3-taverna-commandline-product/lastSuccessfulBuild/net.sf.taverna.t2$taverna-commandline/artifact/net.sf.taverna.t2/taverna-commandline/";
+
+	private static String baseVersionLocation = (baseVersionReleased ? releasedLocation
+			: unreleasedLocation) + baseVersion + "/+download/" + baseName + ".zip";
+	private static String testVersionLocation = (testVersionReleased ? releasedLocation
+			: unreleasedLocation)
+			+ testVersion
+			+ "/"
+			+ testName
+			+ (testVersionReleased ? ".zip" : "-bin.zip");
+
+	private static String baseCommand;
+	private static String testCommand;
+
+	private static File buildDirectory;
+
+	private File workflowDirectory;
+	private File baseOutput;
+	private File testOutput;
+	private boolean secure;
+	private List<File> inputs;
+	private String ignorePort;
+	private String message;
+
+	public TavernaCommandLineTest(File workflowDirectory) throws Exception {
+		this.workflowDirectory = workflowDirectory;
+		if (buildDirectory == null) {
+			String buildDirectoryLocation = System.getProperty("buildDirectory");
+			if (buildDirectoryLocation == null) {
+				buildDirectoryLocation = System.getProperty("user.dir")
+						+ System.getProperty("file.separator") + "target";
+			}
+			buildDirectory = new File(buildDirectoryLocation);
+			buildDirectory.mkdirs();
+		}
+		if (baseCommand == null) {
+			File commandDirectory = new File(buildDirectory, baseName);
+			if (!commandDirectory.exists()) {
+				System.out.println("Fetching " + baseName);
+				fetchTaverna(baseVersionLocation, baseName);
+			}
+			baseCommand = new File(baseName, script).getPath();
+		}
+		if (testCommand == null) {
+			File commandDirectory = new File(buildDirectory, testName);
+			if (!commandDirectory.exists()) {
+				System.out.println("Fetching " + testName);
+				fetchTaverna(testVersionLocation, testName);
+			}
+			testCommand = new File(testName, script).getPath();
+		}
+		File outputsDirectory = new File(buildDirectory, "test-outputs");
+		baseOutput = new File(outputsDirectory, workflowDirectory.getName() + "-" + baseVersion);
+		testOutput = new File(outputsDirectory, workflowDirectory.getName() + "-" + testVersion);
+		secure = workflowDirectory.getName().startsWith("secure");
+		inputs = getInputs();
+		ignorePort = getIgnorePort();
+		message = "Running {0} with version {1}";
+	}
+
+	@Workflows
+	public static List<File> workflows() {
+		List<File> workflows = new ArrayList<File>();
+		for (File workflowDirectory : getResources("workflows")) {
+			workflows.add(workflowDirectory);
+		}
+		for (File workflowDirectory : getResources("myexperiment")) {
+			workflows.add(workflowDirectory);
+		}
+		return workflows;
+	}
+
+	@Before
+	public void setup() throws Exception {
+		if (!baseOutput.exists()) {
+			if (baseVersion.equals("2.3.0") && workflowDirectory.getName().equals("tool"))
+				return;// version 2.3.0 is missing tool plugin
+			String workflow = getWorkflow().toASCIIString();
+			System.out.println(MessageFormat.format(message, workflow, baseVersion)
+					+ (inputs.size() > 0 ? " using input values" : ""));
+			runWorkflow(baseCommand, workflow, baseOutput, true, secure, false);
+			assertTrue(String.format("No output produced for %s", workflowDirectory.getName()),
+					baseOutput.exists());
+		}
+	}
+
+	public boolean testExcluded() {
+		// version 3.0.0 is missing biomoby activity
+		if (testVersion.startsWith("3.") && workflowDirectory.getName().contains("biomoby"))
+			return true;
+		// version 3.0.0 is missing tool activity
+		if (testVersion.startsWith("3.")
+				&& workflowDirectory.getName().equals("unix_external_tools_with_zip_and_unzip"))
+			return true;
+		if (testVersion.startsWith("3.")
+				&& workflowDirectory.getName().equals("unix_numerically_adding_two_values"))
+			return true;
+		if (testVersion.startsWith("3.")
+				&& workflowDirectory.getName().equals("unix_tool_service_using_string_replacement"))
+			return true;
+		// version 3.0.0 is missing looping configuration
+		if (testVersion.startsWith("3.")
+				&& workflowDirectory.getName().equals("ebi_interproscan_newservices"))
+			return true;
+		if (testVersion.startsWith("3.")
+				&& workflowDirectory.getName().equals("biomartandembossanalysis"))
+			return true;
+		return false;
+	}
+
+	@Test
+	public void testWorkflowWithoutInputs() throws Exception {
+		assumeTrue(!testExcluded());
+		assumeTrue(baseOutput.exists());
+		assumeTrue(inputs.isEmpty());
+		FileUtils.deleteDirectory(testOutput);
+		String workflow = getWorkflow().toASCIIString();
+		System.out.println(MessageFormat.format(message, workflow, testVersion));
+		runWorkflow(testCommand, workflow, testOutput, true, secure, false);
+		assertTrue(String.format("No output produced for %s", workflowDirectory.getName()),
+				testOutput.exists());
+		assertOutputsEquals(baseOutput, testOutput);
+	}
+
+	@Test
+	public void testWorkflowWithInputValues() throws Exception {
+		assumeTrue(!testExcluded());
+		assumeTrue(baseOutput.exists());
+		assumeTrue(inputs.size() > 0);
+		FileUtils.deleteDirectory(testOutput);
+		String workflow = getWorkflow().toASCIIString();
+		System.out.println(MessageFormat.format(message, workflow, testVersion)
+				+ " using input values");
+		runWorkflow(testCommand, workflow, testOutput, true, secure, false);
+		assertTrue(String.format("No output produced for %s", workflowDirectory.getName()),
+				testOutput.exists());
+		assertOutputsEquals(baseOutput, testOutput);
+	}
+
+	@Test
+	public void testWorkflowWithInputFiles() throws Exception {
+		assumeTrue(!testExcluded());
+		assumeTrue(baseOutput.exists());
+		assumeTrue(inputs.size() > 0);
+		FileUtils.deleteDirectory(testOutput);
+		String workflow = getWorkflow().toASCIIString();
+		System.out.println(MessageFormat.format(message, workflow, testVersion)
+				+ " using input files");
+		runWorkflow(testCommand, workflow, testOutput, false, secure, false);
+		assertTrue(String.format("No output produced for %s", workflowDirectory.getName()),
+				testOutput.exists());
+		assertOutputsEquals(baseOutput, testOutput);
+	}
+
+	@Test
+	@Ignore
+	public void testWorkflowWithDatabase() throws Exception {
+		assumeTrue(!testExcluded());
+		assumeTrue(baseOutput.exists());
+		assumeTrue(inputs.size() > 0);
+		FileUtils.deleteDirectory(testOutput);
+		String workflow = getWorkflow().toASCIIString();
+		System.out
+				.println(MessageFormat.format(message, workflow, testVersion) + " using database");
+		runWorkflow(testCommand, workflow, testOutput, true, secure, true);
+		assertTrue(String.format("No output produced for %s", workflowDirectory.getName()),
+				testOutput.exists());
+		assertOutputsEquals(baseOutput, testOutput);
+	}
+
+	@Test
+	public void testScufl2Workflow() throws Exception {
+		assumeTrue(!testExcluded());
+		assumeTrue(baseOutput.exists());
+		assumeTrue(testVersionSupportsScufl2);
+
+		FileUtils.deleteDirectory(testOutput);
+		String workflow = getScufl2Workflow().toASCIIString();
+		System.out.println(MessageFormat.format(message, workflow, testVersion)
+				+ (inputs.size() > 0 ? " using input values" : ""));
+		runWorkflow(testCommand, workflow, testOutput, true, secure, true);
+		assertTrue(String.format("No output produced for %s", workflowDirectory.getName()),
+				testOutput.exists());
+		assertOutputsEquals(baseOutput, testOutput);
+	}
+
+	private synchronized void runWorkflow(String command, String workflow, File outputsDirectory,
+			boolean inputValues, boolean secure, boolean database) throws Exception {
+		ProcessBuilder processBuilder = new ProcessBuilder("sh", command);
+		processBuilder.redirectErrorStream(true);
+		processBuilder.directory(buildDirectory);
+		List<String> args = processBuilder.command();
+		for (File input : inputs) {
+			if (inputValues) {
+				args.add("-inputvalue");
+				args.add(input.getName());
+				args.add(IOUtils.toString(new FileReader(input)));
+			} else {
+				args.add("-inputfile");
+				args.add(input.getName());
+				args.add(input.getAbsolutePath());
+			}
+		}
+		args.add("-outputdir");
+		args.add(outputsDirectory.getPath());
+		if (secure) {
+			args.add("-cmdir");
+			args.add(getClass().getResource("/security").getFile());
+			args.add("-cmpassword");
+		}
+		if (database) {
+			args.add("-embedded");
+		}
+		args.add(workflow);
+		Process process = processBuilder.start();
+		if (secure) {
+			PrintStream outputStream = new PrintStream(process.getOutputStream());
+			outputStream.println("test");
+			outputStream.flush();
+		}
+		waitFor(process);
+	}
+
+	private URI getWorkflow() throws Exception {
+		File workflow = new File(workflowDirectory, workflowDirectory.getName() + ".t2flow");
+		if (!workflow.exists()) {
+			workflow = new File(workflowDirectory, workflowDirectory.getName() + ".url");
+			return new URI(IOUtils.toString(new FileReader(workflow)));
+		}
+		return workflow.toURI();
+	}
+
+	private URI getScufl2Workflow() throws Exception {
+		File workflow = new File(buildDirectory, workflowDirectory.getName() + ".wfbundle");
+		// if (!workflow.exists()) {
+		WorkflowBundleIO workflowBundleIO = new WorkflowBundleIO();
+		WorkflowBundle bundle = workflowBundleIO.readBundle(getWorkflow().toURL(), null);
+		workflowBundleIO.writeBundle(bundle, workflow,
+				RDFXMLReader.APPLICATION_VND_TAVERNA_SCUFL2_WORKFLOW_BUNDLE);
+		// }
+		return workflow.toURI();
+	}
+
+	private synchronized int waitFor(Process process) throws IOException {
+		while (true) {
+			try {
+				wait(500);
+			} catch (InterruptedException e) {
+			}
+			IOUtils.copy(process.getInputStream(), System.out);
+			try {
+				return process.exitValue();
+			} catch (IllegalThreadStateException e) {
+			}
+		}
+	}
+
+	private void assertOutputsEquals(File directory1, File directory2) {
+		File[] directory1Files = directory1.listFiles();
+		File[] directory2Files = directory2.listFiles();
+		// assert directories contain same number of files
+		assertEquals(String.format("%s has %s files but %s has %s files", directory1.getName(),
+				directory1Files.length, directory2.getName(), directory2Files.length),
+				directory1Files.length, directory2Files.length);
+		// sort files in directory
+		Arrays.sort(directory1Files, NameFileComparator.NAME_SYSTEM_COMPARATOR);
+		Arrays.sort(directory2Files, NameFileComparator.NAME_SYSTEM_COMPARATOR);
+		for (int i = 0; i < directory1Files.length; i++) {
+			assertFilesEqual(directory1Files[i], directory2Files[i], !directory1Files[i].getName()
+					.equals(ignorePort));
+		}
+	}
+
+	private void assertDirectoriesEquals(File directory1, File directory2, boolean checkFileContents) {
+		if (directory1.exists()) {
+			assertTrue(String.format("%s exists but %s does not", directory1, directory2),
+					directory2.exists());
+		} else {
+			assertFalse(String.format("%s does not exists but %s does", directory1, directory2),
+					directory2.exists());
+		}
+		File[] directory1Files = directory1.listFiles();
+		File[] directory2Files = directory2.listFiles();
+		// assert directories contain same number of files
+		assertEquals(String.format("%s has %s files but %s has %s files", directory1.getName(),
+				directory1Files.length, directory2.getName(), directory2Files.length),
+				directory1Files.length, directory2Files.length);
+		// sort files in directory
+		Arrays.sort(directory1Files, NameFileComparator.NAME_SYSTEM_COMPARATOR);
+		Arrays.sort(directory2Files, NameFileComparator.NAME_SYSTEM_COMPARATOR);
+		for (int i = 0; i < directory1Files.length; i++) {
+			assertFilesEqual(directory1Files[i], directory2Files[i], checkFileContents);
+		}
+	}
+
+	private void assertFilesEqual(File file1, File file2, boolean checkFileContents) {
+		if (file1.isHidden()) {
+			assertTrue(String.format("%s is hidden but %s is not", file1, file2), file2.isHidden());
+		} else {
+			assertFalse(String.format("%s is not hidden but %s is", file1, file2), file2.isHidden());
+			assertEquals(file1.getName(), file2.getName());
+			if (file1.isDirectory()) {
+				assertTrue(String.format("%s is a directory but %s is not", file1, file2),
+						file2.isDirectory());
+				assertDirectoriesEquals(file1, file2, checkFileContents);
+			} else {
+				assertFalse(String.format("%s is not a directory but %s is", file1, file2),
+						file2.isDirectory());
+				if (isZipFile(file1)) {
+					assertZipFilesEqual(file1, file2);
+				} else if (checkFileContents) {
+					assertEquals(String.format("%s is a different length to %s", file1, file2),
+							file1.length(), file2.length());
+					try {
+						byte[] byteArray1 = IOUtils.toByteArray(new FileReader(file1));
+						byte[] byteArray2 = IOUtils.toByteArray(new FileReader(file2));
+						assertArrayEquals(String.format("%s != %s", file1, file2), byteArray1,
+								byteArray2);
+					} catch (FileNotFoundException e) {
+						fail(e.getMessage());
+					} catch (IOException e) {
+						fail(e.getMessage());
+					}
+				}
+			}
+		}
+	}
+
+	private void assertZipFilesEqual(File file1, File file2) {
+		ZipFile zipFile1 = null;
+		ZipFile zipFile2 = null;
+		try {
+			zipFile1 = new ZipFile(file1);
+			zipFile2 = new ZipFile(file2);
+		} catch (Exception e) {
+			assertTrue(String.format("%s and %s are not both zip files"), zipFile1 == null);
+		}
+		if (zipFile1 != null && zipFile2 != null) {
+			Enumeration<? extends ZipEntry> entries1 = zipFile1.entries();
+			Enumeration<? extends ZipEntry> entries2 = zipFile2.entries();
+			while (entries1.hasMoreElements()) {
+				assertTrue(entries2.hasMoreElements());
+				ZipEntry zipEntry1 = entries1.nextElement();
+				ZipEntry zipEntry2 = entries2.nextElement();
+				assertEquals(
+						String.format("%s and %s are not both directories", zipEntry1, zipEntry2),
+						zipEntry1.isDirectory(), zipEntry2.isDirectory());
+				assertEquals(String.format("%s and %s have different names", zipEntry1, zipEntry2),
+						zipEntry1.getName(), zipEntry2.getName());
+				assertEquals(String.format("%s and %s have different sizes", zipEntry1, zipEntry2),
+						zipEntry1.getSize(), zipEntry2.getSize());
+				try {
+					byte[] byteArray1 = IOUtils.toByteArray(zipFile1.getInputStream(zipEntry1));
+					byte[] byteArray2 = IOUtils.toByteArray(zipFile2.getInputStream(zipEntry2));
+					assertArrayEquals(String.format("%s != %s", zipEntry1, zipEntry2), byteArray1,
+							byteArray2);
+				} catch (IOException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+			}
+			assertFalse(entries2.hasMoreElements());
+		}
+	}
+
+	private boolean isZipFile(File file) {
+		try {
+			new ZipFile(file);
+			return true;
+		} catch (Exception e) {
+			return false;
+		}
+	}
+
+	private static File[] getResources(String directory) {
+		return new File(TavernaCommandLineTest.class.getResource("/" + directory).getFile())
+				.listFiles();
+	}
+
+	private List<File> getInputs() {
+		File inputsDirectory = new File(workflowDirectory, "inputs");
+		if (inputsDirectory.exists() && inputsDirectory.isDirectory()) {
+			return Arrays.asList(inputsDirectory.listFiles());
+		}
+		return Collections.emptyList();
+	}
+
+	private String getIgnorePort() throws Exception {
+		File ignorePort = new File(workflowDirectory, "ignorePort");
+		if (ignorePort.exists()) {
+			return IOUtils.toString(new FileReader(ignorePort));
+		}
+		return "";
+	}
+
+	private void fetchTaverna(String location, String name) throws Exception {
+		File zipFile = new File(buildDirectory, name + ".zip");
+		IOUtils.copy(new URL(location).openStream(), new FileOutputStream(zipFile));
+		ProcessBuilder processBuilder = new ProcessBuilder("unzip", "-q", name);
+		processBuilder.redirectErrorStream(true);
+		processBuilder.directory(buildDirectory);
+		System.out.println(processBuilder.command());
+		Process process = processBuilder.start();
+		waitFor(process);
+	}
+
+}
diff --git a/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/WorkflowTestRunner.java b/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/WorkflowTestRunner.java
new file mode 100644
index 0000000..56ed82d
--- /dev/null
+++ b/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/WorkflowTestRunner.java
@@ -0,0 +1,70 @@
+/*******************************************************************************
+ * Copyright (C) 2012 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.commandline;
+
+import java.io.File;
+import java.util.List;
+
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.BlockJUnit4ClassRunner;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.InitializationError;
+import org.junit.runners.model.Statement;
+
+/**
+ * Test runner for running workflows.
+ *
+ * @author David Withers
+ */
+public class WorkflowTestRunner extends BlockJUnit4ClassRunner {
+	private File workflow;
+
+	public WorkflowTestRunner(Class<?> type, File workflow) throws InitializationError {
+		super(type);
+		this.workflow = workflow;
+	}
+
+	@Override
+	public Object createTest() throws Exception {
+		return getTestClass().getOnlyConstructor().newInstance(workflow);
+	}
+
+	@Override
+	protected String getName() {
+		return String.format("[%s]", workflow.getName());
+	}
+
+	@Override
+	protected String testName(final FrameworkMethod method) {
+		return String.format("%s[%s]", method.getName(), workflow.getName());
+	}
+
+	@Override
+	protected void validateConstructor(List<Throwable> errors) {
+		validateOnlyOneConstructor(errors);
+	}
+
+	@Override
+	protected Statement classBlock(RunNotifier notifier) {
+		return childrenInvoker(notifier);
+	}
+
+}
diff --git a/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/WorkflowTestSuite.java b/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/WorkflowTestSuite.java
new file mode 100644
index 0000000..140dec6
--- /dev/null
+++ b/taverna-commandline-tests/src/test/java/uk/org/taverna/commandline/WorkflowTestSuite.java
@@ -0,0 +1,79 @@
+/*******************************************************************************
+ * Copyright (C) 2012 The University of Manchester
+ *
+ *  Modifications to the initial code base are copyright of their
+ *  respective authors, or their employers as appropriate.
+ *
+ *  This program is free software; you can redistribute it and/or
+ *  modify it under the terms of the GNU Lesser General Public License
+ *  as published by the Free Software Foundation; either version 2.1 of
+ *  the License, or (at your option) any later version.
+ *
+ *  This program is distributed in the hope that it will be useful, but
+ *  WITHOUT ANY WARRANTY; without even the implied warranty of
+ *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ *  Lesser General Public License for more details.
+ *
+ *  You should have received a copy of the GNU Lesser General Public
+ *  License along with this program; if not, write to the Free Software
+ *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
+ ******************************************************************************/
+package uk.org.taverna.commandline;
+
+import java.io.File;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.lang.reflect.Modifier;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.junit.runner.Runner;
+import org.junit.runners.Suite;
+import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.TestClass;
+
+/**
+ * Test suite for running workflows specified by a method annotated by &#064;Workflows.
+ *
+ * @author David Withers
+ */
+public class WorkflowTestSuite extends Suite {
+
+	@Retention(RetentionPolicy.RUNTIME)
+	@Target(ElementType.METHOD)
+	public static @interface Workflows {}
+
+	private ArrayList<Runner> runners = new ArrayList<Runner>();
+
+	public WorkflowTestSuite(Class<?> klass) throws Throwable {
+		super(klass, Collections.<Runner>emptyList());
+		for (File workflow : getWorkflows(getTestClass())) {
+			runners.add(new WorkflowTestRunner(getTestClass().getJavaClass(), workflow));
+		}
+	}
+
+	@Override
+	protected List<Runner> getChildren() {
+		return runners;
+	}
+
+	@SuppressWarnings("unchecked")
+	private List<File> getWorkflows(TestClass klass) throws Throwable {
+		return (List<File>) getWorkflowsMethod(klass).invokeExplosively(null);
+	}
+
+	public FrameworkMethod getWorkflowsMethod(TestClass testClass) throws Exception {
+		List<FrameworkMethod> methods = testClass.getAnnotatedMethods(Workflows.class);
+		for (FrameworkMethod method : methods) {
+			int modifiers = method.getMethod().getModifiers();
+			if (Modifier.isStatic(modifiers) && Modifier.isPublic(modifiers)) {
+				return method;
+			}
+		}
+		throw new Exception("No public static Workflows annotated method on class " + testClass.getName());
+	}
+
+}
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/biomartandembossanalysis/biomartandembossanalysis.url b/taverna-commandline-tests/src/test/resources/myexperiment/biomartandembossanalysis/biomartandembossanalysis.url
new file mode 100644
index 0000000..5846961
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/biomartandembossanalysis/biomartandembossanalysis.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1794/download/biomartandembossanalysis_457009.t2flow?version=4
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/biomartandembossanalysis/ignorePort b/taverna-commandline-tests/src/test/resources/myexperiment/biomartandembossanalysis/ignorePort
new file mode 100644
index 0000000..e0cb526
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/biomartandembossanalysis/ignorePort
@@ -0,0 +1 @@
+outputPlot
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/biomoby_tutorial_workflow.url b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/biomoby_tutorial_workflow.url
new file mode 100644
index 0000000..a73b8c4
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/biomoby_tutorial_workflow.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1366/download/biomoby_tutorial_workflow_877727.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/ignorePort b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/ignorePort
new file mode 100644
index 0000000..f8e22dd
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/ignorePort
@@ -0,0 +1 @@
+restrict_out
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/inputs/id b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/inputs/id
new file mode 100644
index 0000000..1dfd176
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/inputs/id
@@ -0,0 +1 @@
+656461
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/inputs/namespace b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/inputs/namespace
new file mode 100644
index 0000000..c188363
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/biomoby_tutorial_workflow/inputs/namespace
@@ -0,0 +1 @@
+NCBI_gi
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/demonstration_of_configurable_iteration/demonstration_of_configurable_iteration.url b/taverna-commandline-tests/src/test/resources/myexperiment/demonstration_of_configurable_iteration/demonstration_of_configurable_iteration.url
new file mode 100644
index 0000000..38abe3a
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/demonstration_of_configurable_iteration/demonstration_of_configurable_iteration.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1367/download/demonstration_of_configurable_iteration_114130.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/ebi_interproscan_newservices.url b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/ebi_interproscan_newservices.url
new file mode 100644
index 0000000..a329afc
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/ebi_interproscan_newservices.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1767/download/ebi_interproscan_newservices_421482.t2flow?version=2
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/ignorePort b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/ignorePort
new file mode 100644
index 0000000..1ec3d86
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/ignorePort
@@ -0,0 +1 @@
+Graphical_output
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/inputs/email b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/inputs/email
new file mode 100644
index 0000000..38133d0
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/inputs/email
@@ -0,0 +1 @@
+test@mygrid.org.uk
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/inputs/sequence b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/inputs/sequence
new file mode 100644
index 0000000..19a43dd
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/ebi_interproscan_newservices/inputs/sequence
@@ -0,0 +1,8 @@
+>sp|Q9BTV4|TMM43_HUMAN Transmembrane protein 43 OS=Homo sapiens GN=TMEM43 PE=1 SV=1
+MAANYSSTSTRREHVKVKTSSQPGFLERLSETSGGMFVGLMAFLLSFYLIFTNEGRALKT
+ATSLAEGLSLVVSPDSIHSVAPENEGRLVHIIGALRTSKLLSDPNYGVHLPAVKLRRHVE
+MYQWVETEESREYTEDGQVKKETRYSYNTEWRSEIINSKNFDREIGHKNPSAMAVESFMA
+TAPFVQIGRFFLSSGLIDKVDNFKSLSLSKLEDPHVDIIRRGDFFYHSENPKYPEVGDLR
+VSFSYAGLSGDDPDLGPAHVVTVIARQRGDQLVPFSTKSGDTLLLLHHGDFSAEEVFHRE
+LRSNSMKTWGLRAAGWMAMFMGLNLMTRILYTLVDWFPVFRDLVNIGLKAFAFCVATSLT
+LLTVAAGWLFYRPLWALLIAGLALVPILVARTRVPAKKLE
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_of_conditional_invocation/example_of_conditional_invocation.url b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_conditional_invocation/example_of_conditional_invocation.url
new file mode 100644
index 0000000..350a27f
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_conditional_invocation/example_of_conditional_invocation.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2561/download/example_of_conditional_invocation_369634.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_of_conditional_invocation/inputs/condition b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_conditional_invocation/inputs/condition
new file mode 100644
index 0000000..f32a580
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_conditional_invocation/inputs/condition
@@ -0,0 +1 @@
+true
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/example_of_explicit_looping.url b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/example_of_explicit_looping.url
new file mode 100644
index 0000000..a8773c4
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/example_of_explicit_looping.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2562/download/example_of_explicit_looping_785852.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/end b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/end
new file mode 100644
index 0000000..da2d398
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/end
@@ -0,0 +1 @@
+14
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/start b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/start
new file mode 100644
index 0000000..7d105a7
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/start
@@ -0,0 +1 @@
+-3
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/step b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/step
new file mode 100644
index 0000000..e440e5c
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_of_explicit_looping/inputs/step
@@ -0,0 +1 @@
+3
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_workflow_for_rest_and_xpath_activities/example_workflow_for_rest_and_xpath_activities.url b/taverna-commandline-tests/src/test/resources/myexperiment/example_workflow_for_rest_and_xpath_activities/example_workflow_for_rest_and_xpath_activities.url
new file mode 100644
index 0000000..bd3ff3d
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_workflow_for_rest_and_xpath_activities/example_workflow_for_rest_and_xpath_activities.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1510/download/example_workflow_for_rest_and_xpath_activities_650957.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/example_workflow_for_rest_and_xpath_activities/inputs/Name_Of_Location_for_Weather_Forecast b/taverna-commandline-tests/src/test/resources/myexperiment/example_workflow_for_rest_and_xpath_activities/inputs/Name_Of_Location_for_Weather_Forecast
new file mode 100644
index 0000000..bbab6f1
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/example_workflow_for_rest_and_xpath_activities/inputs/Name_Of_Location_for_Weather_Forecast
@@ -0,0 +1 @@
+London
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/fetch_dragon_images_from_biomoby/fetch_dragon_images_from_biomoby.url b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_dragon_images_from_biomoby/fetch_dragon_images_from_biomoby.url
new file mode 100644
index 0000000..1aeab4b
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_dragon_images_from_biomoby/fetch_dragon_images_from_biomoby.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1005/download/fetch_dragon_images_from_biomoby_830269.t2flow?version=2
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/fetch_pdb_flatfile_from_rcsb_server/fetch_pdb_flatfile_from_rcsb_server.url b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_pdb_flatfile_from_rcsb_server/fetch_pdb_flatfile_from_rcsb_server.url
new file mode 100644
index 0000000..5d10074
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_pdb_flatfile_from_rcsb_server/fetch_pdb_flatfile_from_rcsb_server.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1369/download/fetch_pdb_flatfile_from_rcsb_server_969361.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/fetch_pdb_flatfile_from_rcsb_server/inputs/pdbID b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_pdb_flatfile_from_rcsb_server/inputs/pdbID
new file mode 100644
index 0000000..7f3db81
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_pdb_flatfile_from_rcsb_server/inputs/pdbID
@@ -0,0 +1 @@
+1crn
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/fetch_today_s_xkcd_comic/fetch_today_s_xkcd_comic.url b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_today_s_xkcd_comic/fetch_today_s_xkcd_comic.url
new file mode 100644
index 0000000..48f849f
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/fetch_today_s_xkcd_comic/fetch_today_s_xkcd_comic.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1370/download/fetch_today_s_xkcd_comic_568671.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/gbseq_test/gbseq_test.url b/taverna-commandline-tests/src/test/resources/myexperiment/gbseq_test/gbseq_test.url
new file mode 100644
index 0000000..c0f40c5
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/gbseq_test/gbseq_test.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1371/download/gbseq_test_457824.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/hello_anyone/hello_anyone.url b/taverna-commandline-tests/src/test/resources/myexperiment/hello_anyone/hello_anyone.url
new file mode 100644
index 0000000..f4181b8
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/hello_anyone/hello_anyone.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2649/download/hello_anyone_895936.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/hello_anyone/inputs/name b/taverna-commandline-tests/src/test/resources/myexperiment/hello_anyone/inputs/name
new file mode 100644
index 0000000..d565a0b
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/hello_anyone/inputs/name
@@ -0,0 +1 @@
+Fred
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/hello_world/hello_world.url b/taverna-commandline-tests/src/test/resources/myexperiment/hello_world/hello_world.url
new file mode 100644
index 0000000..c596de4
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/hello_world/hello_world.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2648/download/hello_world_190236.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/pipelined_list_iteration/inputs/input b/taverna-commandline-tests/src/test/resources/myexperiment/pipelined_list_iteration/inputs/input
new file mode 100644
index 0000000..4701cc7
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/pipelined_list_iteration/inputs/input
@@ -0,0 +1 @@
+150
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/pipelined_list_iteration/pipelined_list_iteration.url b/taverna-commandline-tests/src/test/resources/myexperiment/pipelined_list_iteration/pipelined_list_iteration.url
new file mode 100644
index 0000000..dd3c98c
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/pipelined_list_iteration/pipelined_list_iteration.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1372/download/pipelined_list_iteration_902021.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/retrieve_sequence_in_embl_format/retrieve_sequence_in_embl_format.url b/taverna-commandline-tests/src/test/resources/myexperiment/retrieve_sequence_in_embl_format/retrieve_sequence_in_embl_format.url
new file mode 100644
index 0000000..2b4ab46
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/retrieve_sequence_in_embl_format/retrieve_sequence_in_embl_format.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1373/download/retrieve_sequence_in_embl_format_32794.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/secure_rest_service_call_example/secure_rest_service_call_example.url b/taverna-commandline-tests/src/test/resources/myexperiment/secure_rest_service_call_example/secure_rest_service_call_example.url
new file mode 100644
index 0000000..03cf409
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/secure_rest_service_call_example/secure_rest_service_call_example.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2253/download/secure_rest_service_call_example_19600.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/secure_web_service_call_example/secure_web_service_call_example.url b/taverna-commandline-tests/src/test/resources/myexperiment/secure_web_service_call_example/secure_web_service_call_example.url
new file mode 100644
index 0000000..c2a4ad4
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/secure_web_service_call_example/secure_web_service_call_example.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2254/download/secure_web_service_call_example_565494.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/spreadsheed_data_import_example/spreadsheed_data_import_example.url b/taverna-commandline-tests/src/test/resources/myexperiment/spreadsheed_data_import_example/spreadsheed_data_import_example.url
new file mode 100644
index 0000000..98d8ed4
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/spreadsheed_data_import_example/spreadsheed_data_import_example.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/1417/download/spreadsheed_data_import_example_492836.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/unix_external_tools_with_zip_and_unzip/unix_external_tools_with_zip_and_unzip.url b/taverna-commandline-tests/src/test/resources/myexperiment/unix_external_tools_with_zip_and_unzip/unix_external_tools_with_zip_and_unzip.url
new file mode 100644
index 0000000..958de61
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/unix_external_tools_with_zip_and_unzip/unix_external_tools_with_zip_and_unzip.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2230/download/example_for_external_tools_with_zip_and_unzip_57117.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/inputs/a b/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/inputs/a
new file mode 100644
index 0000000..56a6051
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/inputs/a
@@ -0,0 +1 @@
+1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/inputs/b b/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/inputs/b
new file mode 100644
index 0000000..d8263ee
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/inputs/b
@@ -0,0 +1 @@
+2
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/unix_numerically_adding_two_values.url b/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/unix_numerically_adding_two_values.url
new file mode 100644
index 0000000..72ef715
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/unix_numerically_adding_two_values/unix_numerically_adding_two_values.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2231/download/numerically_adding_two_values._763485.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/myexperiment/unix_tool_service_using_string_replacement/unix_tool_service_using_string_replacement.url b/taverna-commandline-tests/src/test/resources/myexperiment/unix_tool_service_using_string_replacement/unix_tool_service_using_string_replacement.url
new file mode 100644
index 0000000..155d7e4
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/myexperiment/unix_tool_service_using_string_replacement/unix_tool_service_using_string_replacement.url
@@ -0,0 +1 @@
+http://www.myexperiment.org/workflows/2229/download/unix_tool_service_using_string_replacement_219870.t2flow?version=1
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/security/t2keystore.ubr b/taverna-commandline-tests/src/test/resources/security/t2keystore.ubr
new file mode 100644
index 0000000..c79eddf
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/security/t2keystore.ubr
Binary files differ
diff --git a/taverna-commandline-tests/src/test/resources/security/t2truststore.ubr b/taverna-commandline-tests/src/test/resources/security/t2truststore.ubr
new file mode 100644
index 0000000..ec1717d
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/security/t2truststore.ubr
Binary files differ
diff --git a/taverna-commandline-tests/src/test/resources/security/taverna-keystore.ubr b/taverna-commandline-tests/src/test/resources/security/taverna-keystore.ubr
new file mode 100644
index 0000000..c79eddf
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/security/taverna-keystore.ubr
Binary files differ
diff --git a/taverna-commandline-tests/src/test/resources/security/taverna-truststore.ubr b/taverna-commandline-tests/src/test/resources/security/taverna-truststore.ubr
new file mode 100644
index 0000000..ec1717d
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/security/taverna-truststore.ubr
Binary files differ
diff --git a/taverna-commandline-tests/src/test/resources/workflows/apiconsumer/apiconsumer.t2flow b/taverna-commandline-tests/src/test/resources/workflows/apiconsumer/apiconsumer.t2flow
new file mode 100644
index 0000000..66ef4ac
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/apiconsumer/apiconsumer.t2flow
@@ -0,0 +1,178 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="8bf2b5e5-a3e0-4fbd-bfd2-aefc7b2a6b8a" role="top"><name>Workflow4</name><inputPorts><port><name>in</name><depth>0</depth><granularDepth>0</granularDepth><annotations /></port></inputPorts><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>String</name><inputPorts><port><name>string</name><depth>0</depth></port></inputPorts><outputPorts><port><name>object</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>apiconsumer-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.apiconsumer.ApiConsumerActivity</class><inputMap><map from="string" to="string" /></inputMap><outputMap><map from="object" to="object" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.apiconsumer.ApiConsumerActivityConfigurationBean xmlns="">

+  <inputs />

+  <outputs />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <apiConsumerName>No name</apiConsumerName>

+  <apiConsumerDescription>No description</apiConsumerDescription>

+  <description />

+  <className>java.lang.String</className>

+  <methodName>String</methodName>

+  <parameterNames>

+    <string>string</string>

+  </parameterNames>

+  <parameterDimensions>

+    <int>0</int>

+  </parameterDimensions>

+  <parameterTypes>

+    <string>java.lang.String</string>

+  </parameterTypes>

+  <returnType>java.lang.String</returnType>

+  <returnDimension>0</returnDimension>

+  <isMethodStatic>false</isMethodStatic>

+  <isMethodConstructor>true</isMethodConstructor>

+</net.sf.taverna.t2.activities.apiconsumer.ApiConsumerActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="string" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>toUpperCase</name><inputPorts><port><name>object</name><depth>0</depth></port></inputPorts><outputPorts><port><name>result</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>apiconsumer-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.apiconsumer.ApiConsumerActivity</class><inputMap><map from="object" to="object" /></inputMap><outputMap><map from="result" to="result" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.apiconsumer.ApiConsumerActivityConfigurationBean xmlns="">

+  <inputs />

+  <outputs />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <apiConsumerName>No name</apiConsumerName>

+  <apiConsumerDescription>No description</apiConsumerDescription>

+  <description />

+  <className>java.lang.String</className>

+  <methodName>toUpperCase</methodName>

+  <parameterNames />

+  <parameterDimensions />

+  <parameterTypes />

+  <returnType>java.lang.String</returnType>

+  <returnDimension>0</returnDimension>

+  <isMethodStatic>false</isMethodStatic>

+  <isMethodConstructor>false</isMethodConstructor>

+</net.sf.taverna.t2.activities.apiconsumer.ApiConsumerActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="object" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>String</processor><port>string</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="processor"><processor>toUpperCase</processor><port>object</port></sink><source type="processor"><processor>String</processor><port>object</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>toUpperCase</processor><port>result</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>483d65c6-98c1-4b94-b628-d5bcbf351e97</identification>

+      </annotationBean>

+      <date>2011-05-16 13:07:03.385 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d460e60a-43bb-47fc-a9f4-89e15274b100</identification>

+      </annotationBean>

+      <date>2011-11-02 12:43:09.911 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>0d977496-aa5d-4274-9827-85400d5f13a2</identification>

+      </annotationBean>

+      <date>2011-05-16 13:06:33.69 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8bf2b5e5-a3e0-4fbd-bfd2-aefc7b2a6b8a</identification>

+      </annotationBean>

+      <date>2011-11-02 12:46:41.313 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>58f30a52-57df-46ce-b1bb-b9533984f8dd</identification>

+      </annotationBean>

+      <date>2011-11-02 12:29:15.575 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c2693c41-1373-48cf-afbe-d8bbe0ea9e35</identification>

+      </annotationBean>

+      <date>2011-11-02 12:31:01.678 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>1ce7f3a0-71f4-4794-8bbd-dbb6de42442d</identification>

+      </annotationBean>

+      <date>2011-05-16 12:57:01.975 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>4c2b6995-eecb-47a7-b72c-63cfb96b6852</identification>

+      </annotationBean>

+      <date>2011-11-02 12:43:51.355 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>225db881-4e07-4cdb-920c-343dc1536edc</identification>

+      </annotationBean>

+      <date>2011-05-16 13:10:54.588 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>404e203c-ce51-4a9f-907c-1dab7f2eaaa2</identification>

+      </annotationBean>

+      <date>2011-05-16 12:44:02.533 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>0b6881f1-aa8d-483e-a7bb-7ad38b1da778</identification>

+      </annotationBean>

+      <date>2011-05-16 12:26:38.721 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/apiconsumer/inputs/in b/taverna-commandline-tests/src/test/resources/workflows/apiconsumer/inputs/in
new file mode 100644
index 0000000..fede229
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/apiconsumer/inputs/in
@@ -0,0 +1 @@
+test-input
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/beanshell/beanshell.t2flow b/taverna-commandline-tests/src/test/resources/workflows/beanshell/beanshell.t2flow
new file mode 100644
index 0000000..8c5968c
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/beanshell/beanshell.t2flow
@@ -0,0 +1,137 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.2.0"><dataflow id="78cb1427-d57f-42c2-a385-1d20c1580f3b" role="top"><name>Workflow13</name><inputPorts><port><name>in</name><depth>0</depth><granularDepth>0</granularDepth><annotations /></port></inputPorts><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Echo</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out=in;</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>ListGenerator</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>1</depth><granularDepth>1</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out = new ArrayList();

+

+for (int i = 0; i &lt; 1000; i++) {

+  out.add(in + ":" + i);

+}</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>1</granularDepth>

+      <name>out</name>

+      <depth>1</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>Echo</processor><port>in</port></sink><source type="processor"><processor>ListGenerator</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>ListGenerator</processor><port>in</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Echo</processor><port>out</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>13c70169-dfaa-4ea6-b6ab-3551dae7fa84</identification>

+      </annotationBean>

+      <date>2010-08-19 12:28:57.881 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7ef10e93-7376-41a9-9255-552149094142</identification>

+      </annotationBean>

+      <date>2010-08-31 13:06:57.536 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>3b7c0b9c-572d-466b-af6d-0fb40699e8a5</identification>

+      </annotationBean>

+      <date>2010-08-31 12:50:40.306 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eb6a550d-f34e-4de9-b0fc-1b3df8ab36c4</identification>

+      </annotationBean>

+      <date>2010-08-31 14:32:44.634 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>78cb1427-d57f-42c2-a385-1d20c1580f3b</identification>

+      </annotationBean>

+      <date>2010-08-31 14:36:00.297 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ad638364-a6e0-4852-abca-9f609c9553d2</identification>

+      </annotationBean>

+      <date>2010-08-19 13:43:43.797 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/beanshell/inputs/in b/taverna-commandline-tests/src/test/resources/workflows/beanshell/inputs/in
new file mode 100644
index 0000000..fede229
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/beanshell/inputs/in
@@ -0,0 +1 @@
+test-input
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/biomart/biomart.t2flow b/taverna-commandline-tests/src/test/resources/workflows/biomart/biomart.t2flow
new file mode 100644
index 0000000..f82f340
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/biomart/biomart.t2flow
@@ -0,0 +1,30 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="4a959e22-8166-4e8b-ae94-6e85c8807e35" role="top"><name>Workflow1</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>btaurus_gene_ensembl</name><inputPorts /><outputPorts><port><name>btaurus_gene_ensembl.ensembl_gene_id</name><depth>1</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>biomart-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.biomart.BiomartActivity</class><inputMap /><outputMap><map from="btaurus_gene_ensembl.ensembl_gene_id" to="btaurus_gene_ensembl.ensembl_gene_id" /></outputMap><configBean encoding="jdomxml"><MartQuery xmlns=""><MartService location="http://www.biomart.org/biomart/martservice" /><MartDataset displayName="Bos taurus genes (UMD3.1)" name="btaurus_gene_ensembl" type="TableSet" initialBatchSize="200" maximumBatchSize="50000" visible="false" interface="default" modified="2011-09-07 22:16:01"><MartURLLocation database="ensembl_mart_64" default="1" displayName="ENSEMBL GENES 64 (SANGER UK)" host="www.biomart.org" includeDatasets="" martUser="" name="ensembl" path="/biomart/martservice" port="80" serverVirtualSchema="default" virtualSchema="default" visible="1" redirect="0" /></MartDataset><Query virtualSchemaName="default" count="0" uniqueRows="1" softwareVersion="0.6" requestId="taverna"><Dataset name="btaurus_gene_ensembl"><Attribute name="ensembl_gene_id" /><Filter name="chromosome_name" value="1" /><Filter name="with_affy_bovine" excluded="0" /><Filter name="go_evidence_code" value="IDA" /></Dataset></Query></MartQuery></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>btaurus_gene_ensembl</processor><port>btaurus_gene_ensembl.ensembl_gene_id</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>4a959e22-8166-4e8b-ae94-6e85c8807e35</identification>

+      </annotationBean>

+      <date>2011-10-27 14:33:16.228 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>5859741c-a0ba-4dae-8b81-1dd7c928562f</identification>

+      </annotationBean>

+      <date>2011-10-27 14:32:47.106 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/dataflow/dataflow.t2flow b/taverna-commandline-tests/src/test/resources/workflows/dataflow/dataflow.t2flow
new file mode 100644
index 0000000..c9366c2
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/dataflow/dataflow.t2flow
@@ -0,0 +1,217 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="ac4ce40a-57b9-486c-bb4c-eb8609c6cc48" role="top"><name>Workflow1</name><inputPorts><port><name>in</name><depth>0</depth><granularDepth>0</granularDepth><annotations /></port></inputPorts><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Nested_workflow</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>dataflow-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.dataflow.DataflowActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="dataflow"><dataflow ref="c6b258ac-3588-4828-b71c-207bad8b63c4" /></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>echo</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <name>in</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+      <granularDepth>0</granularDepth>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <script>out = in;</script>

+  <dependencies />

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>echo_2</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <name>in</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+      <granularDepth>0</granularDepth>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <script>out = in;</script>

+  <dependencies />

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>Nested_workflow</processor><port>in</port></sink><source type="processor"><processor>echo</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>echo</processor><port>in</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="processor"><processor>echo_2</processor><port>in</port></sink><source type="processor"><processor>Nested_workflow</processor><port>out</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>echo_2</processor><port>out</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>437a237a-03a0-489f-97c6-fd5acc5db18e</identification>

+      </annotationBean>

+      <date>2011-11-09 10:59:10.221 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ae7626c8-13a4-4560-9496-59a8cc0693be</identification>

+      </annotationBean>

+      <date>2011-02-16 11:57:10.514 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>96d450ff-aaf8-473b-91a1-4acce7371c3b</identification>

+      </annotationBean>

+      <date>2011-02-16 11:55:55.618 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ac4ce40a-57b9-486c-bb4c-eb8609c6cc48</identification>

+      </annotationBean>

+      <date>2011-11-09 11:02:29.60 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>9f957cde-a7ad-4453-a09f-7231c8c8c4f3</identification>

+      </annotationBean>

+      <date>2011-02-16 11:52:40.88 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>f847ed6f-2834-4861-a8af-73ab737c6a91</identification>

+      </annotationBean>

+      <date>2011-11-09 11:00:41.783 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow><dataflow id="c6b258ac-3588-4828-b71c-207bad8b63c4" role="nested"><name>Workflow4</name><inputPorts><port><name>in</name><depth>0</depth><granularDepth>0</granularDepth><annotations /></port></inputPorts><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>echo</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <name>in</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+      <granularDepth>0</granularDepth>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <script>out = "nested dataflow : " + in;</script>

+  <dependencies />

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>echo</processor><port>in</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>echo</processor><port>out</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>f8dd3fb7-7051-4242-a3af-d82056934cf6</identification>

+      </annotationBean>

+      <date>2011-02-16 11:55:01.559 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>0a0b6f17-8ebf-4017-ad4c-0719a9d44806</identification>

+      </annotationBean>

+      <date>2011-11-09 11:00:37.241 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c6b258ac-3588-4828-b71c-207bad8b63c4</identification>

+      </annotationBean>

+      <date>2011-11-09 11:02:26.99 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eaa8b2a0-e71b-4d6a-b8ad-c299a8ad6e18</identification>

+      </annotationBean>

+      <date>2011-02-16 11:53:12.59 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/dataflow/inputs/in b/taverna-commandline-tests/src/test/resources/workflows/dataflow/inputs/in
new file mode 100644
index 0000000..fede229
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/dataflow/inputs/in
@@ -0,0 +1 @@
+test-input
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/in-out/in-out.t2flow b/taverna-commandline-tests/src/test/resources/workflows/in-out/in-out.t2flow
new file mode 100644
index 0000000..ecfb4e8
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/in-out/in-out.t2flow
@@ -0,0 +1,12 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="4d8a491e-fa11-4918-98ce-7df19051d5c5" role="top"><name>Workflow6</name><inputPorts><port><name>in</name><depth>0</depth><granularDepth>0</granularDepth><annotations /></port></inputPorts><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors /><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="dataflow"><port>in</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>4d8a491e-fa11-4918-98ce-7df19051d5c5</identification>

+      </annotationBean>

+      <date>2012-04-03 15:34:41.4 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/in-out/inputs/in b/taverna-commandline-tests/src/test/resources/workflows/in-out/inputs/in
new file mode 100644
index 0000000..fede229
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/in-out/inputs/in
@@ -0,0 +1 @@
+test-input
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/iteration/inputs/in b/taverna-commandline-tests/src/test/resources/workflows/iteration/inputs/in
new file mode 100644
index 0000000..30d74d2
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/iteration/inputs/in
@@ -0,0 +1 @@
+test
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/iteration/iteration.t2flow b/taverna-commandline-tests/src/test/resources/workflows/iteration/iteration.t2flow
new file mode 100644
index 0000000..bec4c2d
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/iteration/iteration.t2flow
@@ -0,0 +1,474 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.2.0"><dataflow id="80c80b32-1faa-4c8e-9294-eb85d6aaa764" role="top"><name>Workflow13</name><inputPorts><port><name>in</name><depth>0</depth><granularDepth>0</granularDepth><annotations /></port></inputPorts><outputPorts><port><name>cross</name><annotations /></port><port><name>dot</name><annotations /></port><port><name>crossdot</name><annotations /></port><port><name>dotdot</name><annotations /></port><port><name>dotcross</name><annotations /></port></outputPorts><processors><processor><name>cross</name><inputPorts><port><name>in1</name><depth>0</depth></port><port><name>in2</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out=in1 + in2;</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in1</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in2</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in1" depth="0" /><port name="in2" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>ListGenerator1</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>1</depth><granularDepth>1</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out = new ArrayList();

+

+for (int i = 0; i &lt; 10; i++) {

+  out.add(in + ":" + i);

+}</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>1</granularDepth>

+      <name>out</name>

+      <depth>1</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>ListGenerator2</name><inputPorts><port><name>in</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>1</depth><granularDepth>1</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in" to="in" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out = new ArrayList();

+

+for (int i = 0; i &lt; 10; i++) {

+  out.add(in + ":" + i);

+}</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>1</granularDepth>

+      <name>out</name>

+      <depth>1</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>dot</name><inputPorts><port><name>in2</name><depth>0</depth></port><port><name>in1</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out=in1 + in2;</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in1</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in2</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><dot><port name="in2" depth="0" /><port name="in1" depth="0" /></dot></strategy></iteration></iterationStrategyStack></processor><processor><name>crossdot</name><inputPorts><port><name>in1</name><depth>0</depth></port><port><name>in2</name><depth>0</depth></port><port><name>in3</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /><map from="in3" to="in3" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out = in1 + in2 + in3;</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in1</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in2</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in3</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in1" depth="0" /><port name="in2" depth="0" /><dot><port name="in3" depth="0" /></dot></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>dotcross</name><inputPorts><port><name>in1</name><depth>0</depth></port><port><name>in2</name><depth>0</depth></port><port><name>in3</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /><map from="in3" to="in3" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out = in1 + in2 + in3;</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in1</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in2</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in3</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in3" depth="0" /><dot><port name="in2" depth="0" /><port name="in1" depth="0" /></dot></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>dotdot</name><inputPorts><port><name>in1</name><depth>0</depth></port><port><name>in2</name><depth>0</depth></port><port><name>in3</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>beanshell-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.beanshell.BeanshellActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /><map from="in3" to="in3" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean xmlns="">

+  <script>out = in1 + in2 + in3;</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in1</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in2</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>in3</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>text/plain</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes />

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.beanshell.BeanshellActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><dot><port name="in1" depth="0" /><port name="in2" depth="0" /><dot><port name="in3" depth="0" /></dot></dot></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>cross</processor><port>in1</port></sink><source type="processor"><processor>ListGenerator1</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>cross</processor><port>in2</port></sink><source type="processor"><processor>ListGenerator2</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>ListGenerator1</processor><port>in</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="processor"><processor>ListGenerator2</processor><port>in</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="processor"><processor>dot</processor><port>in2</port></sink><source type="processor"><processor>ListGenerator2</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>dot</processor><port>in1</port></sink><source type="processor"><processor>ListGenerator1</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>crossdot</processor><port>in1</port></sink><source type="processor"><processor>ListGenerator1</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>crossdot</processor><port>in2</port></sink><source type="processor"><processor>ListGenerator2</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>crossdot</processor><port>in3</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="processor"><processor>dotcross</processor><port>in1</port></sink><source type="processor"><processor>ListGenerator1</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>dotcross</processor><port>in2</port></sink><source type="processor"><processor>ListGenerator2</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>dotcross</processor><port>in3</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="processor"><processor>dotdot</processor><port>in1</port></sink><source type="processor"><processor>ListGenerator1</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>dotdot</processor><port>in2</port></sink><source type="processor"><processor>ListGenerator2</processor><port>out</port></source></datalink><datalink><sink type="processor"><processor>dotdot</processor><port>in3</port></sink><source type="processor"><processor>ListGenerator2</processor><port>out</port></source></datalink><datalink><sink type="dataflow"><port>cross</port></sink><source type="processor"><processor>cross</processor><port>out</port></source></datalink><datalink><sink type="dataflow"><port>dot</port></sink><source type="processor"><processor>dot</processor><port>out</port></source></datalink><datalink><sink type="dataflow"><port>crossdot</port></sink><source type="processor"><processor>crossdot</processor><port>out</port></source></datalink><datalink><sink type="dataflow"><port>dotdot</port></sink><source type="processor"><processor>dotdot</processor><port>out</port></source></datalink><datalink><sink type="dataflow"><port>dotcross</port></sink><source type="processor"><processor>dotcross</processor><port>out</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ad638364-a6e0-4852-abca-9f609c9553d2</identification>

+      </annotationBean>

+      <date>2010-08-19 13:43:43.797 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>3fb7f0a7-26f8-43e1-a122-87a25889f57d</identification>

+      </annotationBean>

+      <date>2011-02-22 08:25:53.793 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>13c70169-dfaa-4ea6-b6ab-3551dae7fa84</identification>

+      </annotationBean>

+      <date>2010-08-19 12:28:57.881 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>af1f698b-820d-4b35-a92e-9091c90b493e</identification>

+      </annotationBean>

+      <date>2011-02-22 09:30:17.881 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>be50375c-4f68-44aa-8604-9a80d8d97570</identification>

+      </annotationBean>

+      <date>2011-02-22 09:03:28.97 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eb6a550d-f34e-4de9-b0fc-1b3df8ab36c4</identification>

+      </annotationBean>

+      <date>2010-08-31 14:32:44.634 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ac70d4c0-5db9-48b1-ba32-8e11fff8ae59</identification>

+      </annotationBean>

+      <date>2011-02-22 08:31:32.90 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>78cb1427-d57f-42c2-a385-1d20c1580f3b</identification>

+      </annotationBean>

+      <date>2010-08-31 14:36:00.297 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>3b7c0b9c-572d-466b-af6d-0fb40699e8a5</identification>

+      </annotationBean>

+      <date>2010-08-31 12:50:40.306 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7a22acbb-2f0f-41dd-a526-d2a9b4e267c5</identification>

+      </annotationBean>

+      <date>2011-02-22 08:59:59.964 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>80c80b32-1faa-4c8e-9294-eb85d6aaa764</identification>

+      </annotationBean>

+      <date>2011-02-22 09:40:37.744 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>bc9c64da-9143-4811-a22e-657c92fcfe94</identification>

+      </annotationBean>

+      <date>2011-02-22 09:23:49.109 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c072030e-b367-4885-a770-7d892672d979</identification>

+      </annotationBean>

+      <date>2011-02-22 09:31:03.727 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7ef10e93-7376-41a9-9255-552149094142</identification>

+      </annotationBean>

+      <date>2010-08-31 13:06:57.536 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/localworker/inputs/in b/taverna-commandline-tests/src/test/resources/workflows/localworker/inputs/in
new file mode 100644
index 0000000..cadf8b6
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/localworker/inputs/in
@@ -0,0 +1 @@
+Tom
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/localworker/localworker.t2flow b/taverna-commandline-tests/src/test/resources/workflows/localworker/localworker.t2flow
new file mode 100644
index 0000000..b3b2053
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/localworker/localworker.t2flow
@@ -0,0 +1,67 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.2.0"><dataflow id="5eebce20-72f5-4ac7-a4bf-8086d59d0c9e" role="top"><name>Workflow5</name><inputPorts><port><name>in</name><depth>0</depth><granularDepth>0</granularDepth><annotations /></port></inputPorts><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Concatenate_two_strings</name><inputPorts><port><name>string2</name><depth>0</depth></port><port><name>string1</name><depth>0</depth></port></inputPorts><outputPorts><port><name>output</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>localworker-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.localworker.LocalworkerActivity</class><inputMap><map from="string2" to="string2" /><map from="string1" to="string1" /></inputMap><outputMap><map from="output" to="output" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean xmlns="">

+  <localworkerName>org.embl.ebi.escience.scuflworkers.java.StringConcat</localworkerName>

+  <script>output = string1 + string2;</script>

+  <dependencies />

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>string1</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>'text/plain'</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+      <name>string2</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>'text/plain'</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>output</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>'text/plain'</string>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="string2" depth="0" /><port name="string1" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>string1_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Hello </value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>Concatenate_two_strings</processor><port>string2</port></sink><source type="dataflow"><port>in</port></source></datalink><datalink><sink type="processor"><processor>Concatenate_two_strings</processor><port>string1</port></sink><source type="processor"><processor>string1_value</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Concatenate_two_strings</processor><port>output</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>5eebce20-72f5-4ac7-a4bf-8086d59d0c9e</identification>

+      </annotationBean>

+      <date>2011-02-21 13:44:43.621 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/rest/rest.t2flow b/taverna-commandline-tests/src/test/resources/workflows/rest/rest.t2flow
new file mode 100644
index 0000000..f3f90b8
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/rest/rest.t2flow
@@ -0,0 +1,154 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="8e36176a-2975-498b-93f7-f2beba774532" role="top"><name>Workflow11</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>REST_Service</name><inputPorts><port><name>id</name><depth>0</depth></port></inputPorts><outputPorts><port><name>responseBody</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>rest-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.rest.RESTActivity</class><inputMap><map from="id" to="id" /></inputMap><outputMap><map from="responseBody" to="responseBody" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean xmlns="">

+  <httpMethod>GET</httpMethod>

+  <urlSignature>http://www.uniprot.org/uniprot/{id}.xml</urlSignature>

+  <acceptsHeaderValue>text/plain</acceptsHeaderValue>

+  <contentTypeForUpdates>application/xml</contentTypeForUpdates>

+  <outgoingDataFormat>String</outgoingDataFormat>

+  <sendHTTPExpectRequestHeader>false</sendHTTPExpectRequestHeader>

+  <showRedirectionOutputPort>false</showRedirectionOutputPort>

+  <escapeParameters>true</escapeParameters>

+  <otherHTTPHeaders />

+  <activityInputs>

+    <entry>

+      <string>id</string>

+      <java-class>java.lang.String</java-class>

+    </entry>

+  </activityInputs>

+</net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="id" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>id_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>P12345</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>REST_Service</processor><port>id</port></sink><source type="processor"><processor>id_value</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>REST_Service</processor><port>responseBody</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>30c58a3d-4037-4b92-b7d6-3aea761bdada</identification>

+      </annotationBean>

+      <date>2011-11-02 08:52:32.796 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d090ff3c-c84d-461f-9027-ccd07fe0a352</identification>

+      </annotationBean>

+      <date>2011-11-02 10:09:35.558 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>1e2069a6-54c3-4e09-b639-c9bb27356eb9</identification>

+      </annotationBean>

+      <date>2011-11-02 09:59:38.235 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>f88604da-4047-4ab9-bd19-23cbbb8be88b</identification>

+      </annotationBean>

+      <date>2011-11-02 10:12:00.757 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8e36176a-2975-498b-93f7-f2beba774532</identification>

+      </annotationBean>

+      <date>2012-02-10 15:56:15.960 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b3887d66-e945-444d-820a-ddb5c1d6cecb</identification>

+      </annotationBean>

+      <date>2011-11-02 10:00:26.717 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>bbf68124-dbeb-482b-80c6-e461d264a98b</identification>

+      </annotationBean>

+      <date>2011-11-02 10:12:59.372 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c2802c60-cc0e-4bc0-b401-473476811e46</identification>

+      </annotationBean>

+      <date>2011-11-02 10:02:16.255 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d73137e0-8cfb-4536-849e-6d30b1b1f4dc</identification>

+      </annotationBean>

+      <date>2011-11-02 08:49:30.655 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>3f67a647-2d0e-4d7e-9937-5bde3d562fde</identification>

+      </annotationBean>

+      <date>2011-11-02 10:10:29.316 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>f76689f8-2629-4168-b0a6-e70c88acaca9</identification>

+      </annotationBean>

+      <date>2012-02-10 15:49:11.156 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-basic-authentication-https/secure-basic-authentication-https.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-basic-authentication-https/secure-basic-authentication-https.t2flow
new file mode 100644
index 0000000..0cbff10
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-basic-authentication-https/secure-basic-authentication-https.t2flow
@@ -0,0 +1,74 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3-SNAPSHOT-20110621T1150"><dataflow id="12203b36-f878-45f7-a16e-863e1bbc81b8" role="top"><name>Workflow18</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Service_protected_with_Basic_AuthN_and_HTTPS</name><inputPorts /><outputPorts><port><name>responseBody</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>rest-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.rest.RESTActivity</class><inputMap /><outputMap><map from="responseBody" to="responseBody" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean xmlns="">

+  <httpMethod>GET</httpMethod>

+  <urlSignature>https://heater.cs.man.ac.uk:7443/examples-basic-authentication/taverna-test-page.html</urlSignature>

+  <acceptsHeaderValue>text/plain</acceptsHeaderValue>

+  <contentTypeForUpdates>application/xml</contentTypeForUpdates>

+  <outgoingDataFormat>String</outgoingDataFormat>

+  <sendHTTPExpectRequestHeader>false</sendHTTPExpectRequestHeader>

+  <showRedirectionOutputPort>false</showRedirectionOutputPort>

+  <escapeParameters>true</escapeParameters>

+  <otherHTTPHeaders />

+  <activityInputs />

+</net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Service_protected_with_Basic_AuthN_and_HTTPS</processor><port>responseBody</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>adb25995-c890-40c7-b091-2c2512024864</identification>

+      </annotationBean>

+      <date>2010-11-29 10:35:54.270 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>12203b36-f878-45f7-a16e-863e1bbc81b8</identification>

+      </annotationBean>

+      <date>2010-11-29 15:35:51.711 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>837b1710-ff29-4eef-85a0-51fc76139364</identification>

+      </annotationBean>

+      <date>2010-11-22 14:15:20.380 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b7887959-6d6c-4466-8d15-16b4e20051db</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:43.484 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>388333c0-fd34-4571-ab0c-f67c10c2ed64</identification>

+      </annotationBean>

+      <date>2010-11-22 14:21:12.760 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-basic-authentication/secure-basic-authentication.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-basic-authentication/secure-basic-authentication.t2flow
new file mode 100644
index 0000000..998b69a
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-basic-authentication/secure-basic-authentication.t2flow
@@ -0,0 +1,74 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3-SNAPSHOT-20110621T1150"><dataflow id="6eca35ba-d7d4-43d9-8593-93eba828cc46" role="top"><name>Workflow18</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Service_protected_with_Basic_AuthN</name><inputPorts /><outputPorts><port><name>responseBody</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>rest-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.rest.RESTActivity</class><inputMap /><outputMap><map from="responseBody" to="responseBody" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean xmlns="">

+  <httpMethod>GET</httpMethod>

+  <urlSignature>http://heater.cs.man.ac.uk:7070/examples-basic-authentication/taverna-test-page.html</urlSignature>

+  <acceptsHeaderValue>text/plain</acceptsHeaderValue>

+  <contentTypeForUpdates>application/xml</contentTypeForUpdates>

+  <outgoingDataFormat>String</outgoingDataFormat>

+  <sendHTTPExpectRequestHeader>false</sendHTTPExpectRequestHeader>

+  <showRedirectionOutputPort>false</showRedirectionOutputPort>

+  <escapeParameters>true</escapeParameters>

+  <otherHTTPHeaders />

+  <activityInputs />

+</net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Service_protected_with_Basic_AuthN</processor><port>responseBody</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>837b1710-ff29-4eef-85a0-51fc76139364</identification>

+      </annotationBean>

+      <date>2010-11-22 14:15:20.380 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>6eca35ba-d7d4-43d9-8593-93eba828cc46</identification>

+      </annotationBean>

+      <date>2010-11-29 10:41:02.602 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>adb25995-c890-40c7-b091-2c2512024864</identification>

+      </annotationBean>

+      <date>2010-11-29 10:35:54.270 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b7887959-6d6c-4466-8d15-16b4e20051db</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:43.484 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>388333c0-fd34-4571-ab0c-f67c10c2ed64</identification>

+      </annotationBean>

+      <date>2010-11-22 14:21:12.760 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-client-cert-authentication-https/secure-client-cert-authentication-https.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-client-cert-authentication-https/secure-client-cert-authentication-https.t2flow
new file mode 100644
index 0000000..1c5d317
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-client-cert-authentication-https/secure-client-cert-authentication-https.t2flow
@@ -0,0 +1,162 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="b982dcd5-dc2a-4fc5-b6dd-8d0b90a2f58e" role="top"><name>Workflow18</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Service_protected_with_Client_Cert_AuthN_and_HTTPS</name><inputPorts /><outputPorts><port><name>responseBody</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>rest-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.rest.RESTActivity</class><inputMap /><outputMap><map from="responseBody" to="responseBody" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean xmlns="">

+  <httpMethod>GET</httpMethod>

+  <urlSignature>https://heater.cs.man.ac.uk:7444/examples-client-cert-authentication/taverna-test-page.html</urlSignature>

+  <acceptsHeaderValue>text/plain</acceptsHeaderValue>

+  <contentTypeForUpdates>application/xml</contentTypeForUpdates>

+  <outgoingDataFormat>String</outgoingDataFormat>

+  <sendHTTPExpectRequestHeader>false</sendHTTPExpectRequestHeader>

+  <showRedirectionOutputPort>false</showRedirectionOutputPort>

+  <escapeParameters>true</escapeParameters>

+  <otherHTTPHeaders />

+  <activityInputs />

+</net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Service_protected_with_Client_Cert_AuthN_and_HTTPS</processor><port>responseBody</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b982dcd5-dc2a-4fc5-b6dd-8d0b90a2f58e</identification>

+      </annotationBean>

+      <date>2011-06-23 11:14:45.626 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>23616693-e035-42e5-a52e-e1ddb0269d9c</identification>

+      </annotationBean>

+      <date>2011-06-21 15:49:05.979 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>47ad844e-df8e-4c65-803a-8a20c8197e8e</identification>

+      </annotationBean>

+      <date>2010-11-29 15:36:29.390 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>1f90ea89-a32f-41c1-b30c-2a5afd622984</identification>

+      </annotationBean>

+      <date>2010-11-22 14:20:41.517 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e7fb38b1-b3ec-4c47-a584-36c68eeda25e</identification>

+      </annotationBean>

+      <date>2010-11-22 14:19:49.664 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>837b1710-ff29-4eef-85a0-51fc76139364</identification>

+      </annotationBean>

+      <date>2010-11-22 14:15:20.380 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eaff435f-9025-429b-9a12-97fc94d90e73</identification>

+      </annotationBean>

+      <date>2010-11-22 14:18:46.551 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b7887959-6d6c-4466-8d15-16b4e20051db</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:43.484 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>5b302294-d370-4639-acb1-2a8452cc6d92</identification>

+      </annotationBean>

+      <date>2010-11-29 10:34:55.185 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d9be6132-9d40-43f6-bd0b-8d29dca1163b</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:58.860 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>18b60848-4715-4532-b50c-45539ca00b44</identification>

+      </annotationBean>

+      <date>2011-06-21 16:24:23.704 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b982dcd5-dc2a-4fc5-b6dd-8d0b90a2f58e</identification>

+      </annotationBean>

+      <date>2011-06-21 16:36:50.208 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>06a9fa6d-ba8d-4045-945b-a4a259a275e4</identification>

+      </annotationBean>

+      <date>2011-06-23 11:13:58.558 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-digest-authentication-https/secure-digest-authentication-https.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-digest-authentication-https/secure-digest-authentication-https.t2flow
new file mode 100644
index 0000000..5d2f893
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-digest-authentication-https/secure-digest-authentication-https.t2flow
@@ -0,0 +1,107 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3-SNAPSHOT-20110621T1150"><dataflow id="47ad844e-df8e-4c65-803a-8a20c8197e8e" role="top"><name>Workflow18</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Service_protected_with_Digest_AuthN_and_HTTPS</name><inputPorts /><outputPorts><port><name>responseBody</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>rest-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.rest.RESTActivity</class><inputMap /><outputMap><map from="responseBody" to="responseBody" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean xmlns="">

+  <httpMethod>GET</httpMethod>

+  <urlSignature>https://heater.cs.man.ac.uk:7443/examples-digest-authentication/taverna-test-page.html</urlSignature>

+  <acceptsHeaderValue>text/plain</acceptsHeaderValue>

+  <contentTypeForUpdates>application/xml</contentTypeForUpdates>

+  <outgoingDataFormat>String</outgoingDataFormat>

+  <sendHTTPExpectRequestHeader>false</sendHTTPExpectRequestHeader>

+  <showRedirectionOutputPort>false</showRedirectionOutputPort>

+  <escapeParameters>true</escapeParameters>

+  <otherHTTPHeaders />

+  <activityInputs />

+</net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Service_protected_with_Digest_AuthN_and_HTTPS</processor><port>responseBody</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b7887959-6d6c-4466-8d15-16b4e20051db</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:43.484 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eaff435f-9025-429b-9a12-97fc94d90e73</identification>

+      </annotationBean>

+      <date>2010-11-22 14:18:46.551 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d9be6132-9d40-43f6-bd0b-8d29dca1163b</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:58.860 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>1f90ea89-a32f-41c1-b30c-2a5afd622984</identification>

+      </annotationBean>

+      <date>2010-11-22 14:20:41.517 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e7fb38b1-b3ec-4c47-a584-36c68eeda25e</identification>

+      </annotationBean>

+      <date>2010-11-22 14:19:49.664 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>5b302294-d370-4639-acb1-2a8452cc6d92</identification>

+      </annotationBean>

+      <date>2010-11-29 10:34:55.185 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>837b1710-ff29-4eef-85a0-51fc76139364</identification>

+      </annotationBean>

+      <date>2010-11-22 14:15:20.380 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>47ad844e-df8e-4c65-803a-8a20c8197e8e</identification>

+      </annotationBean>

+      <date>2010-11-29 15:36:29.390 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-digest-authentication/secure-digest-authentication.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-digest-authentication/secure-digest-authentication.t2flow
new file mode 100644
index 0000000..449e9db
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-digest-authentication/secure-digest-authentication.t2flow
@@ -0,0 +1,129 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3-SNAPSHOT-20110621T1150"><dataflow id="a218f0b5-b675-4eed-b7a8-a5c63181ff3e" role="top"><name>Workflow18</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Service_protected_with_Digest_AuthN</name><inputPorts /><outputPorts><port><name>responseBody</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>rest-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.rest.RESTActivity</class><inputMap /><outputMap><map from="responseBody" to="responseBody" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean xmlns="">

+  <httpMethod>GET</httpMethod>

+  <urlSignature>http://heater.cs.man.ac.uk:7070/examples-digest-authentication/taverna-test-page.html</urlSignature>

+  <acceptsHeaderValue>text/plain</acceptsHeaderValue>

+  <contentTypeForUpdates>application/xml</contentTypeForUpdates>

+  <outgoingDataFormat>String</outgoingDataFormat>

+  <sendHTTPExpectRequestHeader>false</sendHTTPExpectRequestHeader>

+  <showRedirectionOutputPort>false</showRedirectionOutputPort>

+  <escapeParameters>true</escapeParameters>

+  <otherHTTPHeaders />

+  <activityInputs />

+</net.sf.taverna.t2.activities.rest.RESTActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Service_protected_with_Digest_AuthN</processor><port>responseBody</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b7887959-6d6c-4466-8d15-16b4e20051db</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:43.484 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d9be6132-9d40-43f6-bd0b-8d29dca1163b</identification>

+      </annotationBean>

+      <date>2010-11-22 14:16:58.860 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>837b1710-ff29-4eef-85a0-51fc76139364</identification>

+      </annotationBean>

+      <date>2010-11-22 14:15:20.380 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>1f90ea89-a32f-41c1-b30c-2a5afd622984</identification>

+      </annotationBean>

+      <date>2010-11-22 14:20:41.517 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e7fb38b1-b3ec-4c47-a584-36c68eeda25e</identification>

+      </annotationBean>

+      <date>2010-11-22 14:19:49.664 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eaff435f-9025-429b-9a12-97fc94d90e73</identification>

+      </annotationBean>

+      <date>2010-11-22 14:18:46.551 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>5b302294-d370-4639-acb1-2a8452cc6d92</identification>

+      </annotationBean>

+      <date>2010-11-29 10:34:55.185 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>fd59d61c-50f8-457b-a183-c162453b026b</identification>

+      </annotationBean>

+      <date>2010-11-29 15:29:08.570 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>435023d5-0063-4914-ae4c-28a7a031ec0d</identification>

+      </annotationBean>

+      <date>2010-11-29 10:40:30.468 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>a218f0b5-b675-4eed-b7a8-a5c63181ff3e</identification>

+      </annotationBean>

+      <date>2010-11-29 15:39:35.589 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-ws-https/secure-ws-https.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-ws-https/secure-ws-https.t2flow
new file mode 100644
index 0000000..13637c4
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-ws-https/secure-ws-https.t2flow
@@ -0,0 +1,180 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3-SNAPSHOT-20110621T1150"><dataflow id="c71621ca-196c-46cd-9073-48af82b4bd4f" role="top"><name>Workflow13</name><inputPorts /><outputPorts><port><name>out_plaintext</name><annotations /></port><port><name>out_plaintext_timestamp</name><annotations /></port><port><name>out_digest</name><annotations /></port><port><name>out_digest_timestamp</name><annotations /></port></outputPorts><processors><processor><name>hello_plaintext_password</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>https://heater.cs.man.ac.uk:7443/axis/services/HelloService-PlaintextPassword?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityUsernameTokenPlainTextPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Alan</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>hello_plaintext_password_timestamp</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>https://heater.cs.man.ac.uk:7443/axis/services/HelloService-PlaintextPassword-Timestamp?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityTimestampUsernameTokenPlainTextPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value_1</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Alex</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>hello_digest_password</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>https://heater.cs.man.ac.uk:7443/axis/services/HelloService-DigestPassword?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityUsernameTokenDigestPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value_2</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Stian</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>hello_digest_password_timestamp</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>https://heater.cs.man.ac.uk:7443/axis/services/HelloService-DigestPassword-Timestamp?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityTimestampUsernameTokenDigestPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value_3</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>David</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions><condition control="hello_plaintext_password" target="hello_digest_password" /><condition control="hello_digest_password_timestamp" target="hello_plaintext_password_timestamp" /><condition control="hello_digest_password" target="hello_digest_password_timestamp" /></conditions><datalinks><datalink><sink type="processor"><processor>hello_plaintext_password</processor><port>in0</port></sink><source type="processor"><processor>in0_value</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>hello_plaintext_password_timestamp</processor><port>in0</port></sink><source type="processor"><processor>in0_value_1</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>hello_digest_password</processor><port>in0</port></sink><source type="processor"><processor>in0_value_2</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>hello_digest_password_timestamp</processor><port>in0</port></sink><source type="processor"><processor>in0_value_3</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out_plaintext</port></sink><source type="processor"><processor>hello_plaintext_password</processor><port>helloReturn</port></source></datalink><datalink><sink type="dataflow"><port>out_plaintext_timestamp</port></sink><source type="processor"><processor>hello_plaintext_password_timestamp</processor><port>helloReturn</port></source></datalink><datalink><sink type="dataflow"><port>out_digest</port></sink><source type="processor"><processor>hello_digest_password</processor><port>helloReturn</port></source></datalink><datalink><sink type="dataflow"><port>out_digest_timestamp</port></sink><source type="processor"><processor>hello_digest_password_timestamp</processor><port>helloReturn</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c71621ca-196c-46cd-9073-48af82b4bd4f</identification>

+      </annotationBean>

+      <date>2011-06-21 12:11:30.87 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>56cadac0-c944-4b9e-83c3-078f57738405</identification>

+      </annotationBean>

+      <date>2011-01-21 16:02:09.633 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>3d76be4c-83c4-413b-91f2-b0ce69dcbd97</identification>

+      </annotationBean>

+      <date>2010-11-22 13:29:43.282 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ca8fb5c5-0e8c-4e68-84f0-bdc85a77e2b3</identification>

+      </annotationBean>

+      <date>2010-11-22 13:29:26.400 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e61023d9-d603-4df6-87e5-175603f106a5</identification>

+      </annotationBean>

+      <date>2010-11-22 13:28:31.68 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>394aced4-ee5d-4355-8ebe-9fc8bcfe5303</identification>

+      </annotationBean>

+      <date>2011-06-21 12:07:46.327 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8175c97b-6385-460a-98ab-5cf974010d51</identification>

+      </annotationBean>

+      <date>2010-11-22 12:11:59.610 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>a388d568-ca08-43b4-abaf-3744a6801d45</identification>

+      </annotationBean>

+      <date>2010-11-22 13:30:28.898 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7153a2dd-18bd-4f25-80ab-1efa8afc567d</identification>

+      </annotationBean>

+      <date>2011-01-21 16:02:39.43 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-ws/secure-ws.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-ws/secure-ws.t2flow
new file mode 100644
index 0000000..764b810
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-ws/secure-ws.t2flow
@@ -0,0 +1,180 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3-SNAPSHOT-20110621T1150"><dataflow id="c71621ca-196c-46cd-9073-48af82b4bd4f" role="top"><name>Workflow13</name><inputPorts /><outputPorts><port><name>out_plaintext</name><annotations /></port><port><name>out_plaintext_timestamp</name><annotations /></port><port><name>out_digest</name><annotations /></port><port><name>out_digest_timestamp</name><annotations /></port></outputPorts><processors><processor><name>hello_plaintext_password</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>http://heater.cs.man.ac.uk:7070/axis/services/HelloService-PlaintextPassword?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityUsernameTokenPlainTextPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Alan</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>hello_plaintext_password_timestamp</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>http://heater.cs.man.ac.uk:7070/axis/services/HelloService-PlaintextPassword-Timestamp?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityTimestampUsernameTokenPlainTextPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value_1</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Alex</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>hello_digest_password</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>http://heater.cs.man.ac.uk:7070/axis/services/HelloService-DigestPassword?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityUsernameTokenDigestPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value_2</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Stian</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>hello_digest_password_timestamp</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>http://heater.cs.man.ac.uk:7070/axis/services/HelloService-DigestPassword-Timestamp?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityTimestampUsernameTokenDigestPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value_3</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>David</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3-SNAPSHOT</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions><condition control="hello_plaintext_password" target="hello_digest_password" /><condition control="hello_digest_password_timestamp" target="hello_plaintext_password_timestamp" /><condition control="hello_digest_password" target="hello_digest_password_timestamp" /></conditions><datalinks><datalink><sink type="processor"><processor>hello_plaintext_password</processor><port>in0</port></sink><source type="processor"><processor>in0_value</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>hello_plaintext_password_timestamp</processor><port>in0</port></sink><source type="processor"><processor>in0_value_1</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>hello_digest_password</processor><port>in0</port></sink><source type="processor"><processor>in0_value_2</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>hello_digest_password_timestamp</processor><port>in0</port></sink><source type="processor"><processor>in0_value_3</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out_plaintext</port></sink><source type="processor"><processor>hello_plaintext_password</processor><port>helloReturn</port></source></datalink><datalink><sink type="dataflow"><port>out_plaintext_timestamp</port></sink><source type="processor"><processor>hello_plaintext_password_timestamp</processor><port>helloReturn</port></source></datalink><datalink><sink type="dataflow"><port>out_digest</port></sink><source type="processor"><processor>hello_digest_password</processor><port>helloReturn</port></source></datalink><datalink><sink type="dataflow"><port>out_digest_timestamp</port></sink><source type="processor"><processor>hello_digest_password_timestamp</processor><port>helloReturn</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c71621ca-196c-46cd-9073-48af82b4bd4f</identification>

+      </annotationBean>

+      <date>2011-06-21 12:11:30.87 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>56cadac0-c944-4b9e-83c3-078f57738405</identification>

+      </annotationBean>

+      <date>2011-01-21 16:02:09.633 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>3d76be4c-83c4-413b-91f2-b0ce69dcbd97</identification>

+      </annotationBean>

+      <date>2010-11-22 13:29:43.282 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ca8fb5c5-0e8c-4e68-84f0-bdc85a77e2b3</identification>

+      </annotationBean>

+      <date>2010-11-22 13:29:26.400 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e61023d9-d603-4df6-87e5-175603f106a5</identification>

+      </annotationBean>

+      <date>2010-11-22 13:28:31.68 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>394aced4-ee5d-4355-8ebe-9fc8bcfe5303</identification>

+      </annotationBean>

+      <date>2011-06-21 12:07:46.327 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8175c97b-6385-460a-98ab-5cf974010d51</identification>

+      </annotationBean>

+      <date>2010-11-22 12:11:59.610 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>a388d568-ca08-43b4-abaf-3744a6801d45</identification>

+      </annotationBean>

+      <date>2010-11-22 13:30:28.898 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7153a2dd-18bd-4f25-80ab-1efa8afc567d</identification>

+      </annotationBean>

+      <date>2011-01-21 16:02:39.43 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/secure-wsdl/secure-wsdl.t2flow b/taverna-commandline-tests/src/test/resources/workflows/secure-wsdl/secure-wsdl.t2flow
new file mode 100644
index 0000000..4db4ad5
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/secure-wsdl/secure-wsdl.t2flow
@@ -0,0 +1,131 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="b23a2149-976e-4e98-b120-e5b8580839ef" role="top"><name>Workflow13</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>hello_plaintext_password</name><inputPorts><port><name>in0</name><depth>0</depth></port></inputPorts><outputPorts><port><name>helloReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="in0" to="in0" /></inputMap><outputMap><map from="helloReturn" to="helloReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>http://heater.cs.man.ac.uk:7070/axis/services/HelloService-PlaintextPassword?wsdl</wsdl>

+  <operation>hello</operation>

+  <securityProfile>WSSecurityUsernameTokenPlainTextPassword</securityProfile>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in0" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in0_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Alan</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>hello_plaintext_password</processor><port>in0</port></sink><source type="processor"><processor>in0_value</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>hello_plaintext_password</processor><port>helloReturn</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>ca8fb5c5-0e8c-4e68-84f0-bdc85a77e2b3</identification>

+      </annotationBean>

+      <date>2010-11-22 13:29:26.400 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7153a2dd-18bd-4f25-80ab-1efa8afc567d</identification>

+      </annotationBean>

+      <date>2011-01-21 16:02:39.43 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>394aced4-ee5d-4355-8ebe-9fc8bcfe5303</identification>

+      </annotationBean>

+      <date>2011-06-21 12:07:46.327 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c71621ca-196c-46cd-9073-48af82b4bd4f</identification>

+      </annotationBean>

+      <date>2011-06-21 12:11:30.87 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8175c97b-6385-460a-98ab-5cf974010d51</identification>

+      </annotationBean>

+      <date>2010-11-22 12:11:59.610 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>56cadac0-c944-4b9e-83c3-078f57738405</identification>

+      </annotationBean>

+      <date>2011-01-21 16:02:09.633 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>a388d568-ca08-43b4-abaf-3744a6801d45</identification>

+      </annotationBean>

+      <date>2010-11-22 13:30:28.898 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b23a2149-976e-4e98-b120-e5b8580839ef</identification>

+      </annotationBean>

+      <date>2011-08-23 13:40:15.238 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>3d76be4c-83c4-413b-91f2-b0ce69dcbd97</identification>

+      </annotationBean>

+      <date>2010-11-22 13:29:43.282 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e61023d9-d603-4df6-87e5-175603f106a5</identification>

+      </annotationBean>

+      <date>2010-11-22 13:28:31.68 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/soaplab/soaplab.t2flow b/taverna-commandline-tests/src/test/resources/workflows/soaplab/soaplab.t2flow
new file mode 100644
index 0000000..f1ef82b
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/soaplab/soaplab.t2flow
@@ -0,0 +1,84 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.2.0"><dataflow id="db8053e3-1837-42cc-ba27-5fd0a83f119e" role="top"><name>Retrieve_sequence_in_EMBL_format</name><inputPorts /><outputPorts><port><name>sequence</name><annotations /></port></outputPorts><processors><processor><name>sequence_feature</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>true</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>sequence_id</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>embl:x52524</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>sequence_format</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>embl</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>seqret</name><inputPorts><port><name>sequence_usa</name><depth>0</depth></port><port><name>feature</name><depth>0</depth></port><port><name>osformat_outseq</name><depth>0</depth></port></inputPorts><outputPorts><port><name>outseq</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>soaplab-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.soaplab.SoaplabActivity</class><inputMap><map from="osformat_outseq" to="osformat_outseq" /><map from="feature" to="feature" /><map from="sequence_usa" to="sequence_usa" /></inputMap><outputMap><map from="outseq" to="outseq" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.soaplab.SoaplabActivityConfigurationBean xmlns="">

+  <endpoint>http://www.ebi.ac.uk/soaplab/services/edit.seqret</endpoint>

+  <pollingInterval>0</pollingInterval>

+  <pollingBackoff>1.0</pollingBackoff>

+  <pollingIntervalMax>0</pollingIntervalMax>

+</net.sf.taverna.t2.activities.soaplab.SoaplabActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="sequence_usa" depth="0" /><port name="feature" depth="0" /><port name="osformat_outseq" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>seqret</processor><port>sequence_usa</port></sink><source type="processor"><processor>sequence_id</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>seqret</processor><port>feature</port></sink><source type="processor"><processor>sequence_feature</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>seqret</processor><port>osformat_outseq</port></sink><source type="processor"><processor>sequence_format</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>sequence</port></sink><source type="processor"><processor>seqret</processor><port>outseq</port></source></datalink></datalinks><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.DescriptiveTitle">

+        <text>Retrieve sequence in EMBL format</text>

+      </annotationBean>

+      <date>2009-12-15 20:21:29.202 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.Author">

+        <text>Franck Tanoh</text>

+      </annotationBean>

+      <date>2009-12-15 20:21:20.965 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>db8053e3-1837-42cc-ba27-5fd0a83f119e</identification>

+      </annotationBean>

+      <date>2010-07-04 17:49:51.364 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription">

+        <text>This workflow retrieves a sequence associated with its features in embl format</text>

+      </annotationBean>

+      <date>2009-12-15 20:21:39.30 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/spreadsheetimport/spreadsheetimport.t2flow b/taverna-commandline-tests/src/test/resources/workflows/spreadsheetimport/spreadsheetimport.t2flow
new file mode 100644
index 0000000..7360186
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/spreadsheetimport/spreadsheetimport.t2flow
@@ -0,0 +1,646 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="fa4ef38e-fa3f-4662-97e5-59c3b51aa322" role="top"><name>Spreadsheet_Import_Example</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>SpreadsheetImport</name><inputPorts><port><name>fileurl</name><depth>0</depth></port></inputPorts><outputPorts><port><name>other</name><depth>1</depth><granularDepth>1</granularDepth></port><port><name>other_industry</name><depth>1</depth><granularDepth>1</granularDepth></port><port><name>year</name><depth>1</depth><granularDepth>1</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>spreadsheet-import-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.spreadsheet.SpreadsheetImportActivity</class><inputMap><map from="fileurl" to="fileurl" /></inputMap><outputMap><map from="other" to="other" /><map from="year" to="year" /><map from="other_industry" to="other_industry" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.spreadsheet.SpreadsheetImportConfiguration xmlns="">

+  <columnRange>

+    <start>1</start>

+    <end>6</end>

+    <excludes />

+  </columnRange>

+  <rowRange>

+    <start>7</start>

+    <end>41</end>

+    <excludes />

+  </rowRange>

+  <emptyCellValue />

+  <columnNames>

+    <entry>

+      <string>D</string>

+      <string>other</string>

+    </entry>

+    <entry>

+      <string>E</string>

+      <string>fish_farming</string>

+    </entry>

+    <entry>

+      <string>F</string>

+      <string>other_industry</string>

+    </entry>

+    <entry>

+      <string>G</string>

+      <string>public_water_supply</string>

+    </entry>

+    <entry>

+      <string>A</string>

+      <string>over</string>

+    </entry>

+    <entry>

+      <string>B</string>

+      <string>year</string>

+    </entry>

+    <entry>

+      <string>C</string>

+      <string>electricity</string>

+    </entry>

+    <entry>

+      <string>L</string>

+      <string>2001</string>

+    </entry>

+    <entry>

+      <string>N</string>

+      <string>2002</string>

+    </entry>

+    <entry>

+      <string>H</string>

+      <string>1999</string>

+    </entry>

+    <entry>

+      <string>J</string>

+      <string>2000</string>

+    </entry>

+    <entry>

+      <string>T</string>

+      <string>2005</string>

+    </entry>

+    <entry>

+      <string>V</string>

+      <string>2006</string>

+    </entry>

+    <entry>

+      <string>P</string>

+      <string>2003</string>

+    </entry>

+    <entry>

+      <string>R</string>

+      <string>2004</string>

+    </entry>

+    <entry>

+      <string>X</string>

+      <string>2007</string>

+    </entry>

+    <entry>

+      <string>Z</string>

+      <string>2008</string>

+    </entry>

+  </columnNames>

+  <allRows>false</allRows>

+  <excludeFirstRow>false</excludeFirstRow>

+  <ignoreBlankRows>false</ignoreBlankRows>

+  <emptyCellPolicy>EMPTY_STRING</emptyCellPolicy>

+  <outputFormat>PORT_PER_COLUMN</outputFormat>

+  <csvDelimiter>,</csvDelimiter>

+</net.sf.taverna.t2.activities.spreadsheet.SpreadsheetImportConfiguration></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="fileurl" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>url_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>http://www.myexperiment.org/files/410/download/WaterUse.xlsx</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>SpreadsheetImport</processor><port>fileurl</port></sink><source type="processor"><processor>url_value</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>SpreadsheetImport</processor><port>year</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>41265789-c464-4ee2-b145-95ece9388305</identification>

+      </annotationBean>

+      <date>2010-07-07 22:34:29.364 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>b4363407-ef56-4cf3-998f-8e780a8dc816</identification>

+      </annotationBean>

+      <date>2010-07-07 16:41:31.230 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>486a5356-0f3e-424d-b14e-249295875f2d</identification>

+      </annotationBean>

+      <date>2010-07-13 12:31:34.664 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.Author">

+        <text>David Withers</text>

+      </annotationBean>

+      <date>2010-07-13 11:09:24.988 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>cf60043b-e08a-49d7-a150-711f413d3d18</identification>

+      </annotationBean>

+      <date>2010-07-07 22:52:10.583 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>812e7abc-4866-43dc-b9d4-44370a399e4e</identification>

+      </annotationBean>

+      <date>2010-07-07 17:23:44.739 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>cca71cbe-6d97-4896-90c2-d91016f12882</identification>

+      </annotationBean>

+      <date>2010-07-07 22:45:31.148 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e28f14b3-e4ae-4d0b-893d-3a8400625069</identification>

+      </annotationBean>

+      <date>2010-07-07 16:10:13.994 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e263e793-b394-4a57-855e-13e69b8780c2</identification>

+      </annotationBean>

+      <date>2010-07-07 17:00:11.782 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>14724df6-fee6-4b24-8fbc-eeeeb3dc4e61</identification>

+      </annotationBean>

+      <date>2010-07-07 16:38:21.137 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>6622310c-9440-45a1-a051-729487b00b46</identification>

+      </annotationBean>

+      <date>2010-07-13 12:32:33.863 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d8b96d03-8431-4cc0-b032-51e0c32092d3</identification>

+      </annotationBean>

+      <date>2010-07-07 17:27:09.166 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>cee35c36-afaf-4093-bcc5-eaac292207f5</identification>

+      </annotationBean>

+      <date>2010-07-07 16:02:30.469 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>64b51b72-af09-4842-b034-293dee7a03ff</identification>

+      </annotationBean>

+      <date>2010-07-07 22:40:56.858 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>4462bd43-bcec-4aaf-83e5-64e111668a64</identification>

+      </annotationBean>

+      <date>2010-07-07 23:00:20.619 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>58b3ac31-cfb3-418a-85ae-1990b2883c35</identification>

+      </annotationBean>

+      <date>2010-07-07 22:57:04.585 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>980d729b-1ec7-492c-9dfd-ccb19f9e81a7</identification>

+      </annotationBean>

+      <date>2010-07-07 22:59:09.755 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>6d9b5609-37c3-4fb1-9eea-e6b70209427e</identification>

+      </annotationBean>

+      <date>2010-07-07 14:05:03.421 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>9a2e5f63-ee29-42f3-810e-dc54fa9dfe3c</identification>

+      </annotationBean>

+      <date>2010-07-07 16:59:16.81 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>fa4ef38e-fa3f-4662-97e5-59c3b51aa322</identification>

+      </annotationBean>

+      <date>2011-11-02 15:41:32.280 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>6f16e5e6-7e90-44af-9e7a-f63785e5408e</identification>

+      </annotationBean>

+      <date>2010-07-07 22:53:58.943 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d533c230-a40d-4f9b-9ad4-f4389d4a6f1f</identification>

+      </annotationBean>

+      <date>2010-07-07 16:00:00.482 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7d1166bd-dfa5-4675-918c-a880314302cb</identification>

+      </annotationBean>

+      <date>2010-07-07 16:04:08.606 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>23eec6e0-9a32-461c-bd90-ba03bdc49d41</identification>

+      </annotationBean>

+      <date>2010-07-07 17:25:28.613 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>464013e1-0699-4e1a-bac7-047576261b33</identification>

+      </annotationBean>

+      <date>2010-07-07 23:07:59.655 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8af7971d-f944-4f27-b62a-437be1b99d3c</identification>

+      </annotationBean>

+      <date>2010-07-07 16:07:29.140 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>a5bbe32f-ad20-4411-bc0e-d8f693e95493</identification>

+      </annotationBean>

+      <date>2010-07-07 22:55:54.366 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>30c2f2c6-dbd5-4e7a-9620-f6e8526fb9bc</identification>

+      </annotationBean>

+      <date>2010-07-07 23:04:59.33 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>9c2e4b9c-5f25-4416-8653-cd9198a9271e</identification>

+      </annotationBean>

+      <date>2010-07-13 11:19:30.143 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>c0753ab7-cd9d-400e-b483-048dcbaad5f9</identification>

+      </annotationBean>

+      <date>2010-07-07 16:36:44.391 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>99e82825-40e1-4fa9-8cf4-5348a8ff7b82</identification>

+      </annotationBean>

+      <date>2010-07-07 22:38:24.439 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>2c1532f6-0ba4-48ea-9bf4-3fd3e39c6289</identification>

+      </annotationBean>

+      <date>2010-07-07 14:00:56.585 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>92d8fa84-2553-4de1-bff5-7d2a9b53c58d</identification>

+      </annotationBean>

+      <date>2010-07-07 17:31:19.499 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>f0fe1955-23d6-41b7-b1af-b36d641429b4</identification>

+      </annotationBean>

+      <date>2010-07-07 17:24:52.98 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>47de0484-f703-40ab-b1f7-b0826495a00d</identification>

+      </annotationBean>

+      <date>2010-07-07 23:09:23.782 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>7ca4b117-111d-4605-826e-868d7d159b52</identification>

+      </annotationBean>

+      <date>2010-07-13 11:16:32.697 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>99c992df-d200-4cda-a973-c60be723e784</identification>

+      </annotationBean>

+      <date>2010-07-07 17:14:16.5 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>58a4da02-d1f0-41ce-9ace-8a62b49b62d7</identification>

+      </annotationBean>

+      <date>2010-07-13 11:22:26.72 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>a752e401-77c5-42ef-9bf8-a60aa8af73f5</identification>

+      </annotationBean>

+      <date>2010-07-07 22:50:42.557 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.DescriptiveTitle">

+        <text>Spreadsheet Import Example</text>

+      </annotationBean>

+      <date>2010-07-13 11:22:34.496 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>dfa2cd09-f53d-47f4-91cd-207ec2dc2c34</identification>

+      </annotationBean>

+      <date>2010-07-07 16:51:22.4 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>31ac21d6-7c10-48ff-b9b2-82cac03f55c9</identification>

+      </annotationBean>

+      <date>2010-07-07 22:43:05.458 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>70c23010-0b47-424e-a1ce-73c040c3d3c6</identification>

+      </annotationBean>

+      <date>2010-07-07 16:43:47.690 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.FreeTextDescription">

+        <text>Example using the SpreadsheetImport service to import data from an Excel spreadsheet.

+The workflow imports the file spreadsheet file WaterUse.xlsx and generates a graph from the date.

+The source data is from http://data.gov.uk/</text>

+      </annotationBean>

+      <date>2010-07-13 11:16:31.908 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>27965b7c-1a89-46ac-8c9b-a4c6bf9144f0</identification>

+      </annotationBean>

+      <date>2010-07-13 11:22:36.27 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>6c2a0ecf-5d91-4722-adf6-607c912ed54c</identification>

+      </annotationBean>

+      <date>2010-07-07 16:54:20.460 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>808e3725-2a08-4907-9706-fb7f0f08f62f</identification>

+      </annotationBean>

+      <date>2010-07-13 11:20:05.749 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>6e069c36-8d88-4017-96cf-c1fa87007777</identification>

+      </annotationBean>

+      <date>2010-07-07 16:20:48.694 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>73ce4e99-6b83-45d0-8605-896d6d48b7f0</identification>

+      </annotationBean>

+      <date>2010-07-07 17:01:14.713 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/stringconstant/stringconstant.t2flow b/taverna-commandline-tests/src/test/resources/workflows/stringconstant/stringconstant.t2flow
new file mode 100644
index 0000000..41266d0
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/stringconstant/stringconstant.t2flow
@@ -0,0 +1,32 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.2.0"><dataflow id="48c5c70e-ffde-4ff0-8508-015577ab263c" role="top"><name>Workflow1</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>String_constant</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Test Value</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>String_constant</processor><port>value</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>48c5c70e-ffde-4ff0-8508-015577ab263c</identification>

+      </annotationBean>

+      <date>2010-12-14 11:57:31.126 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>186f09f7-d9a7-4ae2-bf84-8ee83f41f4e3</identification>

+      </annotationBean>

+      <date>2010-12-14 11:56:50.253 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/tool/tool.t2flow b/taverna-commandline-tests/src/test/resources/workflows/tool/tool.t2flow
new file mode 100644
index 0000000..d77a851
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/tool/tool.t2flow
@@ -0,0 +1,158 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="82a5216a-8b82-41db-a114-ece396f9b85c" role="top"><name>Workflow4</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>Tool</name><inputPorts><port><name>in1</name><depth>0</depth></port><port><name>in2</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>external-tool-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.externaltool.ExternalToolActivity</class><inputMap><map from="in2" to="in2" /><map from="in1" to="in1" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean xmlns="">

+  <mechanismType>789663B8-DA91-428A-9F7D-B3F3DA185FD4</mechanismType>

+  <mechanismName>default local</mechanismName>

+  <mechanismXML>&lt;?xml version="1.0" encoding="UTF-8"?&gt;&#xD;

+&lt;localInvocation&gt;&lt;shellPrefix&gt;/bin/sh -c&lt;/shellPrefix&gt;&lt;linkCommand&gt;/bin/ln -s %%PATH_TO_ORIGINAL%% %%TARGET_NAME%%&lt;/linkCommand&gt;&lt;/localInvocation&gt;&#xD;

+</mechanismXML>

+  <externaltoolid>607ceaee-59ba-4cbb-a650-84e51d8498e3</externaltoolid>

+  <useCaseDescription>

+    <usecaseid />

+    <description />

+    <command>cat in1 &gt; out; echo %%in2%% &gt;&gt; out

+ </command>

+    <preparingTimeoutInSeconds>1200</preparingTimeoutInSeconds>

+    <executionTimeoutInSeconds>1800</executionTimeoutInSeconds>

+    <tags>

+      <string>in2</string>

+    </tags>

+    <REs />

+    <queue__preferred />

+    <queue__deny />

+    <static__inputs>

+      <de.uni__luebeck.inb.knowarc.usecases.ScriptInputStatic>

+        <tag>hi</tag>

+        <file>true</file>

+        <tempFile>false</tempFile>

+        <binary>false</binary>

+        <charsetName>MacRoman</charsetName>

+        <forceCopy>false</forceCopy>

+        <content class="string">hi</content>

+      </de.uni__luebeck.inb.knowarc.usecases.ScriptInputStatic>

+      <de.uni__luebeck.inb.knowarc.usecases.ScriptInputStatic>

+        <tag>google</tag>

+        <file>true</file>

+        <tempFile>false</tempFile>

+        <binary>false</binary>

+        <charsetName>MacRoman</charsetName>

+        <forceCopy>false</forceCopy>

+        <url>http://www.google.com/</url>

+      </de.uni__luebeck.inb.knowarc.usecases.ScriptInputStatic>

+    </static__inputs>

+    <inputs>

+      <entry>

+        <string>in2</string>

+        <de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>

+          <tag>in2</tag>

+          <file>false</file>

+          <tempFile>false</tempFile>

+          <binary>false</binary>

+          <charsetName>MacRoman</charsetName>

+          <forceCopy>false</forceCopy>

+          <list>false</list>

+          <concatenate>false</concatenate>

+          <mime />

+        </de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>

+      </entry>

+      <entry>

+        <string>in1</string>

+        <de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>

+          <tag>in1</tag>

+          <file>true</file>

+          <tempFile>false</tempFile>

+          <binary>false</binary>

+          <charsetName>MacRoman</charsetName>

+          <forceCopy>false</forceCopy>

+          <list>false</list>

+          <concatenate>false</concatenate>

+          <mime />

+        </de.uni__luebeck.inb.knowarc.usecases.ScriptInputUser>

+      </entry>

+    </inputs>

+    <outputs>

+      <entry>

+        <string>out</string>

+        <de.uni__luebeck.inb.knowarc.usecases.ScriptOutput>

+          <path>out</path>

+          <binary>false</binary>

+          <mime />

+        </de.uni__luebeck.inb.knowarc.usecases.ScriptOutput>

+      </entry>

+    </outputs>

+    <includeStdIn>false</includeStdIn>

+    <includeStdOut>true</includeStdOut>

+    <includeStdErr>true</includeStdErr>

+    <validReturnCodes>

+      <int>0</int>

+    </validReturnCodes>

+  </useCaseDescription>

+  <edited>false</edited>

+</net.sf.taverna.t2.activities.externaltool.ExternalToolActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="in1" depth="0" /><port name="in2" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>in_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Hello</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>in2_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>World</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>Tool</processor><port>in1</port></sink><source type="processor"><processor>in_value</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>Tool</processor><port>in2</port></sink><source type="processor"><processor>in2_value</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Tool</processor><port>out</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>6090defe-8eba-4775-8dd6-ab48813d23ab</identification>

+      </annotationBean>

+      <date>2011-10-27 18:50:36.777 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8312a5c9-b291-4a20-a468-0cdd8888115b</identification>

+      </annotationBean>

+      <date>2011-10-27 18:46:58.794 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>82a5216a-8b82-41db-a114-ece396f9b85c</identification>

+      </annotationBean>

+      <date>2011-11-10 17:19:20.269 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>436555c3-0df8-4e5c-93f3-313124bf045c</identification>

+      </annotationBean>

+      <date>2011-10-27 18:52:22.981 BST</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/wsdl/wsdl.t2flow b/taverna-commandline-tests/src/test/resources/workflows/wsdl/wsdl.t2flow
new file mode 100644
index 0000000..4dea6bb
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/wsdl/wsdl.t2flow
@@ -0,0 +1,22 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.2.0"><dataflow id="eed49d32-8563-45ff-8716-347b20800129" role="top"><name>Workflow5</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>getVersion</name><inputPorts /><outputPorts><port><name>getVersionReturn</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap /><outputMap><map from="getVersionReturn" to="getVersionReturn" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>http://www.mygrid.org.uk/axis/services/Version?wsdl</wsdl>

+  <operation>getVersion</operation>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>getVersion</processor><port>getVersionReturn</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eed49d32-8563-45ff-8716-347b20800129</identification>

+      </annotationBean>

+      <date>2011-01-25 16:37:45.583 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/age b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/age
new file mode 100644
index 0000000..b5045cc
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/age
@@ -0,0 +1 @@
+21
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/firstName b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/firstName
new file mode 100644
index 0000000..08df4e7
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/firstName
@@ -0,0 +1 @@
+John
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/lastName b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/lastName
new file mode 100644
index 0000000..b77017e
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/inputs/lastName
@@ -0,0 +1 @@
+Smith
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/xmlSplitter.t2flow b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/xmlSplitter.t2flow
new file mode 100644
index 0000000..bd0875d
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/xmlSplitter/xmlSplitter.t2flow
@@ -0,0 +1,339 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.2.0"><dataflow id="52ddd8d4-d1fc-4b62-932a-288df52b77cf" role="top"><name>Workflow1</name><inputPorts><port><name>lastName</name><depth>0</depth><granularDepth>0</granularDepth><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.ExampleValue">

+        <text>Smith</text>

+      </annotationBean>

+      <date>2011-02-17 10:48:23.657 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations></port><port><name>firstName</name><depth>0</depth><granularDepth>0</granularDepth><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.ExampleValue">

+        <text>John</text>

+      </annotationBean>

+      <date>2011-02-17 10:48:16.703 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations></port><port><name>age</name><depth>0</depth><granularDepth>0</granularDepth><annotations><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.ExampleValue">

+        <text>John</text>

+      </annotationBean>

+      <date>2011-02-17 10:47:56.513 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain><annotation_chain encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.ExampleValue">

+        <text>21</text>

+      </annotationBean>

+      <date>2011-02-17 10:48:30.905 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain></annotations></port></inputPorts><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>personToString</name><inputPorts><port><name>parameters</name><depth>0</depth></port></inputPorts><outputPorts><port><name>parameters</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.wsdl.WSDLActivity</class><inputMap><map from="parameters" to="parameters" /></inputMap><outputMap><map from="parameters" to="parameters" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean xmlns="">

+  <wsdl>http://www.mygrid.org.uk/menagerie/xfire/Complex-dlw?wsdl</wsdl>

+  <operation>personToString</operation>

+</net.sf.taverna.t2.activities.wsdl.WSDLActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="parameters" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>personToString_output</name><inputPorts><port><name>input</name><depth>0</depth></port></inputPorts><outputPorts><port><name>out</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLOutputSplitterActivity</class><inputMap><map from="input" to="input" /></inputMap><outputMap><map from="out" to="out" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean xmlns="">

+  <wrappedTypeXML>&lt;s:extensions xmlns:s="http://org.embl.ebi.escience/xscufl/0.1alpha"&gt;&lt;s:complextype optional="false" unbounded="false" typename="personToStringResponse" name="parameters" qname="{http://xfire.codehaus.org/BookService}personToStringResponse"&gt;&lt;s:elements&gt;&lt;s:basetype optional="false" unbounded="false" typename="string" name="out" qname="{http://xfire.codehaus.org/BookService}&amp;gt;personToStringResponse&amp;gt;out" /&gt;&lt;/s:elements&gt;&lt;/s:complextype&gt;&lt;/s:extensions&gt;</wrappedTypeXML>

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>input</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/xml'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>out</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/plain'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="input" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>personToString_input</name><inputPorts><port><name>person</name><depth>0</depth></port></inputPorts><outputPorts><port><name>output</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLInputSplitterActivity</class><inputMap><map from="person" to="person" /></inputMap><outputMap><map from="output" to="output" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean xmlns="">

+  <wrappedTypeXML>&lt;s:extensions xmlns:s="http://org.embl.ebi.escience/xscufl/0.1alpha"&gt;&lt;s:complextype optional="false" unbounded="false" typename="personToString" name="parameters" qname="{http://xfire.codehaus.org/BookService}personToString"&gt;&lt;s:elements&gt;&lt;s:complextype optional="false" unbounded="false" typename="Person" name="person" qname="{http://xfire.codehaus.org/BookService}&amp;gt;personToString&amp;gt;person"&gt;&lt;s:elements&gt;&lt;s:complextype optional="true" unbounded="false" typename="Address" name="address" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;address"&gt;&lt;s:elements&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="city" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;city" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="road" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;road" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="int" name="roadNumber" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;roadNumber" /&gt;&lt;/s:elements&gt;&lt;/s:complextype&gt;&lt;s:basetype optional="true" unbounded="false" typename="int" name="age" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;age" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="firstName" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;firstName" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="lastName" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;lastName" /&gt;&lt;/s:elements&gt;&lt;/s:complextype&gt;&lt;/s:elements&gt;&lt;/s:complextype&gt;&lt;/s:extensions&gt;</wrappedTypeXML>

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>person</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/xml'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>output</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/xml'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="person" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>personToString_person</name><inputPorts><port><name>lastName</name><depth>0</depth></port><port><name>firstName</name><depth>0</depth></port><port><name>age</name><depth>0</depth></port><port><name>address</name><depth>0</depth></port></inputPorts><outputPorts><port><name>output</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLInputSplitterActivity</class><inputMap><map from="lastName" to="lastName" /><map from="address" to="address" /><map from="age" to="age" /><map from="firstName" to="firstName" /></inputMap><outputMap><map from="output" to="output" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean xmlns="">

+  <wrappedTypeXML>&lt;s:extensions xmlns:s="http://org.embl.ebi.escience/xscufl/0.1alpha"&gt;&lt;s:complextype optional="false" unbounded="false" typename="Person" name="person" qname="{http://xfire.codehaus.org/BookService}&amp;gt;personToString&amp;gt;person"&gt;&lt;s:elements&gt;&lt;s:complextype optional="true" unbounded="false" typename="Address" name="address" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;address"&gt;&lt;s:elements&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="city" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;city" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="road" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;road" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="int" name="roadNumber" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;roadNumber" /&gt;&lt;/s:elements&gt;&lt;/s:complextype&gt;&lt;s:basetype optional="true" unbounded="false" typename="int" name="age" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;age" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="firstName" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;firstName" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="lastName" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;lastName" /&gt;&lt;/s:elements&gt;&lt;/s:complextype&gt;&lt;/s:extensions&gt;</wrappedTypeXML>

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>address</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/xml'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>age</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/plain'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>firstName</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/plain'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>lastName</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/plain'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>output</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/xml'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="lastName" depth="0" /><port name="firstName" depth="0" /><port name="age" depth="0" /><port name="address" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>person_address</name><inputPorts><port><name>city</name><depth>0</depth></port><port><name>road</name><depth>0</depth></port><port><name>roadNumber</name><depth>0</depth></port></inputPorts><outputPorts><port><name>output</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>wsdl-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLInputSplitterActivity</class><inputMap><map from="road" to="road" /><map from="roadNumber" to="roadNumber" /><map from="city" to="city" /></inputMap><outputMap><map from="output" to="output" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean xmlns="">

+  <wrappedTypeXML>&lt;s:extensions xmlns:s="http://org.embl.ebi.escience/xscufl/0.1alpha"&gt;&lt;s:complextype optional="true" unbounded="false" typename="Address" name="address" qname="{http://complex.pojo.axis2.menagerie.googlecode}Person&amp;gt;address"&gt;&lt;s:elements&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="city" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;city" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="string" name="road" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;road" /&gt;&lt;s:basetype optional="true" unbounded="false" typename="int" name="roadNumber" qname="{http://complex.pojo.axis2.menagerie.googlecode}Address&amp;gt;roadNumber" /&gt;&lt;/s:elements&gt;&lt;/s:complextype&gt;&lt;/s:extensions&gt;</wrappedTypeXML>

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>city</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/plain'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>road</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/plain'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <allowsLiteralValues>false</allowsLiteralValues>

+      <name>roadNumber</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/plain'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <granularDepth>0</granularDepth>

+      <name>output</name>

+      <depth>0</depth>

+      <mimeTypes class="java.util.Collections$SingletonList">

+        <element class="string">'text/xml'</element>

+      </mimeTypes>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+</net.sf.taverna.t2.activities.wsdl.xmlsplitter.XMLSplitterConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="city" depth="0" /><port name="road" depth="0" /><port name="roadNumber" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>city_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Manchester</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>road_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>Oxford Road</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>roadNumber_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>40</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.2</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>personToString</processor><port>parameters</port></sink><source type="processor"><processor>personToString_input</processor><port>output</port></source></datalink><datalink><sink type="processor"><processor>personToString_output</processor><port>input</port></sink><source type="processor"><processor>personToString</processor><port>parameters</port></source></datalink><datalink><sink type="processor"><processor>personToString_input</processor><port>person</port></sink><source type="processor"><processor>personToString_person</processor><port>output</port></source></datalink><datalink><sink type="processor"><processor>personToString_person</processor><port>lastName</port></sink><source type="dataflow"><port>lastName</port></source></datalink><datalink><sink type="processor"><processor>personToString_person</processor><port>firstName</port></sink><source type="dataflow"><port>firstName</port></source></datalink><datalink><sink type="processor"><processor>personToString_person</processor><port>age</port></sink><source type="dataflow"><port>age</port></source></datalink><datalink><sink type="processor"><processor>personToString_person</processor><port>address</port></sink><source type="processor"><processor>person_address</processor><port>output</port></source></datalink><datalink><sink type="processor"><processor>person_address</processor><port>city</port></sink><source type="processor"><processor>city_value</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>person_address</processor><port>road</port></sink><source type="processor"><processor>road_value</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>person_address</processor><port>roadNumber</port></sink><source type="processor"><processor>roadNumber_value</processor><port>value</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>personToString_output</processor><port>out</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>d79eeb60-919e-4076-af14-70ac4d605bec</identification>

+      </annotationBean>

+      <date>2011-02-17 10:49:46.785 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>52ddd8d4-d1fc-4b62-932a-288df52b77cf</identification>

+      </annotationBean>

+      <date>2011-02-17 10:53:16.981 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>8815f1ea-2659-4b7e-a90e-787c6a3c4ad6</identification>

+      </annotationBean>

+      <date>2011-02-17 10:29:40.492 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>eee0128a-4afe-4566-851a-fe50dcb36340</identification>

+      </annotationBean>

+      <date>2011-02-17 10:48:35.150 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>e64ae430-dd6e-468d-b3dd-de1fea9c717b</identification>

+      </annotationBean>

+      <date>2011-02-17 10:20:55.279 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>2aa76794-f001-42f9-b945-797badfeebb1</identification>

+      </annotationBean>

+      <date>2011-02-17 10:17:24.893 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>2ece2565-7498-4154-9d61-996d8a1db5f3</identification>

+      </annotationBean>

+      <date>2011-02-17 10:24:47.509 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>97fbd479-a423-4e8c-9033-bfc28f1a7885</identification>

+      </annotationBean>

+      <date>2011-02-17 10:42:59.63 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>24e8b191-9f48-4864-82be-d9578f1b8450</identification>

+      </annotationBean>

+      <date>2011-02-17 10:25:38.788 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file
diff --git a/taverna-commandline-tests/src/test/resources/workflows/xpath/xpath.t2flow b/taverna-commandline-tests/src/test/resources/workflows/xpath/xpath.t2flow
new file mode 100644
index 0000000..0691ccc
--- /dev/null
+++ b/taverna-commandline-tests/src/test/resources/workflows/xpath/xpath.t2flow
@@ -0,0 +1,127 @@
+<workflow xmlns="http://taverna.sf.net/2008/xml/t2flow" version="1" producedBy="taverna-2.3.0"><dataflow id="9fb6e3ea-f314-4f9f-8eb3-ba3dbf2b494f" role="top"><name>Workflow1</name><inputPorts /><outputPorts><port><name>out</name><annotations /></port></outputPorts><processors><processor><name>XPath_Service</name><inputPorts><port><name>xml_text</name><depth>0</depth></port></inputPorts><outputPorts><port><name>nodelistAsXML</name><depth>1</depth><granularDepth>1</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>xpath-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.xpath.XPathActivity</class><inputMap><map from="xml_text" to="xml_text" /></inputMap><outputMap><map from="nodelistAsXML" to="nodelistAsXML" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.xpath.XPathActivityConfigurationBean xmlns="">

+  <xmlDocument>&lt;?xml version="1.0" encoding="UTF-8"?&gt;

+&lt;test name="test-name"&gt;

+&lt;test-element&gt;test&lt;/test-element&gt;

+&lt;/test&gt;</xmlDocument>

+  <xpathExpression>/test/test-element</xpathExpression>

+  <xpathNamespaceMap />

+</net.sf.taverna.t2.activities.xpath.XPathActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="xml_text" depth="0" /></cross></strategy></iteration></iterationStrategyStack></processor><processor><name>xml_text_value</name><inputPorts /><outputPorts><port><name>value</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>stringconstant-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.stringconstant.StringConstantActivity</class><inputMap /><outputMap><map from="value" to="value" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean xmlns="">

+  <value>&lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;test name="test-name"&gt; &lt;test-element&gt;test&lt;/test-element&gt; &lt;/test&gt;</value>

+</net.sf.taverna.t2.activities.stringconstant.StringConstantConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy /></iteration></iterationStrategyStack></processor><processor><name>Merge_String_List_to_a_String</name><inputPorts><port><name>stringlist</name><depth>1</depth></port></inputPorts><outputPorts><port><name>concatenated</name><depth>0</depth><granularDepth>0</granularDepth></port></outputPorts><annotations /><activities><activity><raven><group>net.sf.taverna.t2.activities</group><artifact>localworker-activity</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.activities.localworker.LocalworkerActivity</class><inputMap><map from="stringlist" to="stringlist" /></inputMap><outputMap><map from="concatenated" to="concatenated" /></outputMap><configBean encoding="xstream"><net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean xmlns="">

+  <inputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <name>stringlist</name>

+      <depth>1</depth>

+      <mimeTypes>

+        <string>l('text/plain')</string>

+      </mimeTypes>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+      <name>seperator</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>'text/plain'</string>

+      </mimeTypes>

+      <handledReferenceSchemes />

+      <translatedElementType>java.lang.String</translatedElementType>

+      <allowsLiteralValues>true</allowsLiteralValues>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityInputPortDefinitionBean>

+  </inputs>

+  <outputs>

+    <net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+      <name>concatenated</name>

+      <depth>0</depth>

+      <mimeTypes>

+        <string>'text/plain'</string>

+      </mimeTypes>

+      <granularDepth>0</granularDepth>

+    </net.sf.taverna.t2.workflowmodel.processor.activity.config.ActivityOutputPortDefinitionBean>

+  </outputs>

+  <classLoaderSharing>workflow</classLoaderSharing>

+  <localDependencies />

+  <artifactDependencies />

+  <script>String seperatorString = "\n";

+if (seperator != void) {

+	seperatorString = seperator;

+}

+StringBuffer sb = new StringBuffer();

+for (Iterator i = stringlist.iterator(); i.hasNext();) {

+	String item = (String) i.next();

+	sb.append(item);

+	if (i.hasNext()) {

+		sb.append(seperatorString);

+	}

+}

+concatenated = sb.toString();

+</script>

+  <dependencies />

+  <localworkerName>org.embl.ebi.escience.scuflworkers.java.StringListMerge</localworkerName>

+</net.sf.taverna.t2.activities.localworker.LocalworkerActivityConfigurationBean></configBean><annotations /></activity></activities><dispatchStack><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Parallelize</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig xmlns="">

+  <maxJobs>1</maxJobs>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ParallelizeConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.ErrorBounce</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Failover</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Retry</class><configBean encoding="xstream"><net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig xmlns="">

+  <backoffFactor>1.0</backoffFactor>

+  <initialDelay>1000</initialDelay>

+  <maxDelay>5000</maxDelay>

+  <maxRetries>0</maxRetries>

+</net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.RetryConfig></configBean></dispatchLayer><dispatchLayer><raven><group>net.sf.taverna.t2.core</group><artifact>workflowmodel-impl</artifact><version>1.3</version></raven><class>net.sf.taverna.t2.workflowmodel.processor.dispatch.layers.Invoke</class><configBean encoding="xstream"><null xmlns="" /></configBean></dispatchLayer></dispatchStack><iterationStrategyStack><iteration><strategy><cross><port name="stringlist" depth="1" /></cross></strategy></iteration></iterationStrategyStack></processor></processors><conditions /><datalinks><datalink><sink type="processor"><processor>XPath_Service</processor><port>xml_text</port></sink><source type="processor"><processor>xml_text_value</processor><port>value</port></source></datalink><datalink><sink type="processor"><processor>Merge_String_List_to_a_String</processor><port>stringlist</port></sink><source type="processor"><processor>XPath_Service</processor><port>nodelistAsXML</port></source></datalink><datalink><sink type="dataflow"><port>out</port></sink><source type="processor"><processor>Merge_String_List_to_a_String</processor><port>concatenated</port></source></datalink></datalinks><annotations><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>9fb6e3ea-f314-4f9f-8eb3-ba3dbf2b494f</identification>

+      </annotationBean>

+      <date>2011-11-03 14:17:32.152 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>bed5342f-45e0-4fc9-a85d-bcd1ea01e33d</identification>

+      </annotationBean>

+      <date>2011-11-03 12:55:28.941 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>9f0cedc9-4a53-4564-aeb5-d0b7f7b2b4e1</identification>

+      </annotationBean>

+      <date>2011-11-03 12:56:36.620 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2><annotation_chain_2_2 encoding="xstream"><net.sf.taverna.t2.annotation.AnnotationChainImpl xmlns="">

+  <annotationAssertions>

+    <net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+      <annotationBean class="net.sf.taverna.t2.annotation.annotationbeans.IdentificationAssertion">

+        <identification>94104add-ec12-4c5a-a4f6-b5c1b6d0a700</identification>

+      </annotationBean>

+      <date>2011-11-03 12:56:00.6 GMT</date>

+      <creators />

+      <curationEventList />

+    </net.sf.taverna.t2.annotation.AnnotationAssertionImpl>

+  </annotationAssertions>

+</net.sf.taverna.t2.annotation.AnnotationChainImpl></annotation_chain_2_2></annotations></dataflow></workflow>
\ No newline at end of file